|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
9 X, y! j* P( |. O' [# h0 S8 pinput mcasp_ahclkx,+ {' R( w R& o+ ~# n/ I. n
input mcasp_aclkx,
) U2 X1 f5 [+ c# Y+ m( Iinput axr0,& x7 {2 m9 U6 ?. K
: f& ? E9 z0 L8 {2 Y
output mcasp_afsr,. [+ X3 q0 v5 ]- _! N
output mcasp_ahclkr,
9 K8 M/ X, [8 s3 {) Soutput mcasp_aclkr,+ L( Z; N3 s- e
output axr1,
( ]1 d5 c8 d6 {$ y& a assign mcasp_afsr = mcasp_afsx;/ w; d ^" H4 v1 L( `
assign mcasp_aclkr = mcasp_aclkx;8 ~/ I+ m( c5 f- K/ j" L1 n1 y
assign mcasp_ahclkr = mcasp_ahclkx;/ a% q1 y7 U0 c' Z2 R4 k
assign axr1 = axr0; , V* p' x# t) v$ v4 f9 J
: Q$ F: g* J6 i! @( ^: N- `4 z在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
: B+ ~/ J. y! K0 |. Jstatic void McASPI2SConfigure(void)- O- g4 O" I% y2 U. h
{9 c* B8 a! `1 U2 f H5 S
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
~; V: ^& |" @7 N4 y0 z% A! TMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
' x5 {' k# U5 o" g+ S) o# p5 T% }McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 @' d( a& i# F9 k
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */, N/ K1 X6 l) t( z. H% C% ^
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: N! m- P, f1 i$ D
MCASP_RX_MODE_DMA);
5 B6 }5 \, R2 E, H. ~0 D ]# _McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 W% e) t. U; ]' I$ H$ v) w, @5 cMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 a9 @: y$ g. H/ cMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # |4 X1 w# B9 A1 L% ]. H, U# {
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); e' w4 u! I1 p. ~7 V2 n! ~. T0 c/ M
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ g# Z! z6 \; K+ ~: y2 A: X
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */' ~* F# [0 _% W
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- w/ d: a1 `$ P6 }McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 D0 `- `5 i! T6 s
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* {+ F* n8 _$ H3 @0x00, 0xFF); /* configure the clock for transmitter */, a& _3 U# A% I$ J) |
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& a {% F5 l2 @! Q0 gMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& g) ]8 q3 U4 N! b7 wMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ j3 i$ T4 u) P, E$ m0 h o2 `
0x00, 0xFF);: k9 a. ?# }0 L% N9 p9 R, Q
c9 I9 i( i5 U, S4 t
/* Enable synchronization of RX and TX sections */ % ^+ X1 c& f( W; C: Y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ m: t" a* ~2 m5 M6 JMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 p7 _1 Y5 a- \3 f3 P( z, n' [- kMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 p% W9 ~4 ~+ b% q( o% V. O& U
** Set the serializers, Currently only one serializer is set as1 N9 Y9 e! N( O, E/ E
** transmitter and one serializer as receiver.
8 V4 g' H0 p* c, |; ]+ }*/" X; F9 q0 D0 j7 Z: e- g
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
S' K" O/ Z3 R% P) g+ [McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /* r3 D4 T: Z# R% Y+ K/ N
** Configure the McASP pins
! J( @: B- A0 X" p1 w2 m! I** Input - Frame Sync, Clock and Serializer Rx" y* p# _8 W/ o3 S
** Output - Serializer Tx is connected to the input of the codec
- z$ W+ j$ |) m*/
: U9 K" A* i1 U( O- [2 m+ }McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 z! b& g- i7 w6 ^7 l+ SMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
' o7 d" z" i0 j" H0 x/ `McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX9 j, l: x& b0 h) M: a( v7 H
| MCASP_PIN_ACLKX" ?: t! p7 f+ U2 G& x& p
| MCASP_PIN_AHCLKX
! \4 Z, w* y( T$ V| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */& g/ t9 }' c8 W/ z) E o
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 B& _5 Q6 I J+ [: k: ^| MCASP_TX_CLKFAIL
+ m. `* }& n C# P5 `| MCASP_TX_SYNCERROR
/ [& p2 O8 q3 j' V4 G; C8 ]$ @( I' Z1 z( X| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& }6 t5 |0 K( H8 q5 v# X \7 c \| MCASP_RX_CLKFAIL1 [9 v# O( H7 P0 R% D/ ?6 K
| MCASP_RX_SYNCERROR . y3 K# X+ B7 V
| MCASP_RX_OVERRUN);; M4 u6 {8 O4 v. h
} static void I2SDataTxRxActivate(void)% z' Q2 g* r/ t( E2 N) l
{% \# i* d! M. a& Y0 {
/* Start the clocks */, @" U3 f" }! K4 L8 ?
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% j5 T9 j$ y1 k Z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */. r1 w; O" j: A% z: V, F$ x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, w9 }0 y2 Q5 A# y* O9 w# Y8 V
EDMA3_TRIG_MODE_EVENT);
% D! ^7 Y, O, I* B" g: c' TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& l! k# r9 v& H MEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
4 w V4 r0 E" Y M2 u/ h3 }% s! jMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 o+ j' B: K; g8 K
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
2 K8 ^& m, l& N# twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */+ o; E1 B9 A; Y R$ l
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);& |1 G: ?3 \/ O% X: k
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' O2 o) `. J; K; F, P0 d
}
8 F& _5 H9 ^' `, x6 X$ {请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , L8 A) x. [. Z3 N9 z
|