|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, K) D7 ~5 w' b9 D1 [5 T* m5 G
input mcasp_ahclkx,
& B; E" N% a0 x( dinput mcasp_aclkx,4 ~8 r# _1 j C7 c1 T* K3 d
input axr0,
/ w0 ]% x1 Z9 N7 I; m( d0 P; I/ W
1 h) e" @' ~2 Z1 houtput mcasp_afsr,# ?! G+ f* }& }- f- O2 y0 a8 s
output mcasp_ahclkr,* G$ f ^, m% m% w5 [
output mcasp_aclkr,! M% A& e$ f6 L$ l
output axr1,
. E ]6 A1 x* d$ F3 } assign mcasp_afsr = mcasp_afsx;$ l$ ~2 N/ S$ z$ q$ t) Q" Y
assign mcasp_aclkr = mcasp_aclkx;
7 Z( M) S& x' @( T$ \assign mcasp_ahclkr = mcasp_ahclkx;# T9 b; Y+ i5 n3 ^
assign axr1 = axr0; 9 x! q9 |- P+ a9 X2 T7 O! p0 Z
+ n% X! u* `4 ]% L& K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : A" k$ H a6 W
static void McASPI2SConfigure(void)
3 f g1 Y d& e/ L# G6 K{
9 s( Y F; R# |McASPRxReset(SOC_MCASP_0_CTRL_REGS);0 Q- \* G! | _2 b, U K
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */9 c1 S2 l8 H( C* K- u% X" D ~
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& v# z# g. D' ^2 ?# W3 ~ `: C0 U
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
) f- N, Q' I( m. [McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ K! |* A$ F' x9 d# ?4 |MCASP_RX_MODE_DMA);! U- }/ X" A1 J. K; u
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 \8 O3 x8 |3 ~+ K
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% A# `) `" [2 {( Z r; G
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 g/ a& f& Y0 VMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! b6 i- n& J! o' {. x! \% D U
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * z b$ v* G+ R7 m3 ], r
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
, `9 \, z% t! \9 p$ {McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& x: u) I: {; o6 {
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " H! v. l. A/ n$ g1 X% b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 a4 G) q8 e* M Z" Z1 Q( ], a
0x00, 0xFF); /* configure the clock for transmitter */
|! b: z& Q3 X' N* y% [- R* s1 IMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( W- Q8 I/ ^7 o. w" `9 gMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - O* n4 P3 R k9 K
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. N! [ c# ]' D0x00, 0xFF);0 w4 l0 h# E, z2 p1 e. i: ]
$ w3 S# a T+ [- a- W" n
/* Enable synchronization of RX and TX sections */
: m: P% R5 d0 \$ T4 \, |, mMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */& F G" [# S( k/ }' q6 K( ^
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# M) H& y* O+ ~6 [1 N$ ~McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
* b }1 s8 x: F5 c** Set the serializers, Currently only one serializer is set as3 m0 J9 J* o7 V2 ^1 ~" Q$ a: Z* X; P
** transmitter and one serializer as receiver.
. y3 y) k9 z( T*/) l; Z1 E7 I! e+ B( {
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! l; g# @5 {, ?4 Z) H/ R( v% g7 X* b
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
+ w/ ~' F9 R5 o8 c, ]** Configure the McASP pins
9 k0 [/ U: }# E4 i( ?6 b** Input - Frame Sync, Clock and Serializer Rx
9 ], B2 d9 C% w0 M. ~** Output - Serializer Tx is connected to the input of the codec
w4 h# }. e( w7 `*/
9 f# }1 y8 l" R% `; q wMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 \1 n; S2 K5 V* L' s9 K- o8 K7 l
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 J9 b) H! e7 C0 f$ D! U" a9 P/ pMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX9 O$ E2 h, \2 a. n7 f* I8 ]7 U7 J
| MCASP_PIN_ACLKX; i8 {. w7 C) A0 l7 i- [0 l' m
| MCASP_PIN_AHCLKX' q7 D( i$ G& J; a
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
" T: |1 ~$ Z8 r& jMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 F& }% k& B; P4 W5 H q" r6 b* ]| MCASP_TX_CLKFAIL
1 Q! `* R0 Y5 o" q0 X+ d* j7 O6 H| MCASP_TX_SYNCERROR$ g2 F/ q9 B. W3 Q! M' X" U
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' u! a$ Q) Y; x, g( I/ K
| MCASP_RX_CLKFAIL
# J2 _6 {6 ^6 X+ q$ I| MCASP_RX_SYNCERROR
/ b! p: L. w4 M2 F5 P| MCASP_RX_OVERRUN);1 o: T7 _$ J+ b0 N6 l
} static void I2SDataTxRxActivate(void)$ s3 {9 d& W0 V
{- D7 q0 p r( _
/* Start the clocks */ n+ J. E4 R8 d( N1 Z; m/ D
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 V7 y. o/ f, j/ XMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */5 t7 @- ~- Z: H3 t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; v. `8 R5 D3 l% k* J0 P9 n1 qEDMA3_TRIG_MODE_EVENT);
6 U- ^3 w. I2 J$ J/ ], t3 I- P TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
; {! c2 _: e7 A8 l+ S: LEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
) G$ p8 h1 E$ U) TMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& ]6 K0 c, e w" w! S
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */: @+ @1 v: j' E1 q7 _
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
) V$ F$ I' S8 \. s2 BMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 ]' F) h0 n. w- F$ @, ~$ ?McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
g: S; T0 ^1 {6 J* |} $ q* Y6 P# [- N
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
a3 l1 t/ [# [ |