|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx, J+ z" k: U5 i6 ^5 b
input mcasp_ahclkx,
) `2 _7 R1 n, ]& Sinput mcasp_aclkx,9 ?8 D6 Y( c+ ~, e( f k \% g
input axr0,( f4 ?& X, B1 Z, Z9 N
* y, _4 ]! n1 z( c$ ?8 ]
output mcasp_afsr,
/ k, Y; d/ r/ ?5 Moutput mcasp_ahclkr,: U" U( ~6 m- y. j2 ]6 I
output mcasp_aclkr,
9 g% p8 S: J& @. t: noutput axr1,: A9 R! l5 e1 F! w" O
assign mcasp_afsr = mcasp_afsx;% C5 J1 E8 }% }( u. W+ E F& v
assign mcasp_aclkr = mcasp_aclkx;
) A/ k U! `! v: b' Kassign mcasp_ahclkr = mcasp_ahclkx;
; Z, B0 V* G% P' W2 X: Y2 j% iassign axr1 = axr0; : I! Y) u7 `4 n) {, M% L
% o$ e4 }: g3 n1 N ?在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
0 Y+ i. c/ W1 B F, O# vstatic void McASPI2SConfigure(void)) v7 Y" z8 i/ A( w1 C2 h l# \! s7 q
{+ b& [. x4 N5 K# N( e" d' G
McASPRxReset(SOC_MCASP_0_CTRL_REGS);) @# X9 F& _/ O! ~+ s. o+ `; H2 F
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */3 e) V7 l9 @0 E9 _, e) ~
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- }- g; S) ~& G, T! k) v& ~$ L4 }McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
* r& G4 q* {/ p5 I4 w( C GMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ k- W' z# s1 N& k$ p
MCASP_RX_MODE_DMA);
4 b0 j( k2 j# P0 y* e1 }McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. V8 h5 h+ z7 J, `( E, r
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */; V. J0 v8 x- d8 ^) a
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * J+ x" A, j) H( k! X f. n
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) q: C$ A8 c3 V1 V8 p+ rMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- L3 V$ z4 t s+ DMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# s$ u& t$ r6 B" j: DMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( O/ K+ ]) f- [% h# f1 LMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 1 V& B) {- K3 a1 @
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 W& P, a# L @0x00, 0xFF); /* configure the clock for transmitter */
4 l1 Z1 B- K2 [' I& E; tMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) c. h% \' i) i- t
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); q3 e4 j9 y8 J# R8 `- d
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) V- ~( s- W% P* U! H
0x00, 0xFF);
5 j6 _+ W) Z/ T: t& W# q) {' T Q+ L1 [7 b% h* N' e/ R1 M
/* Enable synchronization of RX and TX sections */ ( L- B7 Q' q. c) x4 B m
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */) K* d* h0 C0 v
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);8 K+ m# F* ?* D# Z( L
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
' o {3 q4 R: ~' s6 B0 k( H** Set the serializers, Currently only one serializer is set as
! s$ P. G" a1 {4 \( T** transmitter and one serializer as receiver.
" w$ ^# K: @& X0 c$ v*/
8 d. M' a. A5 W5 N( Y7 MMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
* P& ~2 }! j, cMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
5 h8 w* P- D" R. r** Configure the McASP pins
% D+ s0 C8 |; ]( u) y3 z** Input - Frame Sync, Clock and Serializer Rx& ^3 k8 h2 M! V( v6 u. P) T5 q$ g
** Output - Serializer Tx is connected to the input of the codec
7 r% W2 |' Y0 Z7 g: a3 w2 O*/5 m' A& Y! k' _4 |
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* ^8 j u7 |, p$ n" N* m
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* E- Q% s4 [( f+ r7 @& NMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
6 y3 h8 J4 q- f* w6 \9 J/ {# [8 M# B| MCASP_PIN_ACLKX* c" f6 |4 f4 X* Z
| MCASP_PIN_AHCLKX- N9 d8 R) S6 w; Q$ o9 Y
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% c3 H* g) _0 d- EMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 \9 H/ g+ {+ P. t; R3 X; }
| MCASP_TX_CLKFAIL
7 V! L7 @, w P( d1 [7 h| MCASP_TX_SYNCERROR
4 N R; I% M) }2 @| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . o4 j$ b% Z6 {
| MCASP_RX_CLKFAIL" n% {7 G! T% `/ Z+ P5 o6 h
| MCASP_RX_SYNCERROR
4 `3 Y6 A* z+ b: [| MCASP_RX_OVERRUN);
% O$ Z& O' L) x5 M `. n} static void I2SDataTxRxActivate(void)
/ ]. `: `8 w( P" y; L% R8 J{
) Y# d0 L/ U* p/ B' U3 x/* Start the clocks */
) j/ m h& B" f) K Z! J* X: E1 UMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 g; ^: h2 v! c7 _2 hMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
7 N) B& x5 e O% x2 M2 E1 QEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" ^( Q+ a7 z) H% Z- [EDMA3_TRIG_MODE_EVENT);- R2 Q: ^ m$ e6 D
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& G5 |5 O' t v7 T; oEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
: B& o+ k4 S9 F* u" j" q# nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);; [9 A" L- k @ z I( s
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero *// q. U& s, V3 G
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */( t( _: j2 f; u/ }2 o
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ O9 R1 j- n8 K' J
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, K. f `& F- O) f' ?, |9 z}
$ [7 e+ o& H" e8 b+ V请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# d6 `% k' m4 x, m |