|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
# G# V0 I) @/ D$ R/ yinput mcasp_ahclkx,
! `8 X. e- e, Iinput mcasp_aclkx,8 p0 ]$ G/ m, M$ x- V4 X
input axr0,
4 c9 c" M8 k) _. P" j5 G- _& i, y7 @' c
output mcasp_afsr,2 K* e4 ~: }& `0 \" ^& @# B
output mcasp_ahclkr,
! {- u. }. G/ I5 b" d1 coutput mcasp_aclkr,* [" {- t$ V |' b
output axr1,
5 X2 V' o; @+ I( M1 c assign mcasp_afsr = mcasp_afsx;1 h' k- e4 Z2 a+ U/ w
assign mcasp_aclkr = mcasp_aclkx;0 w9 G, \( }* }% N4 K& X) j
assign mcasp_ahclkr = mcasp_ahclkx;* D- v' ~' u' t- _9 u
assign axr1 = axr0; 5 Q" n& H% K3 ?& N
6 J2 @, q6 {4 i
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 \2 w" C9 ^3 t7 b
static void McASPI2SConfigure(void)
& q' ^/ Q; ?# O{
) h8 u4 O! ~4 F3 a* R9 q2 y1 S( aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 s; @1 t! m1 N R. s( G+ N* R! vMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
2 E$ r) m [) g8 A& ]4 I# i! f* XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 a2 K$ V& o7 F; {" q4 O
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
, x& V/ a2 S$ E1 ?6 y9 ]. ^4 a$ Y0 L0 rMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& L( l0 c" ]9 R' N; jMCASP_RX_MODE_DMA);
# _5 C# M8 P) ?3 FMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( _' f) H# U3 \# y! x8 d% s
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */' z0 Z1 o4 V: {" K) v
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 o: y: k3 ~$ C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; s/ e4 y" V' l# o( t8 r5 `+ CMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 @7 Z. W- t4 d6 {MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
& j# ?; j* X' VMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 C2 W2 G# R t1 t IMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & n b0 v! ^1 \
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; s' V, S: I/ ~0x00, 0xFF); /* configure the clock for transmitter */
/ M8 u% n" @6 g8 m& g Y2 E/ Y TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( M, T! a( h1 y3 p( f/ }McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, u/ v' d( Y" _" O& v9 X2 iMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,- P9 @ C8 @8 i8 _( G
0x00, 0xFF);2 X, `$ X" ^, G4 u9 A9 w+ ~
" M/ [7 E* |1 p& R$ k& v
/* Enable synchronization of RX and TX sections */
0 p [! H8 v3 @McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */. ?$ y. R; P- Q+ V/ n4 G5 Q* D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; W/ b4 W8 K9 d1 v
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*# a, a* q, d, v, d* ]9 l, b
** Set the serializers, Currently only one serializer is set as6 r# K) f" }! U
** transmitter and one serializer as receiver.
4 `9 _) `0 R% }) E*/" I- ~3 \7 U2 |( A
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 ~" V5 W; I4 o7 D5 HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* u, ]4 i& P1 m, B. A** Configure the McASP pins
/ _ d8 K4 |3 F" A) ?% S** Input - Frame Sync, Clock and Serializer Rx
. P# P f6 A2 j9 _$ g** Output - Serializer Tx is connected to the input of the codec
% X% |( A; p* L! N, O. `% G*/
8 C$ F; q( w" ^$ g! }( SMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! M' K) P/ K) _
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, x9 q% [) P' _; q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- d8 g% t# i) D5 j9 Z| MCASP_PIN_ACLKX. |6 U# m9 e$ K$ I
| MCASP_PIN_AHCLKX
0 y. y; @8 H" v) T5 ~8 X9 v| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */" z9 C. t) a+ l& E% V% g: ?. J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR : ~1 R% J" S/ W5 k1 [
| MCASP_TX_CLKFAIL
5 x% ] R! J0 x9 f) V| MCASP_TX_SYNCERROR3 u0 ]" ^1 u+ c- {0 }9 g- W4 b
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " Y. U* g; A# O
| MCASP_RX_CLKFAIL8 w- w6 i4 \4 V$ ~5 o' T4 x; I
| MCASP_RX_SYNCERROR
+ m1 Z! y G$ D% Y$ Y! w8 T| MCASP_RX_OVERRUN);$ i% d, @% y4 [. a4 ]
} static void I2SDataTxRxActivate(void)" z* ]# f* W) D8 C4 D% Q. s
{" Z. J. \( q# h6 N- E
/* Start the clocks */
0 A _9 h" ]. G: ?McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 k% v: Q" p; k- j9 C0 Y# U
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */6 u8 R1 s" F5 _* j0 C1 u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" G4 Y8 ?8 T3 M$ nEDMA3_TRIG_MODE_EVENT);
; K0 T) d3 O5 T7 iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
n1 P* L" k, q! D9 qEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
: l. n: ^0 n, E0 T; Q1 d0 r O& ?McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' S8 E3 H- W* {McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */+ d5 Z' h* Z% a( _: C
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
$ {0 ]2 w4 T" f0 jMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 u% p9 P* ]9 R; K/ m. s
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! {5 R1 e1 [. B- u1 K+ {} 5 T$ G7 G! s$ w' Q( v
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 g$ E( ]- C6 o' \ ~/ ^8 ] |