|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ \* Y8 \4 R' l# D
input mcasp_ahclkx,
f. l. {' w% j% e4 R) u5 hinput mcasp_aclkx,
+ k8 z6 ]0 J& A% H& j/ Jinput axr0,1 Z4 I, t2 L! J
% k0 M- k/ B6 i7 Voutput mcasp_afsr,
T9 z2 u; u& l, P. j( G. P* \output mcasp_ahclkr,
u. e) `% B o. h$ X$ Boutput mcasp_aclkr,
' ^! y5 l% X+ z9 V+ o r) p( ?output axr1,6 Q4 u9 m% U& z7 x
assign mcasp_afsr = mcasp_afsx;
% K3 U' |; U3 ~' Zassign mcasp_aclkr = mcasp_aclkx;
4 j4 ]7 L4 g! @3 Y% [assign mcasp_ahclkr = mcasp_ahclkx;5 h3 P! ^! }! X: B) _
assign axr1 = axr0; , o$ x0 S8 V) l6 N) @
3 ~! p3 Y7 A) Q" U
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % X& M: f, i: F/ ?
static void McASPI2SConfigure(void)
6 U1 f7 R+ |$ {9 p0 X{
, O) S" ]. |& O9 gMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
% i+ ]7 q5 d9 ]' m" dMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
3 f0 S( r# F: a$ ~4 x8 }McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* t* k8 y/ g% q lMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */1 }0 Z8 {! P# q& `
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* k' j" n9 Q0 ?+ |
MCASP_RX_MODE_DMA);0 h' c9 ^7 N5 P! F# g6 N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 k2 G+ R r$ n: W% R
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 z' H4 o0 J* t" X8 IMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 P/ I2 Z- v( h1 tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 n. L" m8 @2 M! G8 u; B# o: e6 L
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 Q- ^. w$ W+ ]' j( @
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver *// F6 x5 L5 f. K8 j, ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- R% F! y5 \; N, D
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
$ Q, E, p$ r$ _4 x' ^ O) F fMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
, `0 r [$ _; a$ u1 C( \/ h/ A" R9 |0x00, 0xFF); /* configure the clock for transmitter */
& ~1 c8 G! L$ ^. d( DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 R0 U' ~. `3 k' {) C/ kMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 p; \: a1 w! e/ z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 a% |6 R: s) s6 I' _
0x00, 0xFF);) u5 U1 b+ V x3 U
0 x5 R: r, v/ ~4 O% V' Q* g
/* Enable synchronization of RX and TX sections */
, T( \( Y% ?+ K8 @4 BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots *// `! K$ Z) i. I- `3 u
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" u* b0 ~5 q1 ]5 \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*4 ]$ p- F) ?% O- b0 z8 Y
** Set the serializers, Currently only one serializer is set as' P7 n; p$ |2 |( Q' V: h n
** transmitter and one serializer as receiver.; S* K" J$ S) h1 y( ]; c/ H* J( O
*/
' [, l- }( H2 c# u9 ], z1 `$ `McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 g, o+ i, Q7 x, h9 `; y' ^: q
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** Z- X2 {& J5 w! r. J' q5 c
** Configure the McASP pins 8 D6 x( k! U& ]3 [0 I5 w7 c" q! I k
** Input - Frame Sync, Clock and Serializer Rx* K- T7 n6 Q( Q3 E
** Output - Serializer Tx is connected to the input of the codec
# R" y6 l7 Y: `+ q" q*/
* d7 }5 a) n* V* g: F0 j! AMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) ?# o% d' |7 @# [
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* k5 R# T F# c1 H8 r" Z% I; _
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 b* d. ]8 ?; }| MCASP_PIN_ACLKX
8 D" W0 }' P; f: T, U# H) K! h; K| MCASP_PIN_AHCLKX
4 |. N; J0 M6 U# A6 C0 c| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */: D } l# r0 M) R4 {) _
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " c+ F5 A* f" K$ `3 d6 y
| MCASP_TX_CLKFAIL 7 G6 f7 \' t% L5 ]- G8 [. c0 w8 \
| MCASP_TX_SYNCERROR
# h c% Q2 Q5 E# {| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : D0 R" \+ j6 a4 R2 x, f# f4 C/ B
| MCASP_RX_CLKFAIL6 E1 _2 O* P9 Y" H
| MCASP_RX_SYNCERROR ; W4 ?2 o; J @+ R, J( F
| MCASP_RX_OVERRUN);
1 {4 s" K& |4 c& t& ]} static void I2SDataTxRxActivate(void)7 P/ I- _9 C5 q
{4 X$ Q. I s; J. o$ R
/* Start the clocks */
8 o' M/ D) h& e# OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" {0 Z! G: E5 ]/ k" w
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 u: _! l: t6 z+ j9 b I7 Z8 \EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
r: L/ _8 z* M" G6 kEDMA3_TRIG_MODE_EVENT);
( Z' W$ j$ z% g9 VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 m/ V# E8 Z8 a1 Q- e8 n" A8 H$ ]EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
' G$ C* n2 ?6 A6 P7 P- r( n; R- EMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 @& q; Q( Y E
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
! s8 J3 b' [9 s ? P1 Xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
: Q! p/ ^+ q `# C% r3 QMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) z, l7 ?4 T q& `" p- Q/ j) kMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% q3 ]; ]5 F* }3 E5 {4 }
} 8 L% e u4 i: I h
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 V& t. V5 h8 i" C |