|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 o# \+ q9 Y# s! q, Kinput mcasp_ahclkx,0 `' ]" J/ G1 r H8 S
input mcasp_aclkx,' E7 [6 Z: h: I0 G$ Z
input axr0,/ |2 G, k+ P8 |" o5 J2 C
/ ? h, A. n: I, X) `0 M
output mcasp_afsr,
- @0 O( I' H3 |! toutput mcasp_ahclkr,' g( }% E5 I( k% p
output mcasp_aclkr,& R# u3 B& n0 h2 w7 Y8 y
output axr1,( v0 G U. x5 z$ v5 u: h# E2 T+ S
assign mcasp_afsr = mcasp_afsx;
. T! ^) ^! {9 L+ a8 L Aassign mcasp_aclkr = mcasp_aclkx;: M- I) c( M8 I0 H' O
assign mcasp_ahclkr = mcasp_ahclkx;
v! y+ O) |, ]) ^/ ~assign axr1 = axr0;
4 c6 a4 m# U0 i
" T% {' C7 Z' M% R在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
0 S- Q+ w' s Y7 u- Z% H7 `- ustatic void McASPI2SConfigure(void)
4 X" t3 \8 v& l a/ n{
. i* J( Y* Q+ f/ C* _4 fMcASPRxReset(SOC_MCASP_0_CTRL_REGS);1 O6 n) a2 K& y/ d7 E& P. |
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
' q$ K4 Y, U6 w" Y. `McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ Q! G- b! L! D0 nMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
t. B% S7 ]( s* X5 F7 o3 YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. T K) a8 X+ ~1 b$ ?2 nMCASP_RX_MODE_DMA);
! w+ U( @ K7 r7 MMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 I& h; B! k. {6 `0 V7 S2 {: M/ {9 a8 M) b
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 j( c5 @( `9 B( v
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 P. u' r% f, B8 s
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 |0 Z( u* @* n$ JMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + n5 P4 K, b* Y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
$ a8 d8 X L* D1 X8 |McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 R7 W. t+ J# {4 I% c% a) [( I
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); / u4 x; M# U" e7 X8 q
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- a. l0 ~, h& q. P: N
0x00, 0xFF); /* configure the clock for transmitter */
; w2 w$ g l4 X1 H6 Y7 j( X7 o, X$ kMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
6 R9 c. `% J7 C* y/ j0 cMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * {( Q, }: W" L! o3 s; [! |7 t {
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ W; N- T5 W) T d$ @( |, ` D7 B0x00, 0xFF);) `; f" h' _ P+ M3 ^
, }! p4 |5 K* z1 D/* Enable synchronization of RX and TX sections */
" y! q# q. a- f: d DMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */4 }% o2 R5 F% u
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ Y: ~# }5 K3 F4 a& tMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: q3 F" [4 |5 A8 q
** Set the serializers, Currently only one serializer is set as
+ v. X0 _+ S: H# I% L! d** transmitter and one serializer as receiver.- |; Y7 b) v3 t2 i6 Z. _3 s# j
*/
6 p5 w$ e* G9 {) w9 ]McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);4 l- S- h m( [% Y4 J, y1 t+ e
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
1 e4 Q/ \: p1 s# e** Configure the McASP pins 9 n5 G) ^% R9 [. {. q
** Input - Frame Sync, Clock and Serializer Rx, m/ M4 K0 j$ h0 R7 b
** Output - Serializer Tx is connected to the input of the codec / W9 R/ E( u; e6 c
*/
- t& s; F2 `5 n6 j, WMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, F4 [+ `" B7 U
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- f( g+ m) d7 m; U
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" n0 c% y7 ^8 _7 U% u$ v| MCASP_PIN_ACLKX
9 Z1 F7 O) z2 w" M/ ?: w4 R" @0 t8 I| MCASP_PIN_AHCLKX
/ B) s9 s6 q3 d! U+ @: H7 {- e8 B| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
) s: u' Z: r) ~ _: JMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) v0 J, I6 R' h$ q" Y& c
| MCASP_TX_CLKFAIL . |" l8 j/ M5 N9 h, _# ^. M
| MCASP_TX_SYNCERROR
2 ]* O& ?& D* @* }3 \8 G| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ [5 a4 Y9 G, |+ Q' d$ X+ W4 J8 ~| MCASP_RX_CLKFAIL8 J0 ]1 z4 X- V: @
| MCASP_RX_SYNCERROR T& I$ h3 L9 @! E; h7 S, j
| MCASP_RX_OVERRUN);1 u( I, x- S) b) G3 G
} static void I2SDataTxRxActivate(void)
) O1 G/ D5 t6 L1 \' q{1 W0 H* }0 M V Q
/* Start the clocks */# V8 I% T8 Q1 M% o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL); n- K, a. G0 Z1 g" P6 F3 f3 p
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 w7 }# ? e1 o Y/ F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( p0 x# F0 Y2 n) R) ~: K+ m4 D6 bEDMA3_TRIG_MODE_EVENT);
5 s" I+ M1 i9 E \2 NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 ]! e4 w+ M1 EEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ p3 `( {3 r/ fMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) S. p( c5 F7 G4 K0 ~5 v+ sMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) q; Y. Q' z- z# ^8 n. ]5 v
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */8 c& \" ?+ O/ b, c$ {
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);* N( a* p1 X" k$ C& @' a+ t
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" |5 Y6 F2 A2 V2 a! c}
: i( _6 U+ T: v$ x/ v, n8 x8 i+ g请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 p, W9 C ?' O$ x8 w2 a |