|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 V, B( x6 T* ?, [% V& Xinput mcasp_ahclkx,
8 Q5 i! f: ~: N+ S# i! Ainput mcasp_aclkx,' {3 Z, `3 I7 W
input axr0,. k- t2 C/ h+ @. I9 P6 i& v
+ k9 u! v$ }6 X: V
output mcasp_afsr,4 t( z# A8 u% g
output mcasp_ahclkr,
$ Z& B7 d/ X" z% o3 q* Ioutput mcasp_aclkr,5 G( @( x W+ a u- A2 `1 w- ?. E5 q: z
output axr1,
* ^$ f6 i* T$ c* w4 } assign mcasp_afsr = mcasp_afsx;
v' v$ D+ J. r: c1 a4 f4 G! n+ x2 @assign mcasp_aclkr = mcasp_aclkx;
. X) {2 d+ i# }, T5 Tassign mcasp_ahclkr = mcasp_ahclkx;
' Y, F2 J$ V' ~- C7 @assign axr1 = axr0;
0 }" j8 K. h! c4 r5 _0 n
& V5 t: U( d9 l N在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
. L$ |; r. H9 Z, y4 k' G xstatic void McASPI2SConfigure(void)/ P: c+ N" a3 t* ~' B5 O4 b" T, G
{$ J6 b; q$ j9 n
McASPRxReset(SOC_MCASP_0_CTRL_REGS);2 \5 R- b4 r+ f( ^( M Z
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 M$ K- S, l! X! OMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 Y5 W: w) [7 h% z4 D- N$ ~! jMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */% ]( Z- S6 R- \8 M8 j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. N0 I, `5 k: u( U4 R
MCASP_RX_MODE_DMA);3 r- H0 B! k0 e5 m' a
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; e' v7 F, @+ y4 S/ {: Z/ c
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' A+ X$ l. u0 C) o: i& n% V8 QMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
# |4 G. a; h E# A( \2 @. d$ fMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; M4 J. S: k- v( @McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; O* o% Q/ g3 J( a/ u) C6 _5 GMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
1 j. T: l1 E, }- c1 D. @McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& ]) W/ p! q( F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , v! s: E9 O; U# r$ o6 O
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% V v- t6 I* ^3 p, m0x00, 0xFF); /* configure the clock for transmitter */( x1 A$ H- o7 b3 U2 e, L1 o
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, ^8 E9 M$ F, u9 b* ^; nMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 x1 d3 U: T; x
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- J4 K8 u( O7 U6 } l2 {" n0x00, 0xFF);$ b0 s9 o/ m) T' _3 E4 ~, g
( O$ E( R( `$ d5 E! n) H/* Enable synchronization of RX and TX sections */
: A* M8 W$ i8 L' e9 U/ H+ n! PMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */: ^8 a; N# T) t; m& `0 y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 \, p9 w/ S( x' W
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
# Z/ Z! `5 o0 B5 X** Set the serializers, Currently only one serializer is set as7 D5 M& B C1 u
** transmitter and one serializer as receiver.5 ^, b/ F) e$ ]; O( u/ H
*/
6 [! j4 E/ H1 c7 O' e$ L5 QMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( m: s4 O1 y* ?, mMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
6 S P+ k* ?3 F; d' e8 }0 N** Configure the McASP pins ! x- t% F$ d7 { o2 L
** Input - Frame Sync, Clock and Serializer Rx
& s: B0 y2 z! _6 ^** Output - Serializer Tx is connected to the input of the codec
! e- K, o, V+ ]. N*/8 B2 Z; Q& S( X1 R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 ^/ s; B' N E+ gMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. ~+ R" g) e+ QMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 a$ ^ B- ^# s! Z- D! N5 F( r| MCASP_PIN_ACLKX
7 j0 R' o5 A" G* `8 e' G$ T, p1 k| MCASP_PIN_AHCLKX
) I% f4 Q9 x/ P! H. V& G l| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */7 B! i/ R$ R4 U E: ^- m
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' P* O3 z( e T* ^# s! ?
| MCASP_TX_CLKFAIL
6 i. r8 I# S! O3 G0 a| MCASP_TX_SYNCERROR3 U+ _% Z. x9 a. U a" z
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' d7 ]6 T" x4 m8 u; Z| MCASP_RX_CLKFAIL$ I8 C- [" g% O4 Y5 a
| MCASP_RX_SYNCERROR
& B& V- t9 Y/ K# L j4 M1 }; G| MCASP_RX_OVERRUN);4 U9 {0 c0 S, B7 ~
} static void I2SDataTxRxActivate(void)
; w f1 h8 V, b. d ~4 k; ?% e{& O7 I; s( E$ ~; ?/ e( b& o& ?6 _# W
/* Start the clocks */, L; G3 ^ X# `. u# w8 r
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 _. }5 X6 _2 uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */6 g: p& s4 I+ F' i7 z$ I7 ?4 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* A. h& Y% {& {' | zEDMA3_TRIG_MODE_EVENT);
7 I8 [3 H3 E `2 a/ i y! ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / ~! g. |8 W O) D& r
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
, V* T7 W. `) `9 F' i) aMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
0 Q0 n6 t1 P- |7 m. Q: G7 {+ O) H2 x* r& PMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */$ E& f: d/ ~8 ^ Q$ n
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
9 m4 q8 q1 i, }( J/ c/ {9 z! E2 \McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; _- P1 d5 I; f, G' j/ t; PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" {7 C3 _3 K2 L$ \}
8 X5 `- }9 O* c+ r' c) M+ X5 E请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, `3 l6 X" u, {# r |