|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
6 P( Y, @( X, Z! A( O4 A9 }9 n5 binput mcasp_ahclkx,
' ?1 m4 q. U6 yinput mcasp_aclkx,
* ~' |. Q. _9 z9 O2 `* ^% pinput axr0,+ H6 T3 S$ e% a5 E% e | k T
/ K4 V/ O& R H% c6 t2 t; \/ s" e) Ioutput mcasp_afsr,' P' I* m U' ]3 l5 H7 T
output mcasp_ahclkr,
) Q, s/ M% W) l9 h+ P6 |output mcasp_aclkr,+ B6 D% e" w! {7 n3 o+ o
output axr1,
0 {7 i e8 H$ H7 ] assign mcasp_afsr = mcasp_afsx;: x. s. |5 ]! U" w9 d5 R; k4 \
assign mcasp_aclkr = mcasp_aclkx;
7 A/ ]! `4 O( _6 R8 iassign mcasp_ahclkr = mcasp_ahclkx;
* ?! s" |8 o8 _, }assign axr1 = axr0;
5 D* y2 ] ~: B" ]% B/ e
! O# v% }+ {3 G7 V$ @# a" Z在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 # ~2 `! L2 w, ~. B+ g! E* ^
static void McASPI2SConfigure(void)
5 K' h* W3 Y, Y6 b{ `: w& b5 o3 Z( W) J9 G9 L
McASPRxReset(SOC_MCASP_0_CTRL_REGS);6 k2 u$ ~3 f) p& h8 L: h6 l
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */) W+ g. m1 Z6 i* Y% o
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 {- n8 s4 h3 {
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
3 q8 q7 g* h; }McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# B: |# J* j ]0 o8 Z
MCASP_RX_MODE_DMA);
# W- o( Q" d0 L; r" V- ]3 ZMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 W: X* J% Y5 X* h( M6 zMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ G8 [% l: q- b1 ^: ^McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 N7 I2 S5 k1 J2 {/ iMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. ~7 S2 n6 h! K! _
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 ^. T, {5 J1 z( ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
0 H& S0 H$ o3 I5 R1 _* E' iMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) ^( p( z" b8 U0 zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 1 K& L- T; T. k$ Z/ H+ Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( R) H+ B) V! ]2 W
0x00, 0xFF); /* configure the clock for transmitter */: `. V( ~8 O! w# Q/ S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. \2 ]5 `) K/ P4 cMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 L5 D# b, n8 |5 A1 U. oMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
K% y" r6 A4 q& H e* a$ V0x00, 0xFF);4 s. X0 { v6 L
( a8 L" F* B; o9 i' O/* Enable synchronization of RX and TX sections */ * Q# \% @2 x; E* d
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
: d6 a% |% v. e5 d& I( jMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( `4 P! k0 a' |6 X7 y6 E9 t- ^McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! T$ E- h' D' p6 Z. v( G6 K; q7 H** Set the serializers, Currently only one serializer is set as- y/ `/ O4 P, Z1 |
** transmitter and one serializer as receiver.! B& g* O* L0 Z9 U# D, ?, O) P
*/
- ]8 U8 ?) K; XMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 M# f; @. |( qMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*3 y, k2 N( ^# J
** Configure the McASP pins }* f5 f" M; T; `0 L- C+ Q; _* R# c
** Input - Frame Sync, Clock and Serializer Rx, i+ O( x! D: f) y5 I9 I* R
** Output - Serializer Tx is connected to the input of the codec 6 r0 |+ @5 y W% x7 r+ z+ z
*/
5 J& b5 ^. h) l/ KMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 T! u6 f! Y7 [) d( N$ m
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 I( [, ^' g- n" M4 oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& E; O4 A( s! N9 p6 P
| MCASP_PIN_ACLKX
, h2 M3 k1 S6 m. V| MCASP_PIN_AHCLKX) H4 ?9 P0 o0 j% [, e
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */) S/ ~! p; J! I9 F5 \) g9 |# m/ u
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ M( {. t/ V# v| MCASP_TX_CLKFAIL
9 ^4 m# N( R6 h& o, [2 y| MCASP_TX_SYNCERROR6 O3 F* h1 m) {! [# P% Y
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 {( y) o8 Z1 u9 S/ T8 q4 W" j7 Q# c
| MCASP_RX_CLKFAIL- l/ ]; g! ?' [* a
| MCASP_RX_SYNCERROR
- M, {! J( ~' L: y; m# n| MCASP_RX_OVERRUN);
- s: r4 Q/ a& s} static void I2SDataTxRxActivate(void)( U3 H: A/ t. x5 b
{' r3 I% E' ~! s! x: r9 j7 M u
/* Start the clocks */
" q! q0 ]5 Z/ l$ R) AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; q: l7 A$ S' _/ p! T- bMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 F1 f" H6 x' f0 _
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
/ O- B6 m. [% }+ K6 ]; PEDMA3_TRIG_MODE_EVENT);% |7 X2 |/ T4 E: O) s4 G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( J% t6 |2 j' _
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */: H7 N. A+ e9 H* f, c! h6 ]
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 x+ L o1 [1 v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
( _; G) m) W g1 `while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" p" N: w2 [3 V3 k" K3 C, i$ N
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);* ], ~4 V9 K. }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 G2 Y" U# O6 E}
; x8 X$ X, P+ x: [1 ?请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( P% B3 c) i) P$ _# O- C2 j) A# _ |