|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
9 G$ c% F) ^' T+ g* Rinput mcasp_ahclkx,
& Y+ O* }! W4 L% W7 ^) x9 M" Pinput mcasp_aclkx,. w, y) j. N, [3 o8 F
input axr0,
: ^2 x' V+ j+ d. L- x
5 Q) h" D/ f$ t, p! j/ xoutput mcasp_afsr,' o5 l8 y. c: L, g1 u# `" r9 h+ |
output mcasp_ahclkr,, c3 h+ G8 t1 E2 G k( y
output mcasp_aclkr,
0 ~% B0 H- ^- ~- joutput axr1,
+ w! O5 X9 X) B( H8 }7 v assign mcasp_afsr = mcasp_afsx;8 J7 }# w9 n) v) Z
assign mcasp_aclkr = mcasp_aclkx;
) P1 o& y( e9 m- [- Vassign mcasp_ahclkr = mcasp_ahclkx;5 D" b& k6 D5 _
assign axr1 = axr0; 8 R2 O7 Z" y l- f
2 l7 r4 _2 Z4 c& z) i( {( q& O在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 # {5 q& n I; l+ Q4 a6 c q2 {
static void McASPI2SConfigure(void)& d' U6 z2 K/ a! [$ E9 n+ F7 ~' E
{5 b O# ^- X/ v* L1 I4 P
McASPRxReset(SOC_MCASP_0_CTRL_REGS);3 P. o& O2 q0 w- U2 R
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ L9 x# L- }+ E: T- w6 r) [+ T
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
+ G+ @% G1 }- C% q. z2 Y- ^, vMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
7 V8 s& @6 G2 ~0 iMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! l- g. @" l+ J& j: p7 W8 P
MCASP_RX_MODE_DMA);
3 @1 o6 `' Z* t7 a5 j& x0 QMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- w& u+ h& r d6 M* iMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- H4 o# I* U/ y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
# U, p& R& o/ n5 S6 I8 WMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( x7 L8 Y9 w$ n: v, ^
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 x( c( H5 e! |& O
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */5 @* _$ S3 m6 h* N% j
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 L! o7 u3 D5 U5 M5 W A$ @
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 [) d( r( C% q2 P: L
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 x' Z. s3 M0 Y( X0x00, 0xFF); /* configure the clock for transmitter */
% Q2 w# g/ |! _( Z0 h4 xMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( F) E5 X1 o7 }. ]* q+ q$ u
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! i9 @# l, i7 Z2 {1 ^2 u: B
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 G! s+ t& x& K4 k R' Q! {0x00, 0xFF);
; Y- x; O2 \; N* W u! c
; p4 D2 ?4 l1 E) p. o& i/* Enable synchronization of RX and TX sections */
t" Q3 W0 z" `4 _- ]0 Q: zMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
x. S% v0 I/ J$ [ N+ E! G5 \. CMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. f @5 D7 v# P+ W/ F k: DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 T, M& d4 ^ E, Q# N y
** Set the serializers, Currently only one serializer is set as8 B6 L+ C% l$ l1 J1 f' y4 N0 J
** transmitter and one serializer as receiver.9 M; \# T! a- s! m2 {& N
*/' q! D0 o$ i- X! y D, n) L
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- X5 n, [# I0 t" P2 C3 K' TMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* |$ p$ A1 b5 X** Configure the McASP pins
+ t. ?4 x1 X" S: A** Input - Frame Sync, Clock and Serializer Rx+ ?8 b8 Z l `+ A8 Q. Q& \
** Output - Serializer Tx is connected to the input of the codec 5 ]& |' z N7 S/ m
*/
) k7 T5 |, O7 ^1 P# Y; |8 E8 X$ OMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
4 c& y" l5 g/ g7 y3 x4 z+ KMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 k/ P; P8 J. ]McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. t- W, O( k; B) y! }- a| MCASP_PIN_ACLKX: Q& i6 C* }! C! v# }* x+ t
| MCASP_PIN_AHCLKX
9 F& N" \. D" R# ^| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
2 K% }6 u0 ]" O i1 A( ~2 QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) p; A; B/ r) r* I9 b2 K
| MCASP_TX_CLKFAIL
7 P4 d! ~- {! x. j( m2 y| MCASP_TX_SYNCERROR/ @( Q! G& d. y9 ?5 @2 ~& u& m4 E
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- C! d h* Q" h6 Z: \0 x- ~. O| MCASP_RX_CLKFAIL3 _4 e+ C3 h1 R: M2 `. |
| MCASP_RX_SYNCERROR & m5 W- R3 M5 F& w4 ?
| MCASP_RX_OVERRUN);8 W) _. ^" `/ s X2 Y/ @' w. f
} static void I2SDataTxRxActivate(void)
/ D! e$ }% g* g! Z$ L{
" c' F! J- }3 h8 ~/* Start the clocks */" \7 e: A/ A$ v" n0 x# ~
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* _. Y- }+ E4 ?1 ^
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 E$ F4 ^5 v' b8 s) u" ]+ U
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,* B6 U7 r: I9 O( U7 t3 U4 _
EDMA3_TRIG_MODE_EVENT);, c% p$ e+ G0 l* p( b/ c
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( G$ T$ e3 ?1 _6 x7 C; B7 X. B6 y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */& l- b7 h3 _- K' p0 U3 g
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 e7 h: W* T2 f! v5 Y$ [
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# k+ {& G. E$ ~' s6 H( Wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */) z: i( s6 q6 c2 a. E
McASPRxEnable(SOC_MCASP_0_CTRL_REGS); k! P5 F6 ~8 }1 m. Z V7 d# s* J
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
7 w7 t, \) \' m} # h8 L h" s' ]
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) P# d+ a) T; C2 s |