|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( o4 v4 z/ r9 N1 [! D
input mcasp_ahclkx,
) c+ }' V! g) n+ _# I5 C+ Qinput mcasp_aclkx,: I6 R- {! P! C( m0 x3 a
input axr0,
4 ^" {/ ] Y) n. ^4 R. W/ G; ~: t* j* X, h. _3 q
output mcasp_afsr,- d q1 r/ A8 W, L" @ ]- |/ I
output mcasp_ahclkr,: Y( s3 r( O8 d- Q9 N9 V. w
output mcasp_aclkr,3 V. x$ I6 I+ I9 c$ \+ O: u
output axr1,
3 @: q3 \& H. i3 f% M! Y assign mcasp_afsr = mcasp_afsx;/ A+ P+ k2 V3 Q2 ~ B
assign mcasp_aclkr = mcasp_aclkx;9 c5 c8 T, a5 Y. e8 I1 U
assign mcasp_ahclkr = mcasp_ahclkx;, J# O8 G+ P. S7 ]) u9 ?; C& @) S/ Y+ B. c
assign axr1 = axr0; 5 z1 f4 H" m# N5 o3 ^1 K8 h% B
0 S" {5 Y' E. C- l* h6 i4 Z
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
) O4 V# r& h( [- J) Dstatic void McASPI2SConfigure(void)
0 F5 n$ |7 ^- Y% A{
5 u0 [ |( a' N/ v! T/ MMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 d( k" R9 } ]0 Q! H' ^; ^. AMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
# C7 J5 X/ M9 dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: V# v: p( a: Q7 J3 h Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
' J3 f V1 S' t9 jMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) E0 m/ K& F9 C& o
MCASP_RX_MODE_DMA);
5 ]5 ~1 O0 B5 [& C3 N- r% i- g& XMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 L6 l, g" q0 L EMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */# I1 y1 k* q% I
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, : G" E: B' f$ v8 B: v
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); x v4 k1 ], B2 c M6 e, ~
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 f: A+ c' F- E$ ~/ X" a
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */* {) ? Z- O: @" b7 O( t$ y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) d& Z3 N8 M KMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* d; z1 e8 i" C0 }/ I Z/ S4 fMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,3 F$ g# X) Y- p, e1 V" V. o, q
0x00, 0xFF); /* configure the clock for transmitter */
0 L* A Q6 U, O1 }McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);5 G8 Z( x) v! B: w
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. t6 I% M4 B; x2 `% C& q$ D, nMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 }) ]- G9 k# Q
0x00, 0xFF);
: r' Z/ c+ K$ E+ T% d0 H3 F
2 A: A. g, |2 \8 r5 p9 K9 F, ^/* Enable synchronization of RX and TX sections */ ' ?# S: b) D! x
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */# _- |( p4 |3 o) p, e) b w% V
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: A3 B# a1 A3 L$ s4 N4 S3 N3 _/ M& r, W# bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
9 h, W3 O" K: L' ]$ V5 M** Set the serializers, Currently only one serializer is set as
, r/ s, q6 D- e2 ~1 V* `** transmitter and one serializer as receiver.
1 p2 ?; R; P/ d/ g- G2 R9 x& c( E& R8 @*/) Y' r8 Y7 p2 G) r4 U. r8 T- m5 m
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# A/ v; I# D k7 W- [0 ~ NMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 o( `: C7 h2 t d ^2 f+ r** Configure the McASP pins ! {3 d0 E1 K) Q. C
** Input - Frame Sync, Clock and Serializer Rx& G$ O: i# q$ ^: G! P! o+ X2 |: X5 ~
** Output - Serializer Tx is connected to the input of the codec
( D. |0 U: B! A' B" c8 ^0 J*/
; m6 K( B) L. Z) r3 d1 FMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) q. [9 y, W# w; J* q) _1 zMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 k/ G) y# \2 S8 U. t8 Y+ Y( ~. jMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 @. h" _; P# x8 m+ f/ X/ ~3 D| MCASP_PIN_ACLKX1 H5 A- H8 ~7 @0 a- P0 l
| MCASP_PIN_AHCLKX U/ X" V. \( q! B2 {8 L
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
& E% j; L$ U; H7 yMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ A u U f& A9 r" h& M2 r2 ~" h| MCASP_TX_CLKFAIL
" | y+ G) q1 T. l* a# }- ?| MCASP_TX_SYNCERROR6 ]! e8 b* @: n
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' ^1 |. K# z' ?1 N1 U| MCASP_RX_CLKFAIL/ f9 g& o" [0 t
| MCASP_RX_SYNCERROR
% m7 w0 F0 b4 s| MCASP_RX_OVERRUN);
+ o7 X: q I# O6 {; |3 Y} static void I2SDataTxRxActivate(void)9 b, e& D6 s' L
{9 c6 d# \6 D( {7 x3 O
/* Start the clocks */
9 q; B; d! x/ G+ u4 n7 v: QMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) ?% V4 n, o4 }% IMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
( C+ |8 `' b; e4 R4 TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: j8 G* g( U4 C! JEDMA3_TRIG_MODE_EVENT);
) U g8 ^, Z5 P KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 ^ v# p! P8 t- T* e! L
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
9 R! @6 t2 u5 T' q" RMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 p5 k- t2 H" c$ Z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
, a" r c( W' C5 f9 Pwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# S5 b' A% Y8 L
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 w1 [- A. {, W1 |
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ Q2 x3 I$ H5 W
}
( W6 I$ r* C, _+ Y/ P7 T请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( p8 a( t7 s1 g, R |