|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! c- W/ [2 J, t- _! |# n
input mcasp_ahclkx,# ^4 r9 \. i8 T) r4 R2 W
input mcasp_aclkx,9 {% _& c+ _+ w4 D6 i$ h" f) v
input axr0," A, a* o( R! Q; a3 c2 C
8 O4 E7 @/ x4 s. routput mcasp_afsr,
) i- A8 w& l zoutput mcasp_ahclkr,- ?: D/ F2 R6 |9 V; T* m+ A
output mcasp_aclkr,
3 k& x; k# H. \$ \& {6 Koutput axr1,
5 n" P. K1 J6 x7 k1 F& @& F3 [: @ assign mcasp_afsr = mcasp_afsx;4 F0 x& W, b; A; s* F
assign mcasp_aclkr = mcasp_aclkx;- M4 n. H. `8 D8 C7 M
assign mcasp_ahclkr = mcasp_ahclkx;" r0 s, y0 c. h9 t! w
assign axr1 = axr0; . Y# O4 @+ o- ^/ ]
6 `9 L b* ~" k/ M1 _& \
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ S0 z2 w- z; @7 |5 R: F5 Y5 y) jstatic void McASPI2SConfigure(void)
$ K7 ~- J0 i) f' o" y% [{# r( v1 v" I& K( v# z5 o
McASPRxReset(SOC_MCASP_0_CTRL_REGS);, R6 d/ _; d: ^: s; K* d
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ G# ^6 t/ y8 f; b% H/ v6 H- v
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 u; j, m: r& d' lMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
9 i- A3 ^3 V/ G' p" e: b( }9 D9 k YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 I8 ~) X5 U9 |& M! F
MCASP_RX_MODE_DMA);3 j( a$ {7 j& n% L0 G
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( m! G8 Z( ^' r& h* jMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* j/ H* Z M. [5 @: @McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, h* u* F4 n# r; q# B" G! mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' P9 p2 z# |$ ~ ?0 ^McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& R& P$ K+ e) \/ |* N- o! d- {0 @; P- XMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
0 b, { g( e, CMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: k& E, X' Q0 W% v8 m" v- M& j f" eMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & Y, J" i A7 `* h5 O
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! u/ `+ ]: V$ R* K% ^% h& v0x00, 0xFF); /* configure the clock for transmitter *// }) q4 k2 F% X; I
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);1 p' N4 V0 x* p. |( x% C1 p; x
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : }% i* ]6 r6 G
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: [+ D" l: g; f! B* x2 i" O
0x00, 0xFF);$ S4 X* P& i4 B4 \& K. |9 a
; _$ j* h3 v9 a& m% \" D
/* Enable synchronization of RX and TX sections */
& D; ^% R$ b& X% v( wMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- b7 D9 P) `* M1 R7 ~$ F/ y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! U- K- e# l3 F4 ~2 nMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 K9 q$ {, }& [1 }5 G" Y** Set the serializers, Currently only one serializer is set as, y+ `+ N& [# ` D6 V
** transmitter and one serializer as receiver.
# p& E) e; f' E. t/ w* K*/+ G. o! ~# F& H0 [/ v
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 V4 g5 t5 v1 H1 v" dMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*3 z7 |1 S5 y f2 i3 A, V4 B
** Configure the McASP pins 4 E9 l, h" ~ t. [
** Input - Frame Sync, Clock and Serializer Rx% i. q0 ^$ e: t, e2 w( {. e
** Output - Serializer Tx is connected to the input of the codec 6 h/ z0 e, p1 |$ A' ^5 }. o! K+ p
*/' v4 l+ A$ A6 Q& [2 a7 y; i1 B( @+ |
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ s/ g* D" n4 Q, wMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; A) K3 E, s, P; s% f; w+ Q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) v/ I( i5 Z {7 l
| MCASP_PIN_ACLKX4 s0 |9 R' d) \; {- |* O
| MCASP_PIN_AHCLKX
( E- _3 \8 z( X' || MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
, Q; d/ n/ x) v$ X, {( IMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 K+ U) @& K @# W5 g| MCASP_TX_CLKFAIL
) l, ~( R+ c% k" v) j; Q' a8 m9 G| MCASP_TX_SYNCERROR
% L9 h) c, U# m, I* G' A: E| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR + r' z: _( U3 I2 o. |$ K4 U$ @
| MCASP_RX_CLKFAIL
) I8 a9 q) D- z& ^, D8 m: W/ ?' B| MCASP_RX_SYNCERROR
' G) z; Q; W$ T# q| MCASP_RX_OVERRUN);, d- ?% c$ K+ Y4 a0 C1 `) E" n
} static void I2SDataTxRxActivate(void)9 ]& }0 v2 c8 x) M; }
{
$ z* u( u& L7 @* h/* Start the clocks */1 x1 c9 q& |, H. w5 Q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( S; V( I r V2 r* T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 x' Y( V5 k. |9 R% z; y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% \! n, ? d, wEDMA3_TRIG_MODE_EVENT);
# [0 Z( ]! }# o$ ]+ h2 P: {! B' DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: e' x: [' S; ~EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
, m: K, F# N! }% MMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 L) X" P; X* E7 N+ q* O& l
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */* P% Z; h9 ]+ s) x! ~5 F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines *// [$ k! [* L6 O' H8 M
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);) I; ^& r0 t2 ^/ I' G
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 D' [" V2 z, f$ s} 0 Q" j, W3 ^, a) {' J V
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 I7 x; _3 a' V, L |