|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,. l6 S( E: y0 `- i- I
input mcasp_ahclkx,
. Q; E9 r, ^9 s- ]; Rinput mcasp_aclkx,
5 r! c ~1 ?! w' V2 w3 yinput axr0,
/ @1 o( F* T. Q8 z" u3 l
/ U- }. g! g0 O8 p8 x5 routput mcasp_afsr,6 d$ p- F( U6 _' Z) D$ E+ o
output mcasp_ahclkr,# J! V. V& |5 _, f r4 {) z
output mcasp_aclkr,: Z- K2 H% f8 K) _+ l0 Q/ U" |! O
output axr1,
8 m( \/ c/ m6 p6 ~# L assign mcasp_afsr = mcasp_afsx;
6 N+ U* x+ t* d% S" \- R+ [assign mcasp_aclkr = mcasp_aclkx;2 j; _0 V- m8 \& i# C" @& K+ k% Y( f. \4 f
assign mcasp_ahclkr = mcasp_ahclkx;! c# k/ t7 ^7 O8 t( @8 D) P1 P
assign axr1 = axr0;
" z5 i' J2 {* D! t/ w% s; Q' E
$ Q1 T6 u, G+ F+ q在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 U3 I7 D5 L) u! d) {static void McASPI2SConfigure(void)
, Q: ?2 C; P. A! [& M2 G; J' Y{" U2 z" J) w# A! s4 O
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
. ^7 {8 J' [) ~) g- `6 SMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
! \( m6 Z" t- |$ e% yMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 ?. C: P: Y5 ]$ FMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
6 d0 C+ x2 E1 M/ ~' L9 C, d3 aMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; C/ @$ v/ Q. P. `MCASP_RX_MODE_DMA);( p/ K( |2 t% r3 V) H- i5 v
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 N: w' g) p# B. j; @4 fMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% g+ G9 v2 x/ C; V. F& A5 W0 N( q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ v# e: z3 ~" m% N: S% q
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, b) E4 o9 S! @! h) n: zMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
8 [+ Y7 ]/ k4 m/ q# DMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
9 ?. e+ t# X' x& W/ |, WMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- Y1 g" r: F: Y* Z" A) m
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 `) z# B5 K; c
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 B! {) U3 }' r7 h+ \9 E0x00, 0xFF); /* configure the clock for transmitter */
% C. X/ t, D5 Y& }7 [% RMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 D# k( S/ I' ]( }
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
[- Z3 l. J! t' b( N. U. gMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: g( @( |' A1 @9 ~1 |0x00, 0xFF);
+ u x% X+ T+ f7 }
0 F& L0 S U: ^: R/* Enable synchronization of RX and TX sections */
" J: g' C7 {4 }+ X) B' f% KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */% G. g- {. X9 y" F; l
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ e Y* r P8 x; y" j" nMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*6 `! K1 Z9 ]# E
** Set the serializers, Currently only one serializer is set as, a4 ]9 {0 e' C( R& j1 @8 K3 A9 b
** transmitter and one serializer as receiver.: U+ r/ |! f+ f, E/ R
*/
1 p! T' b4 s+ w+ R9 AMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 \1 }0 j) r/ ^ q' T+ p# YMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
' b9 x. g6 B) g" Y( R$ R** Configure the McASP pins
5 ~, g% T% `; F) {** Input - Frame Sync, Clock and Serializer Rx
1 H9 O% L( D( ~/ p** Output - Serializer Tx is connected to the input of the codec
* k" H7 E H) ]; l3 ^' E*/
* Q% y. i; Q4 `1 W' f iMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 [$ N4 F4 S5 A) S6 P- c& K7 e
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, k# {6 K x+ \" a! }
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, O/ K' i9 ~$ \! M* o/ \; N: f
| MCASP_PIN_ACLKX- @4 R; h' G# ?& j/ ]* C7 N
| MCASP_PIN_AHCLKX8 @* j; g* v9 {/ P
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */% B/ ~) u! y: Q9 X6 v& Z6 ]
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR * y$ ~/ ]* z/ }4 \+ X
| MCASP_TX_CLKFAIL
6 w$ n3 h; n$ Z| MCASP_TX_SYNCERROR/ Z* w- d+ R, K0 Y& N; ~# ^
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 M! J6 {2 t$ H$ J- j7 x# x| MCASP_RX_CLKFAIL
! H+ J9 r1 Y3 R- Z| MCASP_RX_SYNCERROR ' S6 B3 a2 z6 c+ Y
| MCASP_RX_OVERRUN);
9 q; E7 }3 K# R, j' \' x; T} static void I2SDataTxRxActivate(void)/ y% _4 z0 z& H9 U& k$ Z7 t& U
{
" h9 y, v+ V/ Y% ]9 Z" c/* Start the clocks */' k2 o/ }" t9 u" Y8 ~
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 ?: ~0 Y+ w* m1 S4 N5 F, H' U. `McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 [* y) M- p& \5 F5 T J* i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 I; U# p8 u1 v4 g; rEDMA3_TRIG_MODE_EVENT);: F& K' t: h. p2 m" P) B G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 P4 ^2 v6 h6 r9 D2 z: n
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */4 Z, p2 W# \' v' b* j! x
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' f$ U# q2 d7 ~7 {0 BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 V2 g) a! u$ |" r( A k# |2 c' ?while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */0 ]! h8 D8 b) w8 |( z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. x1 e4 m+ I1 y( B& v6 n
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
0 ^0 j; y% j, j0 B5 C! L3 }} 8 H* L* S1 }9 V2 S
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . _* v1 L& ~5 K, B, C: W1 K
|