|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
: }8 C/ l- U" Q$ x& Ninput mcasp_ahclkx,7 Q/ Q6 J* W$ {3 W1 {
input mcasp_aclkx,
: Z' P8 ~7 Y0 E3 W& l3 d. F4 q4 X Uinput axr0,+ Y0 I3 j1 V W
8 u9 S2 t) P5 Z
output mcasp_afsr,3 h7 k Y# D& `7 _; P2 _: [, L
output mcasp_ahclkr,
; Y, V1 m1 W' E* woutput mcasp_aclkr,% o. h" [9 j8 O/ r
output axr1,+ D# Z2 O3 u; [' t" R3 h
assign mcasp_afsr = mcasp_afsx;
, ~; Q) [* L+ V6 V, y8 U! b- ^assign mcasp_aclkr = mcasp_aclkx;4 g6 r6 Y+ a% z4 m4 x' e
assign mcasp_ahclkr = mcasp_ahclkx;4 o5 ^# e& V% }) B. P3 t# T
assign axr1 = axr0; 3 m+ O+ o- Z) P% w
/ d8 P+ t e9 h( s( e0 B# B* a
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ! H( j! K) _( f- J8 ]! {3 T' P- E
static void McASPI2SConfigure(void)
# F* U: j q' K) m- S5 ]{7 F1 V, W+ e- ]! t5 G, j$ o
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) o5 ~/ W2 g* n/ y7 y5 `5 y+ mMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ s, R* ?, e8 i5 ~2 N% ? J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ r; f4 S' D* {; k* \! `" N
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */" K! S6 ~; D' n+ U: E) f/ `% G
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 ]7 @9 p6 f% \' K4 g1 ~( t
MCASP_RX_MODE_DMA);, F7 F$ Y0 H$ r, A
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ T# S7 ~- L) R3 E$ I1 S3 H7 T, Q
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* H* j% ^2 n$ h6 }2 ~; m: eMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / I" H$ {1 J# h4 T* \) H
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( h: ^& O' D L$ A0 @
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 _ d1 V; P% v, o! n4 y1 X; c8 ^
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */2 |2 C. x% K( G: `
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% }- Z# I, Y$ e7 |8 `8 I$ m
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' E+ i% H, O- A0 s, kMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) h2 Z' P$ P G$ `, F0x00, 0xFF); /* configure the clock for transmitter */; |+ _6 g* J' ]6 l! X @9 O0 H
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ ^$ R9 U/ {7 K$ Y( v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& d8 \0 H9 \) p5 S0 PMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 t3 R6 ]: y. G8 v
0x00, 0xFF); S0 i- p9 O$ C) q" R9 C5 ~$ y
) {* X- g- M& ?. }8 x& f
/* Enable synchronization of RX and TX sections */
1 t1 _9 N# W! UMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */6 m& m& b" o$ {6 N' c' Z1 G& A d7 _
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; E% m" X% w8 Z1 b0 V' h
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: v' F+ r, r' X# w
** Set the serializers, Currently only one serializer is set as( ?' E, W+ _" e) h9 `5 W7 j) B* i' z- O
** transmitter and one serializer as receiver.
& ?7 z0 f% p/ y$ }* b) K*/
- K% L* ~3 j$ uMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' j* U% @" V& t$ X: HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
4 N2 k, r$ c3 h B7 Y/ x** Configure the McASP pins
8 u1 b( _1 D6 }** Input - Frame Sync, Clock and Serializer Rx
% d, R5 M4 K4 C; e- ]0 `1 \** Output - Serializer Tx is connected to the input of the codec - J( e- W- u( M9 R
*/$ W# h' Y7 s$ }! S5 ^
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) A- V2 _2 B# o6 {, `
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
- T. v% _ J- x$ w/ b$ ~9 _1 rMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& m1 x& i Y. ~5 y9 M& m7 O2 T* J| MCASP_PIN_ACLKX, W5 A6 A5 V: L7 Q% I$ q
| MCASP_PIN_AHCLKX1 i3 f1 {, ]+ S" i/ q
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
2 H, e8 {: a. A3 FMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 }; Z1 D1 h0 `| MCASP_TX_CLKFAIL ) x; Z" }" Z: R% Q
| MCASP_TX_SYNCERROR
) @- x0 E2 n# n% _( u4 Z| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 p* D, z+ f4 Z S. ^" w| MCASP_RX_CLKFAIL
5 A8 X. X. j7 J4 g7 T| MCASP_RX_SYNCERROR
9 @( R0 F* H$ f% I| MCASP_RX_OVERRUN);
' w `# x% D+ \# Y) X} static void I2SDataTxRxActivate(void)
6 w+ H+ v5 c$ i2 D1 w3 r$ _9 \5 d. H{$ O2 h0 ?% [* M5 a6 F/ w# R3 h
/* Start the clocks */, t2 ~8 j1 U( X/ ~$ a& l. C
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" w5 Z$ n# Q6 I" c3 l
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
0 z' E J2 k7 P3 @% k( bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 F7 T3 g- D ^& o7 N) J3 K
EDMA3_TRIG_MODE_EVENT);
% j, H) j- g5 _( LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 L l+ q1 g1 O2 k# N9 YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */+ B: {* [+ a6 Z1 q; V
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: X5 t4 K t! j* Y6 z- H! _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */* u: C0 h& V, D. H9 r) M9 h
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
6 S. o+ ^$ N4 l3 W4 ~, xMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 `! g0 |& L/ i2 r4 e
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! S/ C2 g" T7 I; ^
}
6 W2 W: D5 N+ z6 f8 E* h4 e请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( l) {' `- L4 G$ ]3 G |