|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ v! }. L0 s2 ]" u ` a
input mcasp_ahclkx,
2 `# s; g/ U3 }input mcasp_aclkx,. @* ` e/ c0 u A, J. F% W. d
input axr0,( r! {* ], }9 J
$ e' X$ B/ `5 O Soutput mcasp_afsr,7 {2 Y1 n8 r3 j6 X/ r% G
output mcasp_ahclkr,
& |9 m" j4 w' y# S) j3 A. J& e* S2 Xoutput mcasp_aclkr,
/ C. n5 D' `9 t4 V7 v+ ~& Aoutput axr1,
+ u3 ]% w: d& C4 A X assign mcasp_afsr = mcasp_afsx;
6 r. V+ T5 l6 |1 Q! {/ }6 aassign mcasp_aclkr = mcasp_aclkx;
( |9 v$ s4 Q& `1 f6 y: @5 K1 Iassign mcasp_ahclkr = mcasp_ahclkx;7 s" K% K; _6 S1 t% r, J& j) U5 ^, ^
assign axr1 = axr0; + G: u. {4 I! f: l% R
- `% B; A6 ?; b) ]" x5 k在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & }! I- @8 K0 @9 B0 W
static void McASPI2SConfigure(void)3 J3 |9 S7 c% I8 i" q; i0 S
{( H' z' \2 u% G% A2 [
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 f3 v9 F' Q' u6 S/ gMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */2 x% W6 k; z' J: q# E
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; k: x6 ~ H' ` q! @
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */2 ]' E* n) A+ g% N6 u
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 r+ q6 [5 u) u+ f2 C7 q; W
MCASP_RX_MODE_DMA);
+ x' r4 ]2 ]9 T: C! X, l* kMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( ]$ O( w+ m, p, R7 YMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 r/ b/ {4 Y3 N) r* QMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * b) d, z( M9 n, s2 ^* b3 _
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# Z$ S% l3 K" IMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ E! {6 L0 N: r" @" `) J' h! [ zMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
7 H% E6 c; |- l) u3 dMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ |: m2 B( b* `4 \7 H2 {$ rMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 H% _, `* O- b! e3 OMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 G2 N% T9 p& c' d/ d1 j/ D7 A
0x00, 0xFF); /* configure the clock for transmitter */! @# k9 d+ A+ `( U6 U6 z8 G
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: L; ?- V) [8 w1 A' i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; ?! |; v& S% |" j
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* r0 S& B `3 R5 |0x00, 0xFF);
" V3 V }4 n2 R& q) w/ `4 e8 n/ K: J
+ z! E) P5 v4 x) u' ~) z/* Enable synchronization of RX and TX sections */
/ }/ O. s2 C* w5 |8 a. Q! yMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
' z3 {' w. z. DMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" M: s; j; _8 }& I: r
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*/ x* ^* O$ o* q7 W Z
** Set the serializers, Currently only one serializer is set as* I6 E6 s4 L0 {: ~
** transmitter and one serializer as receiver.
- r" C3 S/ l% e4 ]9 r*/! f, j8 D" A, N. N' t, }
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 l" q: ?6 E f! L5 S- F8 r
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
+ J9 }+ d9 I7 g3 y+ c K- p** Configure the McASP pins
& G" t5 O5 Z0 e1 e** Input - Frame Sync, Clock and Serializer Rx8 Z% e+ F6 E" `1 C# m' X, {( D0 u
** Output - Serializer Tx is connected to the input of the codec / \+ ?( [3 l7 r D- P
*/
- C9 m/ z7 R! N G+ NMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ }" O! l, ~0 mMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: R' I R- Q' p' a; R# k- ^McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) m- {; m- D0 x- k) M c$ I: f. g/ E| MCASP_PIN_ACLKX
]% g: k* ^8 O7 U- Q5 L! o w4 _| MCASP_PIN_AHCLKX
O7 Z5 l- I8 E- J f5 E4 ^| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
! P( V" o/ s' \! KMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # Z1 u4 x& O3 ?) j
| MCASP_TX_CLKFAIL
5 T1 s; A0 y: k, N| MCASP_TX_SYNCERROR( _) r' A( R3 [3 W1 _* @
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ E, C% b6 p& Y- p+ M' ]! q% F| MCASP_RX_CLKFAIL+ Z v2 o& |3 c x2 L5 u% Y; `5 P# F3 L0 A
| MCASP_RX_SYNCERROR
: X) j/ N2 i( j- m$ X2 S| MCASP_RX_OVERRUN);
+ S' g3 h+ c0 r, N/ h$ o} static void I2SDataTxRxActivate(void)
5 |2 J" K, F0 |2 I{8 a0 l d7 G9 `2 k/ ^
/* Start the clocks */
3 c* b; k4 q R# H" Y2 j0 c2 xMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, { ^! h3 D( O1 k; g- v. k
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */" U7 Q! ~9 L5 r
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
3 O( S: q$ o& pEDMA3_TRIG_MODE_EVENT);- y) P# I) { X1 ]- w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ _$ W$ t% J. Y# sEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */8 m( M7 s* M5 K K$ s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; v+ \' \# Q9 pMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
5 w; K$ r4 J# _6 owhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
2 A- J' }) P% T8 a7 RMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: T" e3 h3 w$ \$ BMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: {: d: T6 O' @5 B} " \( I! f6 k' p5 P% O2 V
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , J) U# n. P% J' C8 k: y% C% Z* ~+ Z
|