|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
/ M) \+ d+ m. pinput mcasp_ahclkx,
: m& M9 y3 S6 Q8 \* I* k! x( `input mcasp_aclkx,2 @; ~( n! A, {; w+ `; M
input axr0,
# m$ ~2 w3 r7 R$ Z8 R6 {2 _$ k+ r
+ L! U8 _) _; y$ g' n5 voutput mcasp_afsr,
; p7 N- T/ F) k" E woutput mcasp_ahclkr,
; g! M _! a- z4 g+ x. moutput mcasp_aclkr,5 t5 n5 y4 M7 ^
output axr1,; o7 ?7 d' \- |6 S( [
assign mcasp_afsr = mcasp_afsx;
% L3 D) \/ P7 Wassign mcasp_aclkr = mcasp_aclkx;0 b. D0 i. ]- O+ B% E
assign mcasp_ahclkr = mcasp_ahclkx;$ C6 |; S: K7 {7 j* p1 C
assign axr1 = axr0;
5 }/ l) ?: b/ o( p4 f k% n# E& e4 Q4 y6 W/ O0 T" `
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 6 Z- I8 p9 \# E0 }
static void McASPI2SConfigure(void)
; k6 ?6 O; q6 c M7 J{
# H! J* @4 K/ }! L. d$ _McASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ |3 k1 n% t) m5 q2 HMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( l2 C) y5 u8 ]. \! gMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ B5 Q& Q$ T8 Z7 b8 y( \- |0 Y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
, h& q4 }& t0 B" u0 |; \McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, x z" ]0 C4 F' P5 L' c0 j
MCASP_RX_MODE_DMA);
. B9 [, a2 R2 C! _0 uMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ |, I0 Z$ n0 F# U8 Z1 q' w
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! H# B1 t3 O) c$ `! z9 ^McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 k; d4 y: Q5 ^1 \- SMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 t* x5 E" }# Z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: F& \' C h. H6 H% M( cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" r8 l) x+ O: ]" X3 h8 s! p4 j
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, w7 u: T9 @5 O2 |McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 6 H* ~9 E" i- c+ V8 n" q
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& Y5 E2 f# Q. t7 F# U4 D0x00, 0xFF); /* configure the clock for transmitter */
2 o; m5 S' }4 ?1 J' t2 N1 R; |McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 Q0 r, B( Y U# F( c3 k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # W2 p# O7 B/ Q1 `2 g/ n- A+ n" P
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" n/ E! ?, `4 u+ \0x00, 0xFF);
/ Y! [" d5 S2 H& }$ W/ C) r
+ c, m8 d. L$ t4 k/* Enable synchronization of RX and TX sections */ 9 E4 ^* X1 Q- _0 A
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
* h, x/ y* f+ I, l5 C4 T" _: }' lMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 k4 E# n* e' Q8 P5 D6 I) W$ p7 @. EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
7 m" H% \- f9 C4 J+ P** Set the serializers, Currently only one serializer is set as
: |7 H, } R T; \0 Y** transmitter and one serializer as receiver.& H9 u. T5 n7 ^9 h- S' q N5 J) T
*/
2 \, |8 W6 v6 \6 ]6 }9 \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: H# }" z6 h$ Q' ~1 u, _+ w3 H9 NMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 v `- U7 Q. A$ S** Configure the McASP pins . w, T3 K3 D( i% y, m5 j5 c1 u- ^, V
** Input - Frame Sync, Clock and Serializer Rx
1 {$ G# ?! r) h# `** Output - Serializer Tx is connected to the input of the codec - v' c/ f$ [* Y( o1 r k
*/ ^5 _ p/ d$ Q1 O; P7 H/ w9 N! k
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 C: G# n3 E9 T7 WMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 h- Q5 W' V9 i- E, c: S; M
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" j" K! W$ S1 J& h" V8 [
| MCASP_PIN_ACLKX
% {! f. M' w3 k s4 Q% L3 ?| MCASP_PIN_AHCLKX
3 J0 C; t- H5 B- Z' V0 F3 \# X| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
3 a$ j8 @, e( N, Q) w e6 i$ jMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' q, m" {5 e X1 ], X9 j
| MCASP_TX_CLKFAIL
& n& @) B }5 D" m| MCASP_TX_SYNCERROR0 ]% N, e% z: V4 h
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " I9 s% n: r7 I1 n
| MCASP_RX_CLKFAIL
0 \5 F) X/ l: s& z4 t2 q) D| MCASP_RX_SYNCERROR % t" j; r( `1 w+ M n
| MCASP_RX_OVERRUN);
9 \. f4 i& P" x0 ~$ s0 p1 d% R. t* s} static void I2SDataTxRxActivate(void)" S$ z# i. ]4 g% I) [% C
{$ O: [+ U5 T+ }' k, n1 g
/* Start the clocks */( h/ l. E# Q" g$ Y* R1 ?
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
& @5 K- t; j/ }, k! @, [# T YMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */# z( X' q( d# |6 C4 B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! Y4 a& N9 k) w8 |6 y6 IEDMA3_TRIG_MODE_EVENT);2 N5 b. s# `+ |. Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; g3 I* s5 H7 ?' R' I0 P
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; a+ n' E' [5 a4 W/ eMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* r5 w F6 t" z. @9 u5 v3 q3 x; @McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
' E6 l, Z8 j1 x* z' X: {* Swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" Z$ @$ ?( E& i. g1 w4 B/ A3 ~& g
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, w5 ]8 q8 a; F" o- hMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 y$ F- G4 @4 m, r
} 8 u- H3 P; R: I1 N$ X: T; I
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 w$ O( o* L9 U5 s) V9 U |