|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
& h/ F4 R+ K6 J4 \# A4 Cinput mcasp_ahclkx,1 J8 S1 {; a5 E
input mcasp_aclkx," t8 X0 I+ {' ^- X) ~
input axr0,2 w9 Q) C" F* P2 v7 @
3 w( s, A, U- h* k& s1 Poutput mcasp_afsr,
0 k+ B2 T3 `! O% v( r( Routput mcasp_ahclkr,) |( w3 P; V) F; m% _
output mcasp_aclkr,. t5 q' k; i- W! Z5 Q' k) C; V
output axr1,
/ [/ [! y* s! U% {6 e assign mcasp_afsr = mcasp_afsx;/ Y' S6 b7 e; s
assign mcasp_aclkr = mcasp_aclkx;7 N y6 _) G! B* a
assign mcasp_ahclkr = mcasp_ahclkx;
: O' W; b6 @- ]% k0 O1 Tassign axr1 = axr0;
, p8 y( r6 v* K- u3 `; u9 V
2 o, r0 m6 y$ z; F& D7 ^在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 w/ Y* v/ r* h" Bstatic void McASPI2SConfigure(void)
. D4 d+ y8 H a) s8 j, d2 j{
+ Y, I. _6 L) eMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 _( J N- ?0 p; w8 n+ TMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
' O. Z) \" u. k& cMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# L q/ E/ N) a* c
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
9 G2 Z; W- Y" x; Q! g _* E, H+ d; PMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- h, ^2 d8 @) W7 J2 j8 lMCASP_RX_MODE_DMA);# R9 I' V; n0 z( O/ h
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ [" W4 T% z7 F2 aMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ k3 V$ v* I+ K+ b' Y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 d) Y) {: U+ z* ?+ d. t) c
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( T' Z! ?% Z- S+ X2 ]McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ' A5 y$ Z D) x
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- P9 N; O& H$ r+ ]McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. V& [5 u/ a( T
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + u+ O% U v+ B8 g# `9 }
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 Z8 J: D- i- |% G: `( K
0x00, 0xFF); /* configure the clock for transmitter */
! ^, t5 O7 U( GMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);- s( T5 ]( n: w( o" v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : ?6 {3 v9 H) G& B, _: `8 ]9 n* m# v& g
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% d9 W0 ^, O7 `* a
0x00, 0xFF);( k, i( _$ P: P6 u
5 a6 H7 `. l/ V3 ~9 {/ G6 |/ T
/* Enable synchronization of RX and TX sections */
& l1 `9 g' y0 qMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; b7 f) g, s" PMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' R4 B" _; v# L. f) R3 b
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*" n' X9 _% v \5 |
** Set the serializers, Currently only one serializer is set as
) {/ \+ G3 `. |1 A5 l" J** transmitter and one serializer as receiver.
, J4 s0 R+ y) K: g*/
0 Y& g/ e/ ~$ l* IMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ c8 p2 j5 _1 W- J9 I4 z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ y2 _3 y0 T" Q' O* D** Configure the McASP pins ; b6 ?8 m$ Q# i; B
** Input - Frame Sync, Clock and Serializer Rx
: L, H' Q' M. y** Output - Serializer Tx is connected to the input of the codec 4 ^7 T" q/ \/ M$ _& j
*/
3 O. y: h x. }3 A" ^" f& ~McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: V3 s. F/ a, e( S# ]7 D
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( l/ T6 H- o2 [/ a7 ~
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
# E9 n3 b4 b- Y% |' n0 R| MCASP_PIN_ACLKX
4 j( b- _6 w9 X/ n; C| MCASP_PIN_AHCLKX' B& ] ?: Q& W6 K0 j
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
1 ]; k9 t, \2 _$ eMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# v5 F& H* R$ s% h. `| MCASP_TX_CLKFAIL : T9 w( v) I7 f3 @2 f1 S$ K! n. n) I
| MCASP_TX_SYNCERROR
& A' x( v/ V% V0 j& r* ?| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 Z1 q; t) W c; r$ `9 w4 ]. W
| MCASP_RX_CLKFAIL
" C* R- _, |, Z/ y' x. S3 t) R| MCASP_RX_SYNCERROR 9 Z/ T5 X( z- F7 e0 G
| MCASP_RX_OVERRUN);+ X3 N4 ?& X! U& }# c3 e0 \
} static void I2SDataTxRxActivate(void)1 E: E* i3 V0 D* y l
{
6 T1 \# {& D7 F/* Start the clocks */
! J' x M/ S* P3 M# [* R5 ^$ `( _McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 u! j2 e2 W5 C4 P" o+ TMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
1 g$ w" W+ ^7 HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% ]8 F& q- b. q7 u
EDMA3_TRIG_MODE_EVENT);8 [8 H, e2 ~: `3 \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 ?+ R, C( h/ e: p' T( x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% _) F& W1 @& b4 X: s- V7 d# E
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 ]* I# ~. Q& @& qMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% s8 j7 c3 C9 k5 t5 Uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */: \2 h$ S2 Z& t- L
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, ]! a5 `5 f+ [- l0 SMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( N6 e Z+ t. [}
& G! G) I6 R5 z2 w: x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ! l8 u$ e! P0 R! x8 _+ ]- y3 V5 V; e6 B
|