|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ m% c) X: V5 Q# Y2 C; m
input mcasp_ahclkx,
& j1 v4 {$ H$ q9 K% Einput mcasp_aclkx,
! y) S. q3 Y* @( v6 u+ |1 tinput axr0,
- x) a3 j# H% _- `4 J5 ^! |! O; _* |& Z8 ?
output mcasp_afsr,
/ c! [+ G/ O9 {: U# L4 Eoutput mcasp_ahclkr,
5 A% g' \2 [, a; m% toutput mcasp_aclkr,
* H6 U/ v! U+ }8 o% t% soutput axr1,% i6 a( S' o; b' N# Q
assign mcasp_afsr = mcasp_afsx;% M2 G7 a/ p+ J, o2 L
assign mcasp_aclkr = mcasp_aclkx;
Y! M9 [' u0 Fassign mcasp_ahclkr = mcasp_ahclkx;2 t) z7 ?! I( b8 |
assign axr1 = axr0;
& z+ I J$ Z7 V8 z. x4 e( H8 p9 g$ g! q2 X5 w8 o9 m
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 $ N% F/ J7 V% ~/ C; V0 g+ u
static void McASPI2SConfigure(void)- |; K3 l% k- {3 J) N/ @! J
{
- ^8 T) Z5 i3 w4 X1 M! g: j) C% bMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 g5 h, _* D! QMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
5 r. J( f6 x' b4 p! g9 EMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" w) v) s/ i! P n0 A
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */0 [5 e- ^# R! K' o
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 ~4 B3 H3 S: o% W: [' B' {MCASP_RX_MODE_DMA);' y( o w J6 P' P' ~
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! G( m+ m3 ~* L# CMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* A& G" }$ U n/ x6 i# oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, H! W# |6 E$ p9 q$ F: [
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. a, ~3 C- j4 W0 s5 C1 yMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 j) V7 s/ N* f! O
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
) {9 [- Y1 W5 G6 r# n5 VMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; ^; a7 {+ R. V
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' n( D1 d6 G) K& @
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! n* J4 |4 v* h0 v0x00, 0xFF); /* configure the clock for transmitter */
d# X. v5 \0 eMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); m$ m; k: P0 z# d& G2 R& C
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
|2 _1 E3 a2 }8 l8 v9 CMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 M0 F0 f+ f& m1 k5 e8 N2 A
0x00, 0xFF);5 T' _, j4 q8 P! V; \1 o
- v; D8 T4 G, D7 ]$ E! |9 l5 E/* Enable synchronization of RX and TX sections */
- w& _5 W0 @7 B" P8 d/ y) F) tMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; {: J2 f. i$ P
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, O4 {5 T1 i: L* D2 ~# e
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
" u! b" A- }& k) m& L' k" o' u/ q1 q9 U** Set the serializers, Currently only one serializer is set as
( r4 R1 Q( A! ^5 @! Z: }# i** transmitter and one serializer as receiver.
" q4 f9 |8 x) }6 p" b*/
! p/ G! r4 h0 G* x) C) P. yMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);3 `7 s% v+ B( H9 ]
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
( u6 j7 L. f; y1 C; a6 I** Configure the McASP pins
. [8 @' ^! L- ^. y6 \- D. D; Z** Input - Frame Sync, Clock and Serializer Rx& w' l' Y( f9 `7 i9 o1 y2 d
** Output - Serializer Tx is connected to the input of the codec
* M' D' e, o. ~! F' k/ t$ L8 ]*/! B! d, E2 _1 ~
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! {8 a [; I \7 u( Q8 E5 h
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));9 t9 f5 B( K. C
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 X, p( L) c4 Z5 V3 v# o& U8 |
| MCASP_PIN_ACLKX" c, t* A' v2 ]. Z% m' P9 H
| MCASP_PIN_AHCLKX
% O. U- q! X {: J+ S$ k! t| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
. i; j/ }$ k9 G- KMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # n4 P9 j9 `. T4 k6 A
| MCASP_TX_CLKFAIL 4 g; Q( @5 j) v1 y5 c2 X$ f4 U
| MCASP_TX_SYNCERROR
" ]: }+ G: j& l) @9 ]/ ~$ k| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 h8 Q k7 @$ P+ Z/ F& v( g| MCASP_RX_CLKFAIL
1 V2 {5 e; L& K1 R; d8 ^| MCASP_RX_SYNCERROR
& n w/ k0 |) y6 ?7 p, \- ^| MCASP_RX_OVERRUN);
% l0 y- E n+ f: S} static void I2SDataTxRxActivate(void)& q# z/ N7 N: W
{8 A4 E0 `1 n; A$ O! t
/* Start the clocks */
9 s& D2 X' e" \" n, G$ NMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
( A3 j; X. O5 ~0 n& `) E9 dMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */! F) x( B2 s8 {1 Z1 `+ [* Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; p) `4 u' E9 R* z y) R
EDMA3_TRIG_MODE_EVENT);
( `5 R. P6 |$ d' z/ L' IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' d% s8 \) Q, ` h% g" DEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% U( y( Y) M6 H% v, i# ]
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* [4 L& g+ k" Y9 e2 I& P
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
2 `' y5 x5 Y8 [# i5 ?) D) Rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */8 Y; f* P% Y; b2 D8 U6 P& N
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, G/ y5 j0 B$ mMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 C1 n3 M0 o: f/ q6 U) ^/ C# R6 |
}
8 p O/ l: l b, ^4 ]& Q请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 N T+ ]! s% ~
|