|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, V, z' j" I* w7 ]9 s
input mcasp_ahclkx,
2 O. V8 K& y) D+ a' Q' D) V, finput mcasp_aclkx, L7 w# q2 J8 q& q$ J$ R" n
input axr0,+ n" j& A9 E- L F
8 Z6 A/ r3 I- L. N: Eoutput mcasp_afsr,7 J. H1 ?% N+ z7 o0 a
output mcasp_ahclkr,
5 a2 m g& \8 w* p8 H8 K% l& loutput mcasp_aclkr,* S0 |/ s1 E5 K
output axr1,* s! g( C0 e! P3 [
assign mcasp_afsr = mcasp_afsx;
! t2 ^7 G1 i* X; U! k; sassign mcasp_aclkr = mcasp_aclkx;
) ^+ }8 a7 Q; f: M' }& e1 vassign mcasp_ahclkr = mcasp_ahclkx;$ q- Q5 X/ g4 h/ ?3 ~7 Y
assign axr1 = axr0;
' Y) q; _/ Z' y! R1 F8 |7 V$ |/ f/ b' r1 s
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
& a" y0 |0 a' T, Bstatic void McASPI2SConfigure(void)
, r! D( r$ z" |* B, ?3 {{4 ]2 D& N0 i9 l6 @/ O
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, ~$ x$ X" N+ v% M% }: U) x( \McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
1 p4 m! l3 _9 Y0 \1 fMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
& M$ F6 B& A' ?8 `% u% J' CMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */$ x( M% }. e4 [. w' @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* ]% o0 x$ ]) X2 rMCASP_RX_MODE_DMA);
5 m* v+ Y* ?8 J& e. Q% wMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- O" q; z8 x- `
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */. h( }0 D6 A4 J
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) x5 @, i. N: ~& T( d, |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 k1 w# q' L8 ?# ~* ]McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ O" g, n' T6 l% UMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 l% K+ t, m/ Q1 f
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) @" q- }% E5 p8 |! u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 @: ^, w' R4 d% `) h* ?6 M+ x3 `
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* {/ u" E( d/ e. V8 ]( D9 r- q. J
0x00, 0xFF); /* configure the clock for transmitter */8 P2 O, i$ X* l- C4 W7 S; q! S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( n( J, W! X3 fMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); }2 i6 ~$ K! n1 y3 ]/ Y1 Q2 ?
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 n4 b- c) N$ B6 c0x00, 0xFF);9 @" ^: b, O+ j4 b( x4 u2 J! A1 c7 q
& y' Q' c5 t% y/ S/* Enable synchronization of RX and TX sections */
% t& A/ [/ c' a" }2 v$ bMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */, H8 Y) r$ ]0 A2 N) i5 \
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 |. p6 R6 U7 B" ?9 X7 [( dMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /* f1 o2 i# k4 V2 L& h7 ^+ v
** Set the serializers, Currently only one serializer is set as
* b. t: X0 I+ W5 t* P3 \" X8 \9 f** transmitter and one serializer as receiver., ~0 I7 w. u% G9 s" Z; w* W
*/1 M& I, N; s" Y& V6 q v
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 `$ ?6 f' K1 B. U( c7 O& [
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*% l0 {9 b* g& @8 C" ?3 U
** Configure the McASP pins
/ Q5 `# g. r6 }2 k/ U5 W5 a W** Input - Frame Sync, Clock and Serializer Rx8 V1 v. ]$ W, z( y; O
** Output - Serializer Tx is connected to the input of the codec " |/ @- I M! I0 p+ I9 G
*/
9 U6 p$ P; \+ b( W# pMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! P3 e9 J# Y- H3 {1 UMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" @2 j0 E) |2 k5 W1 u3 d# C
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 G% `9 p3 C! X1 j/ }
| MCASP_PIN_ACLKX! D" T# c( }8 v' e, Q
| MCASP_PIN_AHCLKX1 s) Q' U: u" }0 T+ u
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
/ ]' h# A% s% }# F) B3 t8 F& \McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 S7 e: _( {7 G
| MCASP_TX_CLKFAIL 7 z. ]( g" m; D J ?4 R( b
| MCASP_TX_SYNCERROR
0 S8 i" x( o; t# x' G| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ o U( t K5 b+ h| MCASP_RX_CLKFAIL
% i. T" r) N7 V; t: m| MCASP_RX_SYNCERROR
9 O, x: l3 K) |* j, s' || MCASP_RX_OVERRUN);/ o& ^7 h0 v) [& |
} static void I2SDataTxRxActivate(void)7 V- w3 e' l9 o& o7 t1 R
{% E! y; ]. `+ Q- b5 L% f9 M
/* Start the clocks */
D0 o3 L+ B& H: LMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 W$ P5 J, ~. x: s ?- B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */9 [6 i! }& j1 e/ g2 k. z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: o+ t* S( b9 O! I& E2 O
EDMA3_TRIG_MODE_EVENT);2 A9 Q$ C; d8 F6 |6 b- G$ r. U
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) b" W2 m) A1 J& N# q, rEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */5 C$ S' P/ u8 l2 E9 m! ~
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: P, r% o( z6 z$ nMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */( R. a( ~5 U$ X+ y8 J6 T' ^% H/ o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( k, X6 c3 c) ^$ kMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 s" p+ @( p1 N/ f6 Q, E! A' fMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: `& O! |. r* P8 U- g7 ?; \}
( E) k8 ~' h7 I2 Q( D7 S请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . @/ F: _2 X* U6 z1 g' P& {" `
|