|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
0 C6 M) a- x. X: uinput mcasp_ahclkx,! u* f) _5 o( P6 h2 c0 ^7 ?1 h
input mcasp_aclkx,
0 o: ?, P/ ]; a/ g& qinput axr0,
% j7 i8 `% v) C* V' J( Y: _- i) t. N+ q, Z% ]2 h
output mcasp_afsr,' M1 e' Y$ Y1 E6 O: e9 V
output mcasp_ahclkr,7 ^8 u. c( E8 {3 Q
output mcasp_aclkr,- e3 R" ~, {1 h% u1 O
output axr1,
6 O3 @- d& r: X) w assign mcasp_afsr = mcasp_afsx;# S0 c0 B8 Q* Q+ O
assign mcasp_aclkr = mcasp_aclkx;
4 P* u. d" C3 `2 E- _assign mcasp_ahclkr = mcasp_ahclkx;: _% [+ Q3 D2 f6 e/ i: r' p/ M
assign axr1 = axr0;
- G; `/ a3 n, S0 Q. x
4 Z! }0 M; N( @在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 8 E9 F4 w& w/ r
static void McASPI2SConfigure(void)* w0 U5 T4 B! r0 U2 s
{: v* B% F% F9 X, @
McASPRxReset(SOC_MCASP_0_CTRL_REGS);, Q$ @! n7 d- Z" b5 W
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
, h- [/ q$ [ HMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 v" X. T2 u( E+ k: P% ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
1 x% [( \6 z$ Z9 u) E7 Z' o, ?McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) g% Y. O7 n3 O1 v( m+ eMCASP_RX_MODE_DMA);0 D* } w6 r. q) x
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 t& B! V0 j% k# b; v
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ {) `% G d, N# l& p6 GMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ i/ D7 m- v& x0 i& t" A. M+ t' sMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* q! k) `/ g( c' k4 |. @
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 z0 L8 R# `( Z5 D- G. D* I% W
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- ~: `6 \% o/ h9 ?McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 p8 k* k! e2 n ^McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); y a( U: q/ Q4 s
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( V, _& f7 J& n& n0 B5 S1 Q& y
0x00, 0xFF); /* configure the clock for transmitter */
, d% Y( b H' l! y/ N; OMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ C6 ^5 n9 \: ]# }McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 z' d) @, e7 ZMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 D3 g8 o1 Y2 F
0x00, 0xFF); a3 O% ` @3 \: x
7 N1 t" W2 O5 w" v8 }; j, R
/* Enable synchronization of RX and TX sections */ 7 {% j6 M7 n: O" R
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots *// n/ x D( `# \" G( ~" }' J
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& W) R1 ~* g: h% l8 K* K5 J8 A
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*, s8 z3 {$ a( Q8 G( u
** Set the serializers, Currently only one serializer is set as! T% N1 A* x0 X3 L# V
** transmitter and one serializer as receiver.8 w% ^% u/ x! u' f8 l
*/( g5 j9 T& I" R, _# i8 m
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ E4 Q6 s, u% L2 n0 ~
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*. J+ ^5 D- S2 m x- b: E: k
** Configure the McASP pins % x& h P4 {6 ~8 k& \
** Input - Frame Sync, Clock and Serializer Rx' m4 k" d4 G/ f, t( ]/ Y
** Output - Serializer Tx is connected to the input of the codec
6 d" ]6 c4 x$ o& J! Z# O) j*/
) p& g+ w8 a6 o# n zMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) M& u- n1 Y a' i6 `+ Q* y: |
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 j: Y8 g# S! F7 G5 ?* CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
h/ W! _+ G5 o2 ~| MCASP_PIN_ACLKX
$ Y$ p, e6 o$ d- |3 H( M| MCASP_PIN_AHCLKX
. e9 n7 N) V( P8 E: P| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */9 i: M4 ? }$ V/ S" Y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % W& G4 N8 j v, u1 `! W) F j
| MCASP_TX_CLKFAIL
6 X* @. {: k2 ]0 V| MCASP_TX_SYNCERROR
: a% |+ {( t4 e! v# j3 A9 o| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) k" t, A) X' ^; }* u y| MCASP_RX_CLKFAIL9 j9 c. c5 g8 e6 i
| MCASP_RX_SYNCERROR 6 T7 C9 o2 |9 G- U8 x
| MCASP_RX_OVERRUN);; S7 m0 s5 U) _4 y0 \: I
} static void I2SDataTxRxActivate(void)
0 f% t+ a5 v `: ?7 A# s y0 q{) M8 N3 @5 o( i1 b
/* Start the clocks */8 N' Q& w, M- p1 H9 ]- j6 O$ l0 [" z
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 w1 _; I X9 c+ S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */3 M8 e0 ~4 S. Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 h! @# Y7 m l0 u$ T( s
EDMA3_TRIG_MODE_EVENT);. i% m, F0 c1 F' l" o* [
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; ^: Q0 h, s) z! l
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; q. s( `& n+ IMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 \9 S: q% _, z- {( ^- k- W
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
8 I: n8 }; u1 |: `. z" {while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
+ F* ?5 f6 S4 t5 V0 k+ \: _- B5 T, I' {McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
6 U3 o4 [# W L) m% T) M! RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS); n) f; r3 l t) E6 C
} 3 z0 ?" P( `: n* j6 U- W3 h B. y
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! y# ~* l6 x% r. E+ R. b4 t- Y4 b, f# A1 } |