|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& b5 e/ R$ p; K" ~
input mcasp_ahclkx,, ^7 ?, W: [5 v5 b; p$ C7 `. f
input mcasp_aclkx,
, e& @6 c. K- m: ?7 I% vinput axr0,
8 W$ U( Q8 D3 r5 V/ K( L/ ~8 |! u0 O6 T8 ]! _8 I: _& o
output mcasp_afsr,
7 C" X8 P' Z' `3 \- Poutput mcasp_ahclkr,
7 T, b- @8 h$ coutput mcasp_aclkr,2 O# B# R/ b2 V# H$ r7 e
output axr1, y' n) X5 L% _, R
assign mcasp_afsr = mcasp_afsx;
: u4 X# m1 l: u; tassign mcasp_aclkr = mcasp_aclkx;
) j, D8 P" _% c# \7 Xassign mcasp_ahclkr = mcasp_ahclkx;
$ e" _! I9 T' G/ H+ zassign axr1 = axr0;
# D, }" C+ M; ~( G' t8 ^. U u* |1 `, X- Y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
) C5 r+ x$ t, L" estatic void McASPI2SConfigure(void)
$ v+ ]$ [8 ?3 [0 w1 t9 w2 T) Y$ E{
' V/ o- ?# ^2 [McASPRxReset(SOC_MCASP_0_CTRL_REGS);
& \( M, C- f1 k: k8 ?McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */( p; C5 _; _) k, v8 ?
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 D* R& n! Q% x7 DMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */7 w) ]- z L- q9 B' G! \
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* F/ ?8 T" D! Z) x* _# F& |: {
MCASP_RX_MODE_DMA);- D2 G7 V1 S8 l( e. @* `
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 _$ F/ v: M) W6 F1 X
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: G3 A: `3 s/ e0 M, _0 g3 nMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; ], i; z% a% v1 N+ K$ L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 ~5 _. P. h8 }1 uMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: h/ e) a c; }0 i9 i" g! LMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# f/ q. } `/ p2 q }- _' Q5 WMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: i( s( @4 s$ a0 ?: `/ B1 d
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : s/ x5 D3 @+ ] d! o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! Z3 P7 C3 C2 @' v: J% R6 A
0x00, 0xFF); /* configure the clock for transmitter */
# M3 j0 e( i/ ?& [) w/ IMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: o3 x2 x/ ?5 D! |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
7 P( ^/ q: |3 n: |McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( d3 x1 t( Y8 @# r) g
0x00, 0xFF);6 a$ A) ^8 X" q* V6 f8 `
$ y( I% t* E3 k7 F" g* U5 o, k/* Enable synchronization of RX and TX sections */
8 u3 z4 J% }: \" Y6 i( k* X: o. QMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
' S6 }7 `5 h3 dMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( d' m4 J4 N7 h( Y+ v" ]8 z7 VMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
* I) r! q* n4 e* ?, P** Set the serializers, Currently only one serializer is set as
5 O9 ^" O! |% \% q9 ]: t2 D' V** transmitter and one serializer as receiver.
; f, h5 I; o! ~2 h- \8 e4 S9 X1 f5 ]' ]*/
h; K# Y+ [2 x! b$ KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 R) r! X5 C2 sMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
6 S* V" k* n* \+ V** Configure the McASP pins 0 v. d0 q# b+ w9 {/ q! s
** Input - Frame Sync, Clock and Serializer Rx
# ^! K% X4 Q9 N! B# J* J4 Y** Output - Serializer Tx is connected to the input of the codec
0 O8 l- Q' N, \& L6 B3 C) D*/
" B v# \6 E& z: BMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) R! J' O1 \& D* Z; D/ F
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ {$ [. c: D# n1 u, Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 v+ a1 e( Y4 U$ b
| MCASP_PIN_ACLKX
5 ?. [5 E0 A$ f" Q' F7 H! [| MCASP_PIN_AHCLKX9 d' n. w; n" D2 W2 j6 D6 g
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */& S0 O8 g1 u, T$ t" [
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' d2 g# l- Z7 ?0 w9 y9 _
| MCASP_TX_CLKFAIL 5 s* [% T) J6 o* |
| MCASP_TX_SYNCERROR' h$ i# Q" r1 U6 f- Z% @
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( r1 E/ C! x& k| MCASP_RX_CLKFAIL
2 \8 r9 p+ `3 R* D; P4 D| MCASP_RX_SYNCERROR
5 q8 B6 t b& S8 N2 s| MCASP_RX_OVERRUN);. _; K8 R5 m3 C0 r) e, g5 n1 P
} static void I2SDataTxRxActivate(void)
; K( H- u+ @1 J8 c: u5 h{7 R& {" a. j t
/* Start the clocks */2 [5 c. q0 ]. G9 m3 h0 W
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" y7 h, A# Q0 X; S. NMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */: Y' l- e- G) F3 k. r4 [, ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 N) O( }- H C/ R( W9 l8 G, {
EDMA3_TRIG_MODE_EVENT);
9 i- L) x# L: M$ K3 H! y7 f( C" ~( ~EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& S$ M% _+ J' |# DEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
: H2 j9 f ~! e1 b' Q/ U; \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; J& r$ @" L8 HMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */1 |6 ~) N) S7 P/ m; u6 R6 f4 ^
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
3 t2 m& g) r2 HMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 q* ?1 S7 I* X0 H( I
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
7 V0 l) J" ~ P( O}
0 {; Q6 l, f$ x- ^* Z9 W8 v请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! o* A2 \; r2 T7 b |