|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,. A' W/ c9 e# b# L/ C1 F
input mcasp_ahclkx,, P( o& p0 C8 E% N1 U4 q# h
input mcasp_aclkx,
! m' {7 e$ }( ^8 k e' Qinput axr0,
- w i+ O+ n- u' G8 n
6 E5 {! Q: `/ A0 t8 eoutput mcasp_afsr,
/ s. u R* \3 Coutput mcasp_ahclkr,* v7 `) u6 ?+ D# i
output mcasp_aclkr,
7 H6 R! s/ V* Y2 O' B8 |output axr1,' w) x4 o9 q0 t1 }6 X& k
assign mcasp_afsr = mcasp_afsx;( y2 Q: d" p- x v4 J( B1 c
assign mcasp_aclkr = mcasp_aclkx;
- I1 {7 @/ a+ R9 a0 H" V' gassign mcasp_ahclkr = mcasp_ahclkx;
3 F* D& e. I# c! ~. Eassign axr1 = axr0;
2 t$ |3 z7 l- h' ~" {4 h( w f, F( m. a0 K4 `
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
9 h8 t$ ~" I' p" ^9 t; {static void McASPI2SConfigure(void)
6 [+ x; l9 S2 ?/ Z4 r' I{7 P8 U0 o+ N, {) f$ N3 W7 h, K
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
" K- @& s6 V& N0 R+ D7 \, qMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */1 a ?% Y, q" |
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 c5 B# H( d1 L
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
/ T/ s# M+ P7 R; D+ ]3 p4 fMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% u! I# e( p6 S3 aMCASP_RX_MODE_DMA);
. B" ]; Q% ?- |* a! r" j$ GMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 I- o3 l* {) _' @7 I3 O3 \! b( AMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* R1 }0 y6 P$ {* ?9 `
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 G( z$ e7 R1 M6 v! v- C4 `
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 S1 D* D8 A# B- J7 sMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 h2 {8 z }4 i5 X* MMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ {8 d9 I+ r# K. C
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( g& Q: o% p- s JMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & u" l$ N! @3 [9 s6 Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,1 B# |# I+ I+ U" F# H4 P. ?
0x00, 0xFF); /* configure the clock for transmitter */
v5 W8 l3 W' v F; w+ ^) F0 MMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; [) h6 e( p7 [# [+ Y8 B) O8 W3 j
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' D8 v5 D" q; r; P( v( V3 q/ s
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 o# F* Q4 R6 ~9 ~7 r1 Q# ~* G
0x00, 0xFF);
) F3 Y3 k4 O& l5 N7 F- [# T( R& J+ r7 B4 f; k7 ]5 o
/* Enable synchronization of RX and TX sections */
' T) Q7 W& p( h9 GMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ W4 }6 Y$ Q1 I% G1 T/ l/ zMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); k1 n3 z* Z% B0 N H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: A; m! @. q9 U# K2 Y
** Set the serializers, Currently only one serializer is set as
6 }- n6 N' C+ x! v/ G* X** transmitter and one serializer as receiver." |$ [7 p& e1 T3 k H- S, V
*/
7 }* t$ M( w# {+ KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# {) R5 K9 }( J9 ~* p2 @% m7 d VMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** {+ ~' I) x# i: z6 O1 p
** Configure the McASP pins : Z! W. Q' |; o4 J( t. z
** Input - Frame Sync, Clock and Serializer Rx% G* ~% c) G8 M S4 ]! p
** Output - Serializer Tx is connected to the input of the codec + c K2 l4 Z9 |" r
*/: A% V' g" f6 h6 N$ Y0 U: Z. F
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ Y' T" _& M7 r: WMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& |+ E& B) H1 R
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* f( R2 @* g: i( \2 ]
| MCASP_PIN_ACLKX
, q; S6 E9 ^2 J$ L| MCASP_PIN_AHCLKX/ Y% s& ?6 G( C$ J/ j7 h$ R. J; c, b9 d
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- F! U1 S3 i) V8 w
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / p0 X9 R9 B! s! A& W$ e
| MCASP_TX_CLKFAIL
# B" A* J" Q$ _4 C# q* x| MCASP_TX_SYNCERROR
8 Q$ L: Z; ^6 }1 b9 t& _4 f1 I R| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 7 m# t/ h# ]9 s/ `: x- }
| MCASP_RX_CLKFAIL
6 V& C9 l* c$ D/ c6 g| MCASP_RX_SYNCERROR 6 S, _! j! ^1 a8 t: c
| MCASP_RX_OVERRUN);+ M( j9 |, w& C% t$ |* Q2 f! Y
} static void I2SDataTxRxActivate(void). J& Q/ ~* v& g- a0 A
{
% R9 F* S- ^0 e/* Start the clocks */
/ U8 \( I# s& y h/ OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 c. u) y0 |- w; zMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
$ E" Y0 m: x- z/ C5 G* x+ i6 MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' ?3 ^9 `; `6 K" y# M% y7 ?# a8 AEDMA3_TRIG_MODE_EVENT);
, |! o) m2 Y3 Y3 s" o7 pEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- q7 W: J* G7 m4 C2 l$ FEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */2 {* p- v% h7 z
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ c7 Q0 Y- Z! Y& g4 ?. V8 bMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
q @3 U! ]7 f: [while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
% l4 k9 u7 c; eMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; F. _& Y1 z5 KMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 e. b0 g8 m* `- }' \5 {! O
}
) }6 G- F& k+ Q) j- Y, f请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ [8 g7 i; r6 {) i8 U |