|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 i9 v$ r7 X! g0 [' j$ K+ g
input mcasp_ahclkx,5 D& Q9 e. @* F6 p
input mcasp_aclkx,
' S4 I7 R. h" d9 t6 Z, w- |( oinput axr0,
% R! A/ M0 D9 H
* m8 S# F- q% m. \0 i2 h0 C, `, Koutput mcasp_afsr,3 |, c- A2 N( p' t5 _/ T
output mcasp_ahclkr,4 B8 C3 K2 ?; ]& D% ]/ e! ]/ R
output mcasp_aclkr,& b; q. ^- C7 H# T
output axr1,9 d% y7 }" \9 x( V8 Q* w0 a2 g# o
assign mcasp_afsr = mcasp_afsx;
- A$ `5 [& y! q$ P, a Eassign mcasp_aclkr = mcasp_aclkx;0 ~# d: B- H/ ]) m1 d/ q4 N
assign mcasp_ahclkr = mcasp_ahclkx;
5 f7 D4 P0 W) p4 K7 cassign axr1 = axr0; 5 ] ], V) l7 _& ?8 d
! @: a1 z5 T6 C( m7 L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 5 I! b) r2 D+ T9 w4 K( K$ a& M$ Z
static void McASPI2SConfigure(void)
4 \2 X2 b, d5 Z, D{
+ S2 r: i H: ^3 q Z. m4 B, s+ RMcASPRxReset(SOC_MCASP_0_CTRL_REGS);% b( \$ v* s, Y7 d X, e. s
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */# v& Z" O( r5 c# ?
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( j7 l4 I/ i7 k+ `! L/ p/ KMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
& F5 [- l' e1 [) J4 H/ ^# V$ ?McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ X8 L1 a2 {$ z S; V% a. [- y
MCASP_RX_MODE_DMA);
0 U& k/ x& G ^5 `McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
w* X. P# \9 MMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 s: L) u/ _8 w4 d9 U. ] E+ V/ b/ UMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ e b. T2 g' g% u' [MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ J) U! O" c ~* Z/ b1 bMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - c% ^% S3 U4 d' o+ O, Y0 e
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ \; u7 i$ j z- C& LMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* D- b$ r/ U2 e
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); # g) g$ g" C, Z& |2 e
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' u% G$ B( ?. z) u8 r0x00, 0xFF); /* configure the clock for transmitter */# x3 k) a6 h' X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 w+ l/ }% Z$ ~5 h7 @ k; u: h: FMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ K2 Y* V- i+ n6 M; m, z9 }McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 P0 R- [! u( }0 G6 Q
0x00, 0xFF);5 O7 s/ t4 ^: z9 S0 S3 b3 J
( n5 _+ Q& E \; b3 z# q, Z( I
/* Enable synchronization of RX and TX sections */
( C- C# v* I) \& M1 s. D) v" TMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
! q( M! L1 e% }7 r, u4 \8 YMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 W/ B3 \) @6 B9 y [McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 V+ s) }9 D. s- _) r A$ J** Set the serializers, Currently only one serializer is set as
$ o; D3 m. Z w9 Q8 {** transmitter and one serializer as receiver.& ]' ]: w7 f. F) }7 b# Y. I9 W
*/- ^( v& L1 D: q
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 H9 d2 D+ _% D# T1 m: c$ S/ YMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
% I' z. F$ V5 W) N# C3 D** Configure the McASP pins
2 P4 ~( U# v' U** Input - Frame Sync, Clock and Serializer Rx
; W, a4 J, t: w% t; M/ b2 m** Output - Serializer Tx is connected to the input of the codec 7 c2 m; ~# [2 h' F; `
*/
2 Q% z" Q3 s" \8 |) ?McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. T/ h: C1 ?3 U( e' K) oMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) ?) f7 k" X F2 V- ]
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: R" d. S( R! u
| MCASP_PIN_ACLKX
! T2 Q. g9 w1 [ ^5 W| MCASP_PIN_AHCLKX
$ w# S( E/ q( G| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ p* o4 Y$ S+ h1 r+ [% u4 J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 J2 L( j$ o" d( j| MCASP_TX_CLKFAIL ! `: ^; r: i" _8 f( p6 d
| MCASP_TX_SYNCERROR
( e* X* T+ P @7 j& H& G$ S* A( ^: x| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ Z1 J- B1 p3 J. E| MCASP_RX_CLKFAIL
5 X, v+ b6 a( }$ Q% k3 J* l| MCASP_RX_SYNCERROR
1 C7 Q9 g4 c9 y, u/ R: X: M| MCASP_RX_OVERRUN);
/ B- d0 v: r9 U4 \} static void I2SDataTxRxActivate(void)% F1 z+ b5 U0 X5 s# j# b1 A* `
{
9 N( H2 `% Z9 a* Q; |$ O* _2 G* e/* Start the clocks */* O3 I4 Y8 m8 p) l% G
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: w) l8 n% L. a$ F
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 v3 } g# d& r$ h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* Q& W n G lEDMA3_TRIG_MODE_EVENT);
% S! q, O ]8 x( X( G9 |( o6 HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, H( P& w( ?8 d, |EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
. w8 Y8 Y6 a$ W" lMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" x* r3 F; o1 p4 y5 D- ~9 ^
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */ e0 m& v2 Z. i# T. N
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */! P4 p& U; Q- o) c" v" @
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 d- q, N6 O" F& q
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* @# D4 V: W, T0 M} . F3 X( @3 _ h- T. C; G
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 n& P0 E& d( t Y
|