|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- x4 f( W* N/ y" @- E/ L
input mcasp_ahclkx, H1 H$ _/ n& k- u- t! H
input mcasp_aclkx,
: x7 D. V% \/ q5 E4 binput axr0,% y2 D0 f" j7 g1 f8 |, S( D
, o3 y$ c' D% z( Koutput mcasp_afsr,
4 f- c$ N" b P+ j. h: `output mcasp_ahclkr,
/ y" i: p- ~9 N5 u- @output mcasp_aclkr,$ x! x& q `' T: k) d$ x2 E
output axr1,$ U1 o( V2 a8 R6 `% w0 @* ^
assign mcasp_afsr = mcasp_afsx;9 `* H9 C& L4 Q1 ?0 k* y- j m1 L
assign mcasp_aclkr = mcasp_aclkx;( u: W0 n: p( y
assign mcasp_ahclkr = mcasp_ahclkx;6 W @( u: b( x* y# z0 l
assign axr1 = axr0;
2 d+ C6 v" o( M7 a. Y6 B" ^% E6 f0 r2 T- s3 M
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 # h, g: e: Z. ]/ z! r, g
static void McASPI2SConfigure(void)
# o( v" I3 t$ ]% w) o{
3 f/ _) d+ [2 r) V5 O' I# C PMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
s m9 v$ C2 E; `7 A" ^3 E$ aMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
" ~: [ H# a7 B. E3 I9 BMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# b( I+ n- M# _' r
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# v5 s( h& H/ Y3 i
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' g* {$ }$ t+ v9 D2 y9 X2 q1 JMCASP_RX_MODE_DMA);
- l& H+ T; c5 }7 u* B- D, aMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( R; j' S f H$ u! L% _
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- e$ }' ^, m$ D# t
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 _; q7 _; B( e" E% [6 n/ r
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
]8 x# B5 H% ?, @0 |* G( \McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 V/ }4 c! q4 G- w3 M+ _ ?MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% F0 r" D6 _( p: H& f0 M4 ^$ k
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& u% [" d0 f! f/ N
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( n1 U5 H3 G5 j5 Z. G* lMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- ~- q1 U1 x% ^ d9 m+ H+ f
0x00, 0xFF); /* configure the clock for transmitter */0 Y: y3 J0 v! f2 T! s/ V9 u
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( f- p$ S1 ~8 l" g
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( L7 m6 Q! u! t9 C) K
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. s& D7 S1 Q% x% e: |9 T0x00, 0xFF);
& w v3 t6 _9 c" a/ A) i; e, r
- _& F% J% l7 t' V: K1 G8 X/* Enable synchronization of RX and TX sections */ . G2 R, d, i8 y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 r) ]# \4 L" N2 R* eMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);8 Y9 S' ^/ E: f6 H F# H- K$ a
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*$ \5 y, C" ?5 O- L2 V2 w1 I
** Set the serializers, Currently only one serializer is set as+ \2 D& l. `$ Z" c, {! i3 S
** transmitter and one serializer as receiver.* _+ K" |2 G% ~( e# `2 ?+ m
*/0 s1 V& m( [0 a6 b2 K0 k$ @
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 I1 \' |0 l1 `6 XMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 T5 O2 w& |' h' H& h! X
** Configure the McASP pins
0 W+ [% Q# X4 u1 \** Input - Frame Sync, Clock and Serializer Rx
2 v% w( ] v e( m) L- b6 v** Output - Serializer Tx is connected to the input of the codec 4 x8 E& x% R r9 o8 d# n' V* d" N/ j& a
*/- s8 \, J0 ^5 h4 c' y& x, A
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 H" U! K& ?, m
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* f: j& X+ q+ n; _- y) a# c
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 D- {, G }2 c C& D/ s" }' u2 u| MCASP_PIN_ACLKX2 j; f6 \- N% {2 k0 Q* t& [
| MCASP_PIN_AHCLKX9 L+ Q) S0 R5 @5 F& \+ X' Y z
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
6 J; i& C1 W, b! T2 @McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 T! C7 y/ _, S0 y4 S' A* [, R
| MCASP_TX_CLKFAIL
* ^4 v4 s, O" [! H" o+ l| MCASP_TX_SYNCERROR
& u1 y& X& J5 k0 I" ~| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 t5 g" ]1 d& A- V3 H: K+ @6 z$ d| MCASP_RX_CLKFAIL, w0 T1 Y# n! U
| MCASP_RX_SYNCERROR / ?3 p+ U' F$ T
| MCASP_RX_OVERRUN);- |0 c' k" k8 P" e, m8 m% ?
} static void I2SDataTxRxActivate(void)
`! y: t* c6 c: `( Z' J{
% L( o: N0 {- Z }/ J* [/* Start the clocks *// p- G3 |. y" [( a4 _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* b, n4 V. ]' u$ C5 E: MMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; f6 V9 B6 q% c2 DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,- \0 Q$ s! D9 ^3 R
EDMA3_TRIG_MODE_EVENT);
. \1 f: P" f& o. D. aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
8 a: M9 T6 z; E4 t( X( I8 yEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */ s* a+ H: _7 z$ _7 O
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
# ^, b& _/ v8 w/ }, O9 d' OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */+ S, x# c3 u- g' ~. C
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, k! i% m# H: x+ g5 fMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 v6 f* o) Q4 h. n. WMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 S- I% D+ O/ ^* Y/ r5 C! ?
}
! n# @. T M7 A. d+ X, B4 x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' w2 Y- K* Y% k" D3 r2 R" _
|