|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,5 L0 n( \3 }% X6 J9 \
input mcasp_ahclkx,! _, g' o k) Q/ w' Z
input mcasp_aclkx,! P- Q2 ^- T6 b! x {+ l/ {
input axr0,* c! `2 v5 [. A' a5 c) B: E9 ]: s
% H& `/ I9 p8 Noutput mcasp_afsr,
; U/ f ?6 H! j% U1 T5 Loutput mcasp_ahclkr,3 d! {* Y9 |# y# L' D
output mcasp_aclkr,3 O, d" q( e6 F7 o7 c- y
output axr1,% B0 _# K: q: I5 \$ y
assign mcasp_afsr = mcasp_afsx;
- S2 ^! t( N# D: J* {assign mcasp_aclkr = mcasp_aclkx;
4 _) {+ M& d1 y% q) zassign mcasp_ahclkr = mcasp_ahclkx;
- ~, t6 e- q" A9 |assign axr1 = axr0;
' R/ n) @. c" y6 a3 a5 u8 j/ K5 h5 X' ?! M
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
/ ?9 G0 ~; X( Vstatic void McASPI2SConfigure(void)
$ J$ O1 }+ s. g( `* \; K& u{
! N' s8 {( y" s; i* A/ U1 YMcASPRxReset(SOC_MCASP_0_CTRL_REGS);$ h1 ^5 H( a# [1 A1 V( Z
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */8 Z$ z1 y0 ?% C9 c
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 _* U5 R* E7 E& y+ N7 \4 Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
% C) H, }$ l' D' c: rMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 J) U' l/ m+ y9 Z8 t* n
MCASP_RX_MODE_DMA);# b1 P6 Q! u0 e, ?/ @9 v
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 J3 I6 P* T0 Y" E2 O
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ O9 c! E! e/ Q5 B! ?McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( X1 t- j3 Z+ z8 T3 e) Y5 `" [: ~ P
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 s# l6 H1 D; u) y6 b; p2 Q7 o. AMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) F% S! p" g( x. l( S- D% }7 H
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 s s9 K0 Z7 v$ q1 f
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& n, h6 ~1 W2 J A1 F2 \& Q4 p- ^McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * D, u' E; J: V
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ H9 _# u" O7 y5 L' |4 }0x00, 0xFF); /* configure the clock for transmitter */
$ {: S& N/ |- EMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
X: C" R& C( V7 B2 A7 e# I% B, U' {McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) F. e' L8 B1 X- D: M& c
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, N1 b+ J# A: S3 I* h% f
0x00, 0xFF);
5 _, l0 T2 G3 b+ q+ q) _& S8 S6 C$ R% R" y) L% Q
/* Enable synchronization of RX and TX sections */ ( d! T% u: x E. [+ v5 t& I
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
g9 D6 g( W: T" PMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
8 \2 Q9 z O) \# f: [McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
$ H& R; Q1 S9 q: F( F& S** Set the serializers, Currently only one serializer is set as# t' r/ D0 s. k
** transmitter and one serializer as receiver.
, g; e7 E- ?* F. ~+ |& N*/
& k2 k. q! ?- o2 ]' o5 v) TMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. i* f5 d/ G TMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*6 C. m% T' h" q0 j3 D; \
** Configure the McASP pins
+ `. _6 x& S$ T+ g2 H U, c** Input - Frame Sync, Clock and Serializer Rx
8 }' U! v1 q# I2 v** Output - Serializer Tx is connected to the input of the codec
6 T- { [/ i" b*/
! h6 a% k" e4 J4 HMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
2 g- z3 s( y3 j) k5 i, sMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 ~; b* f k+ [, L
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 {) d1 c& w2 A& t5 {| MCASP_PIN_ACLKX- S$ G. A" C/ t+ Y
| MCASP_PIN_AHCLKX" z4 ~9 G9 J# k3 D) W' T4 [
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ y! G+ n" I C$ `, k# c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 e8 I; g# y, n; B$ A| MCASP_TX_CLKFAIL 7 d$ s& o c* T
| MCASP_TX_SYNCERROR9 s" g+ q0 j: o U. R( s( o, V
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 [8 @ w6 g& h| MCASP_RX_CLKFAIL
. ]7 R5 F$ [8 L* G- R* i| MCASP_RX_SYNCERROR * Z) @/ E9 Y! N" M, u: ]+ @
| MCASP_RX_OVERRUN);
4 { P: J" `1 f) J2 R2 [+ j' E/ b; ]1 @5 C} static void I2SDataTxRxActivate(void)
* x) `3 c: I9 u; B& ]- C{
$ R! W; E4 B' c4 O+ r: s) c$ q' R/* Start the clocks */& x2 n0 K4 ^- i5 t) _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# l# h$ j3 v5 ?7 u, u9 NMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
, ?* j, C+ ^8 }) R, l8 ]$ [EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 U6 w5 U3 p3 g& U' WEDMA3_TRIG_MODE_EVENT);
0 z( F6 j% U# B6 p0 }2 T1 @* b2 ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! V( K4 c" x! c/ I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
" n5 Q1 `) `6 s, R" o# h) v9 EMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" D* T8 U: p: z1 R6 w, ~
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# ]4 X1 R6 e- M0 d7 dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
9 l4 C0 Y3 I' k. b8 O2 G! jMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" |6 p! [! @6 n. T& ]+ h- m
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' ]# {. ^( D0 D8 z. J2 d0 {- a e
}
0 }3 z4 M3 g: u1 \3 b) x: `请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 r2 T& W5 f- n- ] |