|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
2 s; ~* A1 u* a: ?+ c n8 I) o- linput mcasp_ahclkx,( W. l" t/ @% S" m
input mcasp_aclkx,2 s: T% u) Z1 {6 u) ^! ^/ v
input axr0, f) v6 C) ]3 Z, L. v' M
! t5 `' q! t5 h( [7 goutput mcasp_afsr,6 D2 \( J) N. j' W) m
output mcasp_ahclkr,) n3 r8 \- j+ P: F. K
output mcasp_aclkr,. @, I$ n! v, _1 ] J
output axr1,
. ~2 s- w2 H( b) @+ u5 x' v assign mcasp_afsr = mcasp_afsx;; U$ F9 L" x a4 `
assign mcasp_aclkr = mcasp_aclkx; y8 a" a# ]1 J6 N+ h/ s0 E
assign mcasp_ahclkr = mcasp_ahclkx;: [5 V, c( g" f/ A; d0 H& K+ O
assign axr1 = axr0; # V. C1 Q+ o! R D* N: a
1 C+ r I: _, `$ y" `( l4 V' [
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
& g \ V$ C0 }2 Q$ t; [7 ^6 Jstatic void McASPI2SConfigure(void)9 V% r4 p$ K, |$ U B# z. A
{
" @% ^* Z4 U! O- eMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
1 H" d% x, ^& m N, N- ~McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 ?, E+ k, m0 k) J9 r. |- E! YMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' G2 I- I4 y. DMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */& R. z e0 B6 \2 ?( `! J3 h m
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 Y8 J+ H$ w, |; Y" MMCASP_RX_MODE_DMA);
$ R8 J5 j. ?4 x& I% YMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& a: r+ y2 `3 ?
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 p+ t6 w% @7 K" }McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; A8 z) O& f' _# [& R; f7 P! }MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* v3 U3 @3 R& c% Y' y! c8 ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 J2 H2 \, a6 Q! x9 e6 Z! }8 D& G
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
4 E! o5 f J0 `: ^9 B2 z/ A& kMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ P3 {0 q+ c% c5 a. h6 q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , x$ A" P: a; g4 B5 Y% W$ s7 E
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& c. q9 p" S/ l, f" q( u/ p
0x00, 0xFF); /* configure the clock for transmitter */$ @+ W: T" p1 s% ~! x" H
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 y: l$ [! T H( d2 E6 ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # [; P; s. Y7 X& ^
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," g) Q3 u/ l' U" D
0x00, 0xFF);3 N) z5 [1 r3 I) j. A
7 H5 X+ ~$ w- K$ Z# u* i j
/* Enable synchronization of RX and TX sections */ ' [; S' t) d8 D1 a/ H) r
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- \3 W- D, J. q" X
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ {+ c' H# o aMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*% r4 A& i- I/ A
** Set the serializers, Currently only one serializer is set as
2 m' P$ h$ W( ? t* E2 D# }** transmitter and one serializer as receiver.5 R1 C, T( B/ j/ }: z- V! _7 `
*/ n1 @2 F0 a( c4 F
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ E( v7 f0 j% q2 {
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /* k+ U2 u! y8 o! G; \6 ?3 I) l
** Configure the McASP pins
" y# ^) f' D& ]; m** Input - Frame Sync, Clock and Serializer Rx% ?' R1 A& g* F$ q
** Output - Serializer Tx is connected to the input of the codec
1 Q1 |0 e! V8 w+ y2 J, q8 a*/
$ O" v0 G0 C2 f! Q' @: eMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
& C7 Y5 A6 ~# @6 e# m$ {McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 ]0 L3 U+ k- Z J+ [% ]& F, NMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 a0 E) |' M5 Q' O& u9 J2 A. U! Y| MCASP_PIN_ACLKX, Z6 l B' v: B3 R6 \
| MCASP_PIN_AHCLKX
+ K- f. ?0 _1 `; [8 [2 Z+ I| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
& l6 Y( h. } R8 v1 iMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' [2 E0 M+ b9 ?7 L) D% `" m/ {7 w
| MCASP_TX_CLKFAIL ! b7 Q& K3 G: M/ m; X
| MCASP_TX_SYNCERROR7 K0 L8 i7 G u% h* O1 J
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% k4 I6 a& T! f1 }# V% Y; ]/ u| MCASP_RX_CLKFAIL
% L7 V" ]( [/ X7 x. K0 H| MCASP_RX_SYNCERROR
+ I! L# p4 k I& ~/ m$ H- B| MCASP_RX_OVERRUN);
6 F- U4 w R$ J7 p8 u} static void I2SDataTxRxActivate(void)) D7 I7 H, M, Q! V' h( x3 D
{
) [. r% I5 `) ]5 f9 y% X/* Start the clocks */9 Y$ U$ I2 W* t+ Y+ _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# f! q) X# t. C5 N$ y2 x6 T7 _/ G) S) Y8 e
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */% X7 e" s' ^0 J4 T# p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' K- o x H# A: {1 S+ j0 y# S6 UEDMA3_TRIG_MODE_EVENT);
3 T% V. v/ l* N- v* u( b9 `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
h* ~) h7 E# I' _% CEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */8 @% F& i. [( F6 _6 D
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
& i6 I4 X) m. m: W" R7 D1 QMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */2 C0 s) b4 f% |* \% [
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines *// K+ t B; V4 R
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ O1 J8 z2 E9 e% }% l! oMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);* g* N) V9 A! b- n2 [: D
} + K& ?4 A: d/ _7 X; Q" I
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& K0 k; w) {- m9 ?' _1 Y |