|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,9 L/ v5 `8 L/ }; ]1 v. |
input mcasp_ahclkx,
4 l+ L; L+ s3 c9 \% C1 t$ jinput mcasp_aclkx,: ]) r# f/ R; T) {# x% M" e. A; A
input axr0,
/ O k# g, b$ e" x" a" B, ^: K9 Y+ @. F& x1 e- H
output mcasp_afsr,$ T3 g: }4 J3 d/ t' p5 O `
output mcasp_ahclkr,, c( m5 Y a* f
output mcasp_aclkr,
( y: Y a$ `2 Y5 l; Toutput axr1,# h, X& S. b) H0 V# X/ N
assign mcasp_afsr = mcasp_afsx;* D2 {7 d7 s+ V: j+ M
assign mcasp_aclkr = mcasp_aclkx;; \4 E o; q4 ~; P
assign mcasp_ahclkr = mcasp_ahclkx;. Z3 F) X' Z* v( \% W( X
assign axr1 = axr0; + J! W" Q/ v: z" C
* {& N! K$ Y% P+ I* l$ S5 G5 {
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 z6 G4 F- E- p
static void McASPI2SConfigure(void)
3 x! j2 }( H' x% e" ~{
( ^5 e( w- @+ y* \$ z- aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; h0 V2 ~ p" h5 D1 e$ [0 q
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
! A( P- ]4 v4 T" ~7 _: \McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) X/ q8 I! u1 A6 f7 H) t- s
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
8 [( o# `6 B$ ^McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, o+ n( M X1 b( ?
MCASP_RX_MODE_DMA);
& L, x8 {% {3 x9 b- y3 P/ C& g8 }McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, e T- F/ C% ?% |MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 ~ B9 ^: z% n! `, E4 A. X+ ?1 ^McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ e+ k% X4 T9 W9 j* v% I/ Q, XMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 P+ G" `& s2 O; v# q' F
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: ]/ K! J) n$ @" bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- M0 B; C( q6 V3 F5 I5 ]- GMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( i9 e; Z1 b( w) \7 t1 o& e* C' K9 M
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( X; \5 t) C6 |6 h# bMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; E* q* O+ d) J) G( Y1 l
0x00, 0xFF); /* configure the clock for transmitter */9 V( C6 [, c: L, y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);6 U4 h# y* V; u) D v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ e2 \+ N5 a$ i8 C3 i o2 EMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) M$ p9 A! k& n W: ~( x0x00, 0xFF);% T/ n0 T5 k K5 k" J5 |- n+ F
5 I& ~" c/ F e6 `/* Enable synchronization of RX and TX sections */ + \8 o/ J8 |1 e% j: n/ x
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 r: j' F. O' B' Q: ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! f! |9 i, ~1 I. z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*1 W2 ^8 ]: J* T1 X. ~
** Set the serializers, Currently only one serializer is set as8 V1 L7 w. z1 m! a5 R' M0 Q
** transmitter and one serializer as receiver.
, z7 `2 G& \7 \9 ^3 P" j( l0 H*/
7 {% U# g9 C& l9 CMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) N6 h5 |; k0 F7 Y
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
, N7 i' u0 a4 o5 E' D: M! H+ I- d* O** Configure the McASP pins
& p; |7 s7 i; t$ E @$ y0 Y. M; `** Input - Frame Sync, Clock and Serializer Rx1 Z0 P/ x8 k2 b/ D* l& O
** Output - Serializer Tx is connected to the input of the codec
6 e8 K1 H8 n' g; o! l0 d ]; z2 G*/
* S2 q$ }- F) B$ a2 K: _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 M7 K* Y( D @+ Y; d9 A' Q/ gMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
# _, Q# x. f0 |% c: XMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 z/ a+ p, K, I- Q, z* U* B
| MCASP_PIN_ACLKX
9 U9 a7 Y8 X. m| MCASP_PIN_AHCLKX( w0 n5 O+ N* K, d8 E7 X
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ l8 H7 ]# _ ~) \McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 W$ q' d& F( n: B- o5 x| MCASP_TX_CLKFAIL
4 V6 D, @5 M4 a. P| MCASP_TX_SYNCERROR
( K8 f/ J$ U' a% x| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! W" @4 s/ j* C/ W% m
| MCASP_RX_CLKFAIL
* h! n1 g( _+ }" k| MCASP_RX_SYNCERROR 9 p& j8 N0 K2 n0 F4 f
| MCASP_RX_OVERRUN);- k, s. h) f% g
} static void I2SDataTxRxActivate(void)& O/ c1 i4 J' c
{# Y% B6 N8 A3 w# b- S- Q
/* Start the clocks */
+ u7 o" V3 t% z- {0 K4 A' N" sMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) s1 x' H6 C. ?( b' @" {McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; R9 z; ^# O2 D+ X7 R# G' {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' k! l* `. H/ ^) a
EDMA3_TRIG_MODE_EVENT);& L) k$ |* U) X1 }. I& t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& w$ n9 M7 `, a1 b( h1 lEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
9 E; T/ `" h* jMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 e) \& W! w' w$ t9 l- u( YMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ {& e/ F1 v* H+ _3 q/ |/ T$ A+ lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ g4 U. H6 y' G& B6 j
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 g/ j. Z; p8 `( ~5 T" t( \) j! [9 n
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' e( c2 f4 ?- @; G5 }. ^: |8 x+ q" N- w
} $ T, C# V# @( X6 y2 L6 l
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. " k: Y+ Y& z) T
|