|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
% L* \( [, C! g( }input mcasp_ahclkx,1 @$ p0 i4 `* m5 D: [& n9 @
input mcasp_aclkx,* s1 X1 B/ ?+ N; J0 m% s
input axr0,
/ m/ t' ^4 n/ M, E8 d5 B8 ?6 R4 Z) H9 G$ F8 z
output mcasp_afsr,3 o6 T- y$ p1 X2 Q0 z! U# O) x
output mcasp_ahclkr,
% U( b, n: C2 I- k+ ?$ [output mcasp_aclkr,: Q$ ]5 ]0 |) {: N
output axr1,: b7 I- S# Y4 r8 Z1 S
assign mcasp_afsr = mcasp_afsx;# F( W. |/ H8 ~; b; Q
assign mcasp_aclkr = mcasp_aclkx;
# O. s% |* d3 U5 T; D2 g3 \assign mcasp_ahclkr = mcasp_ahclkx;& E' J# Z0 E1 f! V! o
assign axr1 = axr0;
3 }4 G" G( u1 o
1 |, b8 C( }# j5 E. O在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
) ^" W# g& P# L U& h" L9 Q2 tstatic void McASPI2SConfigure(void)+ H8 Y2 M+ H$ m& A9 ^/ p8 Q, }
{
" Y1 @: G4 q( z* M( m2 X4 K; tMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
; F% |, f( S: w, Q) Q6 I7 TMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */2 C0 ]6 T2 `# W! N, \5 i5 Y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
U5 G& v9 n2 p0 K) F1 sMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
8 A4 B' w/ a+ h. UMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: @* [4 C# ?) ~: }$ o
MCASP_RX_MODE_DMA);3 ^( V* w& S$ O* X( z& h1 E0 ]
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) c# N2 ?- ~; k
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 p' Z& j% v$ S+ G
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; w6 b8 U( O5 _1 G" W$ B! Y
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);1 c0 o- U1 t$ T5 f* |) |& K$ |
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' {+ k1 F2 I* \+ `# ?, sMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ L$ E; T) P" N+ M( [ uMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- D: O7 T' E( p( v# A2 l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 E( r% J$ D9 q- |0 I
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: h; d3 T! H' m; [8 F/ k5 W. I% v0x00, 0xFF); /* configure the clock for transmitter */
& S5 i, _9 F& V7 {% ]& WMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);6 }# J. j; v3 u, f9 s* @% I1 W
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 {1 t! o% G' ~8 x5 x3 _0 S* V' F1 A
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
& N* k7 r" G7 ?) l7 G0x00, 0xFF);; K' e; t) |( H+ p8 k S
2 W- d5 w# t3 Y' K1 a4 X
/* Enable synchronization of RX and TX sections */
6 c* R% H# s3 b& G; DMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ k2 v) a. a" u! VMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% }" {+ u' Y' q4 E" ]McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 i8 K1 t& u4 P0 X5 G% ]( T4 q9 s
** Set the serializers, Currently only one serializer is set as
9 Q& Z5 X9 \" I' g4 q. {) p** transmitter and one serializer as receiver.
8 e' [3 j1 k3 \; t' F: _*/
3 \5 t/ f+ s. I% P7 J5 hMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ U1 s+ X* _. b s$ U6 X5 XMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# H) y0 O+ s) q* h- @** Configure the McASP pins 2 i# o/ f; q# V' E: x* `
** Input - Frame Sync, Clock and Serializer Rx
4 Q0 f8 U0 s5 S' t0 m** Output - Serializer Tx is connected to the input of the codec
6 X2 Q# z9 `' {* M*/
# x. ?" h0 g6 @* R$ K1 @$ DMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ K0 |7 v+ E, \7 k$ y/ J! m
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: H4 \5 P& |0 t8 L: w5 MMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# ~8 y8 W0 ]4 J) F/ f
| MCASP_PIN_ACLKX7 D1 a: _5 A( [. E+ r
| MCASP_PIN_AHCLKX. n" o0 }, z2 q& F/ ^9 F6 ~
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */7 B) i7 [7 ~1 C5 p; O w
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' `* u; J1 I F. v; i+ y# e| MCASP_TX_CLKFAIL " F5 G' v6 o& `( Z( H+ I$ W
| MCASP_TX_SYNCERROR
$ u- |* [. Q8 p: o| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( v5 A* T6 S& U$ m
| MCASP_RX_CLKFAIL
; R1 S# W, ?& V+ R9 O* s| MCASP_RX_SYNCERROR
Q) P- I* o! ?| MCASP_RX_OVERRUN);/ B( A D7 S' ^
} static void I2SDataTxRxActivate(void)
9 \7 j% W; R, X( P1 l# J q5 R{
! O( Z0 z8 Z' T/* Start the clocks *// o: p9 G/ B2 ^. t& a
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: r, B% i. R& \* N5 ?5 I3 uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
- M; ^. x; E ?5 g7 c& {EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 o0 y# O) u, z& Y5 TEDMA3_TRIG_MODE_EVENT);
% v7 ^: ~' C" AEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 {5 q8 m9 j- MEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
! l3 z/ B7 _6 d. Z! y, O# r! A( V' YMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 ^1 p, F) Z! r- T2 x5 z" \McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */; N( ^& `" `5 S
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
! `7 u3 I6 x8 X2 uMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 z; {" I+ i0 Q/ N3 h7 y) k, V+ uMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. b7 E5 T) A. H}
8 p' h7 w I* e' \. y; G7 j; U" W请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. P, e8 s+ d+ @ X+ {( F
|