|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,5 ^9 P- s0 A0 H& B; i
input mcasp_ahclkx,1 \5 ?8 \9 P( W2 P4 o, d2 W/ C8 _
input mcasp_aclkx,
7 {+ c8 |/ X' Q) R% \input axr0,3 v3 ?4 ?( c- L+ i
# m( x3 Y* z4 ^0 |, d7 p" C5 Foutput mcasp_afsr,% ?( }- K' I+ m
output mcasp_ahclkr,4 T# h9 C+ {1 q
output mcasp_aclkr,
, t2 s2 H0 G# ~% i3 Y; g3 r7 ]: Voutput axr1,
& G9 [. k a% k8 `. D9 ] assign mcasp_afsr = mcasp_afsx;: s# R( _+ _" j: W, L# R2 _
assign mcasp_aclkr = mcasp_aclkx;# N. q( p9 y+ l
assign mcasp_ahclkr = mcasp_ahclkx;! Y0 D2 I; [- ^8 Y% ^* Z: X
assign axr1 = axr0;
* ~6 y$ i, K) B3 U1 C* w0 F7 N0 m% a& P, b. G9 R
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 , ^4 L0 B+ m, o/ D$ ^
static void McASPI2SConfigure(void)
o& h$ r4 t" f{/ f9 v1 ^( W! S2 x9 }7 l- `
McASPRxReset(SOC_MCASP_0_CTRL_REGS);9 k5 U1 M9 y( I/ A; p+ K) R3 a
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
a. [+ @/ c* E( C: C/ VMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
8 ]; q$ Y, Q3 y* i5 J" @& E# pMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */7 P( P: ?2 V4 p* K
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; H0 @" @7 Z; f, @; o
MCASP_RX_MODE_DMA);% | D! A, i: ~- U
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 g# b; ]8 A/ _# v3 n! _MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ J! b' ^- j- @% O( D+ c+ ]+ U1 v
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
Y# D, M( {* M0 ~ \0 Y/ R7 mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! p1 t$ x0 V& S* Z7 j; ^
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 p- l/ h& o& x# RMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */& h, N! m. v: U% e3 Q
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 B1 U8 m4 ^4 R& \4 y* `/ `McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; @; ^3 a) B$ K9 d1 }- C# fMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) b# e9 ]8 `0 f0x00, 0xFF); /* configure the clock for transmitter */
! n$ J3 w- x5 u- h0 eMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
# D4 U1 f9 ]% N7 z( s! wMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ W3 \- S# L' `McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 k. [; W' B1 ~, [1 |4 c0x00, 0xFF);
& H' w" L- Y) ~# |# s! j1 C5 X* H( k; v2 O1 X) L$ A
/* Enable synchronization of RX and TX sections */ : @- X4 u: F% j0 ]% [
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( K |/ M$ p* z( I# P
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ ~2 D7 D) V. k1 V3 t+ _; ~) w
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
B: [" m* {7 ?+ l/ A" @** Set the serializers, Currently only one serializer is set as
3 M2 c9 Y3 R+ t8 d5 e** transmitter and one serializer as receiver.
2 d" ~6 U# d0 ^- u7 d; D*/; q$ ?0 E6 Q; F6 _; t
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 J5 a. K9 n( W: w$ h
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ d B1 d2 q" \9 k; |- n# {
** Configure the McASP pins - r8 I9 b# b8 W+ s
** Input - Frame Sync, Clock and Serializer Rx8 j7 a' p% H0 t0 H& H, Z; c" B0 v
** Output - Serializer Tx is connected to the input of the codec
- I) u J+ l- M# m" ^*/
! W6 g5 y' m c3 f+ v/ TMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); @& L1 X0 d( R2 l' K& t2 ^
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));9 R. W, Y8 J( V8 n' _3 b/ c `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) Z2 _6 C: [$ H9 k- I! m. a j
| MCASP_PIN_ACLKX) K w( S) L, ~! G& K4 r" ~
| MCASP_PIN_AHCLKX: J5 s, u7 I4 e$ m8 T
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
3 ?# ?% q, h2 i- T& q3 |7 \7 Z4 \1 pMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, t# m( X+ X/ T| MCASP_TX_CLKFAIL
( V+ m8 F' s# B; v0 U7 l) l| MCASP_TX_SYNCERROR# h& S5 z7 D( y( f6 l: ^
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( X, y' \: W! f5 J% o
| MCASP_RX_CLKFAIL' N) g T" Y0 R ~" W8 Z
| MCASP_RX_SYNCERROR
( Z* e2 ^8 {" e n| MCASP_RX_OVERRUN);
. P$ X" N+ E1 s} static void I2SDataTxRxActivate(void). H2 Z" f& D' L3 V
{& N. x5 T G A5 |/ D |/ P
/* Start the clocks */
t- d" E2 J% P. M( ]; fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ s- D, k& n3 I1 B3 \McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 _ i6 U U6 K) h6 s" n. `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 Q& g1 k) P. S Q1 Z# vEDMA3_TRIG_MODE_EVENT);) ^$ D* X D6 s4 `+ M6 Z6 U3 A
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + T$ u; ^- p# z' V# {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% F. ]6 V$ D) g' g" q: f4 b
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
0 @2 R& ?4 j$ |# r* ZMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
. |# ]4 h. W/ jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 _, Q/ L' y$ F, G" sMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
L, f# r1 B( o0 hMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 F* @9 x% k4 p$ j. ~} # r) R: Y0 P' T. a# J5 y4 a
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 2 \ ~# m! P7 Z/ `" b- M
|