|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx, ^# N5 z. W; }/ n* X( H' a
input mcasp_ahclkx,
& o. W X# O: t" \input mcasp_aclkx,+ v4 m q* g @6 k; A4 v% k
input axr0,
6 @2 e5 W; z; u$ x+ N, w. z2 O) t: g$ ]
output mcasp_afsr,
7 U8 l2 N! V7 B: a5 Youtput mcasp_ahclkr,6 ]( [! x" {3 `5 ]) p. c8 b
output mcasp_aclkr,
: h) e8 t. B6 m, p& N: ^ woutput axr1,
7 o+ d5 J; q, Z2 u assign mcasp_afsr = mcasp_afsx;& Q4 H, x3 q. I3 F% Q* s$ h1 ~5 p m
assign mcasp_aclkr = mcasp_aclkx;
0 X/ f* W4 y8 s" M+ I2 r. }assign mcasp_ahclkr = mcasp_ahclkx;0 G9 i# x* o8 S' ^. X
assign axr1 = axr0; 4 D4 ?. r* c% X1 {! F5 n
1 w( E, J- I" E8 B- K# y P4 K% B( T
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# \% t- h$ X! }) ?/ M- Z7 }- Fstatic void McASPI2SConfigure(void)4 i) w$ G( Z/ L9 H5 m9 M6 P
{5 _4 j: @2 g1 ]! M2 I
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 L! B$ e2 q% x5 b9 r: C# K& o5 {McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
# p) N$ H1 }' C; S" ?McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 L6 Y1 E. T ~. Z
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
5 ?. E+ ]* K/ o6 B; CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' L2 S1 a) U7 v4 t( @5 {' }1 P) |
MCASP_RX_MODE_DMA);) a7 a( M+ \3 V, _6 A& J
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 w0 m' I1 _/ k8 y) G% SMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% G; i1 y, ^. Q0 G$ F/ x3 X# \McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! D* }- }! A' ~MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, \& z4 K5 z# q5 s: ?; D/ Y8 T# xMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# O" S3 n+ X, \7 N8 r1 \MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" N6 V" g4 Y5 ^! i
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! H& \7 W7 o8 Q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - w$ b- Y, u T u4 E' ~
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, d2 z7 O! F; i# y9 \. |
0x00, 0xFF); /* configure the clock for transmitter */; _/ Q* m; M) x
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- ]; R6 K6 W" x8 zMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. Y4 R8 L- k' T3 B3 sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ w4 { G" y& \ g, Y0x00, 0xFF);2 F9 Y1 X: O7 t
' g% I, K( J ^9 f3 Z
/* Enable synchronization of RX and TX sections */ : G" Z. q% `4 a4 {& k l
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
' X t4 k8 X. {- G) @McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 w$ P$ V$ H; {% kMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
3 D3 ~6 ?, M+ f5 q, v2 F8 }** Set the serializers, Currently only one serializer is set as
; X$ n% T* N6 B! _7 X1 a** transmitter and one serializer as receiver.
; r# o( m4 e( ?6 V*/
' q% c! N7 I( r8 O) m0 S( \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 ~( H9 Z3 P& p/ x( MMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*: F2 x( ?* S5 @. l9 c. B/ b5 ^
** Configure the McASP pins $ y' B' w5 j* t5 t, w3 E3 K
** Input - Frame Sync, Clock and Serializer Rx& V. C0 U1 C) B) J6 C, y" F1 b7 e
** Output - Serializer Tx is connected to the input of the codec
5 T6 v# u0 M$ a8 Q' `6 }, k# F*/, M b$ {9 I( ^: L
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 C! A9 T* R0 @) [! w% R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* e# n* X3 e% ~; n9 ^' Y3 O+ l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: w" G/ w/ }2 ]( j2 o/ `* \/ C
| MCASP_PIN_ACLKX
' D( ~2 I l* X& K| MCASP_PIN_AHCLKX) k& v- k8 S0 F) z% H
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */ \# O: e. M% N, |( b. ~, X# W
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 i* j( J5 |/ U' ]. m0 ]+ ?, S8 j
| MCASP_TX_CLKFAIL ' e. D6 P' y2 v3 r
| MCASP_TX_SYNCERROR- A5 J9 s4 K! @5 F5 n8 b) L! M
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 g \7 Q3 T6 l5 d" Q4 N| MCASP_RX_CLKFAIL
- M2 z) ?3 H) Y# ]. P4 d$ S7 l+ c% a| MCASP_RX_SYNCERROR
% l, l3 z4 O1 V2 p+ r| MCASP_RX_OVERRUN);) u4 T* Q) w- t/ k, f
} static void I2SDataTxRxActivate(void)
, p8 U$ D, M% }" H! k6 r, \; }8 j{
7 z( s; c( y/ n/* Start the clocks */
& C- u' H& p7 z7 p! vMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, Y5 y4 F$ l9 `9 L: R# v6 _
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
6 l$ f9 [/ g& h `+ C/ i$ UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,& G. T' p" q) p* j4 d0 Y
EDMA3_TRIG_MODE_EVENT);$ ^) `9 ^4 @( S8 z- P5 G3 v. p+ Q: ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # r7 y5 Y+ i- S8 A; t4 @
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 E' y/ g3 b% M6 N7 xMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 a$ k3 ~7 B9 Y- M: SMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */! ?! w# V1 S2 ~2 ?& O: G# O5 E
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */8 i% M. U1 G! }4 s) q/ D* Y, V6 Q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 W( d/ {5 G0 M6 U/ Z' x7 M, j
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ @$ q' r1 m0 |5 C% T4 d- D8 E% U$ t
} 6 h* b4 ^1 B- \- ^3 f2 K
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# K% e ?# |( a. U1 \3 M3 S |