|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,2 @$ Y$ o) e2 ~# R0 [6 ?( r
input mcasp_ahclkx,( F$ ?7 s/ Y5 y- D. R+ v5 Z
input mcasp_aclkx,
& \. A* G. E9 oinput axr0,
% @" }7 c, Z) a' _ i! `
( W. o. S$ i2 W) M0 goutput mcasp_afsr,& X L2 d) m& n g q1 o5 f
output mcasp_ahclkr,0 y8 V' M5 ~. O3 J$ ?3 E
output mcasp_aclkr,
$ r+ K' E( }, w% F6 d7 L9 S0 |$ S4 V" Ioutput axr1,0 m7 X5 a2 [, a4 b) [: i
assign mcasp_afsr = mcasp_afsx;
! @, k5 Y: D4 P5 b6 `5 f) J3 U' {3 y/ ^assign mcasp_aclkr = mcasp_aclkx;. e8 c6 H) e! U- E" b
assign mcasp_ahclkr = mcasp_ahclkx;
1 q8 ?3 U+ m9 `7 n+ Bassign axr1 = axr0;
( U6 x" b. u: {4 v6 w4 s! j3 {: }
& c2 [/ K% {. `# W在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ o @/ j a" mstatic void McASPI2SConfigure(void)8 T1 L2 S. P& D! E# u
{' Z I) T$ C' u! Z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
S( O; [5 z1 e) w; n$ SMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 S/ `2 \( ~* I5 q) \4 ?7 WMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 O) d- x! }1 s' D6 p* c/ W+ n$ a
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */( h. k* k8 I. u! } [2 t
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! b6 T5 q& H5 e7 n; x. t5 m6 W0 s
MCASP_RX_MODE_DMA);0 T% {& r7 l% v3 j( W% z% t
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# ^0 M# _& f. R# y2 R% p8 Y* N0 D, IMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
# U _6 V0 W& y5 A& d$ _3 IMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ x" [0 J* s9 ]1 v d _; a5 IMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 L* K6 ?+ |8 _4 U7 t" iMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
K% O, M7 r7 g4 r6 r) qMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: t9 V4 Y L+ s. v# V% I4 L
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 Q) [+ |, R- \1 ~1 x9 `' _, z; @McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 R$ N6 [& F# m. F9 mMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" ?$ N" z1 e; L( C' E8 a0x00, 0xFF); /* configure the clock for transmitter */
! z) a, w* [) Y0 j& W5 G2 TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
* K1 P( m3 l( }- o( wMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); , }0 K! j+ F1 H0 i7 L& R5 `' q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 t, S( k# W/ Q4 s9 K Y, j, O
0x00, 0xFF);
$ k/ V5 Z6 V' r- M% G
* F# I3 n; A) U0 h/* Enable synchronization of RX and TX sections */ ; \5 O5 j) I& G" L; K, F% R
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
1 B/ j* O4 R3 V4 P6 {7 V( RMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ D2 ^: u; f& Y5 |
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
7 G$ o; c: y, J$ P4 D, l+ ^** Set the serializers, Currently only one serializer is set as
6 x9 n o+ |: O. B8 N9 {1 [** transmitter and one serializer as receiver.
2 f2 G2 g1 a0 b+ o*/
$ Q; }9 T& C ^0 QMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
0 m8 u0 j8 \' [2 ~7 V/ ]$ i: T2 FMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
, Z% _2 \3 x( I+ l/ b** Configure the McASP pins
/ d2 p1 l4 G; v( Z! B** Input - Frame Sync, Clock and Serializer Rx
- v; B8 L( b5 A* }1 i** Output - Serializer Tx is connected to the input of the codec
- l0 R* a+ t" a% v A3 Y5 a*/
( N1 M, P; ?; B3 ?McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! k( a0 _9 w& z" r1 r: KMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 q1 V8 r4 t# z% M* j& x; |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX0 C) }1 r+ P) G$ d4 h1 R
| MCASP_PIN_ACLKX
" |7 a( S2 g7 w" e* k| MCASP_PIN_AHCLKX
" U4 w/ u4 G, Z| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */7 e( z1 f: z+ c, \* A1 n
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR P, H4 h H7 R! _* o
| MCASP_TX_CLKFAIL # b; X. s- p' {- M! ~
| MCASP_TX_SYNCERROR
: @* \ ~1 U- Z9 @| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* q+ L* ]4 A* u2 }' O: _| MCASP_RX_CLKFAIL; f- V9 w( o; {; @) [4 D* q
| MCASP_RX_SYNCERROR
6 H x: c0 ^( |7 m% @/ B7 L| MCASP_RX_OVERRUN);$ j; w* b8 w/ V. A7 d7 M
} static void I2SDataTxRxActivate(void)
" R/ h2 w, G- x5 i{1 \6 Q/ q9 q' c) c
/* Start the clocks */
. s2 @5 R6 }. g- d vMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) e! z0 i8 m' b& b; ZMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
$ J% W% x1 l# m1 j) J! KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 z7 P! g) M0 l: f$ _EDMA3_TRIG_MODE_EVENT);! ~" I& _, v0 @( A U$ Q) ^; O
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , }# [5 w2 ]7 m2 d: O- ~8 [" ]
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 d- Z s3 H: Q5 s6 hMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. g% h8 ^+ c0 p9 O3 b( o! L
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" m8 G( Q. c. g; s6 l# U# @while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */' ^' J( Y1 a* {0 y5 z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
?# d3 x9 B/ L# M* A5 J2 QMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 ?: u5 q$ x; m6 H; ^% v
}
W) V/ M" Q2 P w请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. " f& h% f* R% f, q5 v
|