|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
* N! o7 x0 P1 s# n3 p9 b5 s/ rinput mcasp_ahclkx,1 v6 X! q8 _. ~) Y. Z% O9 H
input mcasp_aclkx,
" g0 s- k; F! j2 e1 Zinput axr0,
3 m' z8 M1 y1 S) `& K* V4 l; J7 g0 e0 \
% i6 n7 t) N" W6 E. Xoutput mcasp_afsr,# Q& O8 b; ~& N8 {. p1 u0 p
output mcasp_ahclkr,' b/ G% V4 M$ |; t& F4 V2 @
output mcasp_aclkr,
, E- ]% B; z* ]+ n- ^ Boutput axr1,
W M' Q7 X* C$ y2 e$ p" j( N assign mcasp_afsr = mcasp_afsx;0 d c" ~! }3 u( {6 x- D7 d; K* b
assign mcasp_aclkr = mcasp_aclkx;/ E/ _# _' L K! Y: W( J! \; H8 @. G
assign mcasp_ahclkr = mcasp_ahclkx;* B- z& C/ ~% e3 y2 U
assign axr1 = axr0; ! S9 s7 W1 X/ m6 \5 F
) Q; G) T- D$ i' O. }在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
! i/ j3 t: ?! b( V0 l: Z9 cstatic void McASPI2SConfigure(void)5 k; @( y9 N, W1 O6 B0 ^
{
' B- ?0 K6 ]; Z' S4 C4 o: jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 _# P/ X9 W7 G+ f/ pMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
4 H1 e7 @5 ?4 q3 L) yMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 e4 t$ N& Z" A/ X% QMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: K- U' h; V2 ~- \$ V( l( _
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 U2 l7 a' A2 b/ KMCASP_RX_MODE_DMA);
+ M; r7 k4 G+ u$ _* ZMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ S$ D. T2 z$ Q
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ |4 i) S! x. o
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 b3 H/ a# s# S, f( `
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( H- O$ H) L0 H5 J
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 i- S U/ C$ G4 u& _3 MMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: b5 q! z/ T- O9 U9 g6 ~
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' T+ `+ p' y& O4 PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , H8 A7 b. v$ W. i0 n4 r
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ X6 d6 k! T' I' h9 s0x00, 0xFF); /* configure the clock for transmitter */
; m- x3 p6 O6 ]& zMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: y. [2 S; K6 E7 [
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
l9 e; s3 w( D6 i3 mMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* T( _# X' o! c4 v; f0x00, 0xFF);
0 } x7 Y1 j" [" z! Y7 m9 [7 k9 v# y1 s8 }. F
/* Enable synchronization of RX and TX sections */ # m$ A3 K/ }! j* w# r" a
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" @' `! g/ |+ T2 X6 t) O- T8 I/ ]
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 D9 r, [* @: O' }! W3 A; u( I1 c' zMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
0 |0 C: n) |; f1 T+ l4 D** Set the serializers, Currently only one serializer is set as
, Z. a6 \' J) j0 R# k** transmitter and one serializer as receiver.. h- F& r2 I1 J8 Y" ?) q- q( k
*/( Y) |( A {0 d# l5 ~
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ {; E1 B3 d# V$ ?McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*' b( Q5 A: I! z0 x
** Configure the McASP pins 6 p) o N. P" K4 \4 i; c
** Input - Frame Sync, Clock and Serializer Rx w8 O2 X' J/ U" j
** Output - Serializer Tx is connected to the input of the codec - V f& T; K7 l' K' H
*/1 d; H# q: `# q
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
8 I5 {9 t# i, [4 T" ]McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, G9 M. M5 J0 z! y: o
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 @! w) [, v6 Y o* [
| MCASP_PIN_ACLKX3 H4 S; L x) x# ]# T' r
| MCASP_PIN_AHCLKX: m5 d* Y: j W; B
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
( b9 q" e1 O* j7 w' G6 cMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
; }' y1 i" x! E9 i| MCASP_TX_CLKFAIL
& r4 G8 j2 D$ q4 L1 \3 d) h( h0 m| MCASP_TX_SYNCERROR
1 V4 n* c: y6 z# z8 V' d| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 @# m% P) G' g- [9 X6 {| MCASP_RX_CLKFAIL
% h" s7 s: i: ` p' _6 d| MCASP_RX_SYNCERROR
( a) s: Y" b5 u2 S. b+ H: x% c| MCASP_RX_OVERRUN);
' s- s2 W9 m* W$ F6 L$ H! G} static void I2SDataTxRxActivate(void)* u9 Y V* U, f, i7 }
{* Q- ?; D$ p5 x
/* Start the clocks */: }; e* c) S; |! M
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
7 ]* Z* X7 C+ C* z, oMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
- o' m0 B- z3 P8 ?: m* OEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 ^- ?/ q# n& gEDMA3_TRIG_MODE_EVENT);3 {. O( h& O) c: ]/ \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' c5 ]: n5 q( s G4 s5 s- j0 E
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */6 ^! D! d& H, B' p8 V# ?
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. Y& l, e) _7 D' Y( e. hMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
. t* m6 n3 @5 h" t1 S) L5 |while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */2 d4 V, y( Y4 y, H
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 H& u- |" B9 q8 Q! F) s- BMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 x: {; ~; [3 f u W
}
% D) Y8 @' X) _2 S B7 U请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
; V( Y5 f" h) `; a3 ?. }: D6 R6 _ |