|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,: ]3 L* N3 O2 _$ }" K- U! Q! @
input mcasp_ahclkx,
* i$ I- G# o# N/ B. @$ Linput mcasp_aclkx,
6 a0 t* C! }6 T! @4 Ainput axr0,( M6 \2 n3 ]! ^' g; Q2 F# m1 }2 \1 U
W8 G1 O+ K8 b$ z, D& J$ E: S
output mcasp_afsr,5 S; B- M. C* p/ U
output mcasp_ahclkr,- _' N3 T: e# X) j
output mcasp_aclkr,
+ b& }* v" }0 Q! b/ Routput axr1,
4 S. ]% J* m( F( { assign mcasp_afsr = mcasp_afsx;, n* v/ s8 \2 p2 J6 l$ j+ ?. e
assign mcasp_aclkr = mcasp_aclkx;! N' t" ~/ v3 Q( s4 F; j5 H# o
assign mcasp_ahclkr = mcasp_ahclkx;
+ o: ]6 m2 X$ |8 F- q, xassign axr1 = axr0; " l4 X. C- Y, k# [% |2 w' W* I' k
. \. P& `2 l' i( |7 ^0 r
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
& @. { U2 z u$ Y9 Ustatic void McASPI2SConfigure(void)
, ?. @" }* ^) G/ P/ z5 b' L{% k+ _( U0 f' P2 _& Q6 u
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
t( I% p$ a2 X* CMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- J' d6 H" C2 k' P( `
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 @! b! h/ A+ T) _* P7 z- z
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
: B" g5 R7 ^0 |) D. dMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 K: M/ @7 @: _$ W+ q
MCASP_RX_MODE_DMA);
1 p/ \, L9 i8 D1 J0 v* xMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ a5 L m: x. E$ XMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 n4 J! h5 R$ f1 p( S- P
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 0 E9 y3 q- I2 H: V4 I; R
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 e3 @; s& A: f' t+ c# {8 R
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- m: M/ t7 H/ Z$ S( [MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
7 V2 _* y9 ~# \. H. eMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 T5 w+ |+ C$ {& bMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( K2 W: p7 F! [5 e$ k( Y, C9 d
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 P2 d& j9 x4 k% i0 v
0x00, 0xFF); /* configure the clock for transmitter *// }! g" Q9 |- u I
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( l, z2 i: l/ m- k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- v- D% g' P4 T# KMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 m$ s" J& Y) H7 _
0x00, 0xFF);+ e- p0 O, I7 [4 _. c1 ]( \
. M5 J# ] _$ v6 S# Y0 q' d: y
/* Enable synchronization of RX and TX sections */
3 e: D7 U5 l; v5 A% \7 lMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */1 @, K* w3 H! |0 @0 N* M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 Z, D# D6 E1 e0 a! j% H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
$ k) t# P' [" J** Set the serializers, Currently only one serializer is set as
8 [% g% T3 f+ k** transmitter and one serializer as receiver.+ G4 q9 d! Z$ ^; i
*/
: C9 p% {. P% ]+ L& M$ M" T5 }# rMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ F: T) w( ?+ L
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 A& A( k1 F, N# ~$ B/ C
** Configure the McASP pins
' `9 B0 Q8 C; R) o3 O4 a7 M** Input - Frame Sync, Clock and Serializer Rx
% T" X0 w: A. ~, R, i** Output - Serializer Tx is connected to the input of the codec
5 F9 p* j# n$ a0 F9 o1 B2 u k*/- S; W* v$ _+ o" u6 i' Z; q8 N
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% t0 N3 ?0 o/ z% L% l" e/ K9 q' ]
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) {& e# E+ P, k9 `: t1 F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 ]5 @ J; [) Y! l+ D( Y% }* f* z| MCASP_PIN_ACLKX# e% m3 j2 f* j$ i- V
| MCASP_PIN_AHCLKX
4 p! w1 |5 g, |4 D2 F| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 ^' k' B2 m5 U5 j# k8 R. D
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, Z2 X: P$ e) v$ T: c7 h| MCASP_TX_CLKFAIL
A0 O* A3 p% R- B7 D| MCASP_TX_SYNCERROR
7 O3 e# u$ Y8 k6 w| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR S2 R- `! g, X: d8 G' A
| MCASP_RX_CLKFAIL
' r( K* ]% t) `+ ~6 w" R9 N| MCASP_RX_SYNCERROR
- j/ c8 Y+ Z( J G- J| MCASP_RX_OVERRUN);
# G# \# N& e( w( L+ P; L& U5 E5 ?$ @} static void I2SDataTxRxActivate(void)7 K2 v. q A8 k& ?2 j, F
{
# B$ @7 a8 B7 i5 q: h7 t" A/* Start the clocks */
. B+ T$ ?" \3 t% GMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# ^' J/ y H" c9 U/ ]
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 ~. K/ t f6 p3 {; [3 P0 O" N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# ~0 |- k" M0 HEDMA3_TRIG_MODE_EVENT);- x- A8 A6 N/ d. U5 w- ~& l
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) [ n3 B! ~* a& Z4 c% z& O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 B* |' o: [: y, l) X
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. Y8 g6 y( w! q/ A
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
`" u& e C8 f, x Y* Bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
q( e* H t1 ~! iMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
" U, u* J9 N- m, p: x! G4 fMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- U S% @% a$ S( I} * {6 U; J8 v- ?3 q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" O' M: |3 s! K) W! I6 q+ ] |