|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,3 e+ M/ I1 J6 P1 K; O2 B9 T* O
input mcasp_ahclkx,5 r; K( Z+ b. s3 x+ Y
input mcasp_aclkx,7 J- d2 {; e4 |# ~. \% V
input axr0,
% ? q+ k. B, I) ?' z' G
: U& k5 S8 c2 w$ s' B- eoutput mcasp_afsr,( O" r; O9 ?9 x" _
output mcasp_ahclkr,
2 X, `, x3 b; d6 I4 X! ?output mcasp_aclkr,
; \6 v I# L( b: O u1 @output axr1,
7 q" f) X5 e ?. t" x1 v2 E) z/ I assign mcasp_afsr = mcasp_afsx;
* B( L# ~2 l3 e1 V! m [* Z. Rassign mcasp_aclkr = mcasp_aclkx;4 l4 V0 Q2 d, L) g
assign mcasp_ahclkr = mcasp_ahclkx;& m! Y( g9 x& g; X8 q, `2 Z
assign axr1 = axr0; 4 q0 }. F7 M8 \/ D" P
9 k- |* q, F" G1 a9 j+ [0 _在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : ?( d/ X1 O V/ V: I$ n
static void McASPI2SConfigure(void)+ k9 D) o* e1 z0 n
{9 ?( X' J/ r- T
McASPRxReset(SOC_MCASP_0_CTRL_REGS);* f% Y0 J) o. a/ j- o- l* k" G: Y
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */9 d( a' b/ R/ I3 j/ h. k2 Z
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);( _+ K* U4 {" [3 C, u
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; x) F9 y' K" [9 j( v4 N0 P0 @McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 `4 D2 C8 I% e7 {0 @5 bMCASP_RX_MODE_DMA);
% W5 L4 A3 M; i- b8 W7 FMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; a+ q- P% ?/ _MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 t" ^" A; i0 v7 R
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! \! P% T( [: I5 k$ s- X3 }MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 U* g% s# S# [6 X/ [2 e& S) o0 @
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& a& a1 |* @2 [/ {2 y( @9 J, aMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, S+ V: q5 x* I! C8 ?3 i
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ W7 o' l( ^6 o/ q! j- h) |- SMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 Z# @) ?1 \" e/ R4 V: sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 f7 v8 k1 S& \7 @. A0x00, 0xFF); /* configure the clock for transmitter */
" ?; n% K8 D+ G5 P" vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; j! V2 |6 x3 i' ~
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% k0 h* M. V# ^- uMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 }* |, o, D) e0 M" ~4 r% c+ w3 ]7 ] `
0x00, 0xFF);2 e6 b0 i5 D7 ~" U L: Y9 u
}2 @3 T' d' R5 h, \; l' a/* Enable synchronization of RX and TX sections */
( E( G L K: hMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */8 i% v$ @# E8 g0 |6 |
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 A. M, v1 L9 x
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /* |; L' B5 U4 x% h8 |
** Set the serializers, Currently only one serializer is set as
! I4 K( D3 E6 x/ u5 m** transmitter and one serializer as receiver.( n/ h# b, f/ \. n4 Q
*/
) P; ^) J% M. H4 l) |8 QMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 i% j! A9 p: ~. M. Z+ JMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*4 P7 K; r& W! q: ?2 W6 Z! f
** Configure the McASP pins
3 _! w; \: z5 {+ ^# L a** Input - Frame Sync, Clock and Serializer Rx! h2 t; g4 b8 i7 {
** Output - Serializer Tx is connected to the input of the codec
3 X+ o+ l9 x0 p: [1 y*/, m* n" |7 _& B5 x( ^% ^: N H9 B
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. h* b" j" ]5 Q& |0 r6 j2 U
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 D4 c: `$ Q1 ]' K" ]) e* P
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 n. m" e5 P7 c- z/ S| MCASP_PIN_ACLKX
, D5 ~- V0 p- E6 b; d| MCASP_PIN_AHCLKX
' S) M1 t1 E4 ], E7 @1 p| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */, h$ i2 t7 z: H% G& I
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) k& L8 q+ c6 E9 [1 p
| MCASP_TX_CLKFAIL Q. b5 _$ `# \0 U! S R% o
| MCASP_TX_SYNCERROR
, V) e, z0 g- a0 q7 M! }| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 ~9 e5 R: V6 s" d3 h3 @! J
| MCASP_RX_CLKFAIL2 A* m8 t! [7 ?
| MCASP_RX_SYNCERROR
8 \# I% N- V+ ]( C& g8 I| MCASP_RX_OVERRUN);
0 G8 A" I" \/ N8 O& D} static void I2SDataTxRxActivate(void)% Z' |4 _5 q$ J% H8 ?' a
{
# n& X- V) g& h* B8 D/* Start the clocks */
) v: F: A" F" h" v8 L: |/ pMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ E% L$ u% {( ]. }! U
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */' s; m u; S" f: w2 S- }5 B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, m; p/ U' d$ I9 |- T' I
EDMA3_TRIG_MODE_EVENT);5 Q+ U3 y+ C( J, i$ k7 _, D' P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 _" @6 D% S% @- c; X
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
. M' ^4 H h5 L/ `* j. v) iMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 O5 L8 n) v7 L; [3 V# @* T) ~
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */# c2 w7 f3 b( k N/ M
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */ i! z q9 d* f2 w
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);" v' W$ q& K$ T+ J. l: c: v4 b
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
` w% T- a2 ~} & }+ y2 M4 A' V
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 ]8 ] n9 u4 o* N0 U' { |4 ` |