|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& v! K/ g' T& J8 }" ]
input mcasp_ahclkx,( W, g' b9 R' x! L$ x% `6 G
input mcasp_aclkx,
- @. o) _8 L& S/ a0 ?1 l0 B4 @input axr0, u6 p7 _" b* k: S
, ?: l! O- K: O9 _' i0 X" moutput mcasp_afsr,
* e- x* n# a8 _9 r- A2 C p8 koutput mcasp_ahclkr,& h) D- F) F: W- }- _* o
output mcasp_aclkr,
d$ U" M# i. moutput axr1,/ {. j4 a8 m! r* n' _
assign mcasp_afsr = mcasp_afsx;3 Z6 e6 C, y+ b: P5 |% x# S
assign mcasp_aclkr = mcasp_aclkx;
4 d9 R' L0 K+ g5 ~assign mcasp_ahclkr = mcasp_ahclkx;
& a- @' @3 L" N: w6 Z$ ^' xassign axr1 = axr0;
. L4 M1 D( d7 J, z9 a. J! G1 H+ @. l, ~' ^9 D8 A
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
2 l4 B- \5 j; K8 m. ystatic void McASPI2SConfigure(void)
6 E& b3 K( ]0 D* z4 A, _{
1 l+ s- Z! J% [" e5 gMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
) s$ R* ^. ?: j! J% `McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
6 I5 \! ]' f: ~( w# d hMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 I# f0 c& E. H/ fMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ e, i: |6 k7 w; b% Z" R: e& y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 N0 G, f$ }: u2 Y% u, j1 e" YMCASP_RX_MODE_DMA);
0 I' Q% I c# D) }+ sMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& p7 B( q4 u! P- \5 k+ ?2 ?- s/ V
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */. G, C& m/ f; `
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 ~- w, w7 W5 h: A) ^* Y, F7 J- L$ |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( K$ \+ e' B {( \8 u- U* v4 g+ d
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; W8 ]. d2 [- f3 AMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */5 u7 I2 I& d0 L1 @" K+ B' p8 L
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 `% Y- i0 I$ k( iMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : J3 y7 e; B# m4 k3 Q
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
7 t5 q3 r3 Y$ k5 Z0x00, 0xFF); /* configure the clock for transmitter */
" w5 t2 k, s9 J4 O5 CMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& _/ {( L0 S1 y6 j4 g9 b3 i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / X* s! M, x/ {# ~: V; u6 h
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
i" V$ V* s* t* O7 ^' l2 I0 a0x00, 0xFF);8 A" D6 m' ]# w: W3 ?
9 o, ?9 C/ ?1 ^; `, z7 Z& D/* Enable synchronization of RX and TX sections */
W* M6 }, t; ~8 kMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 F6 b/ b1 P/ Y u Q2 h; P) Q
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);8 ~( J( W$ \' g3 O
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 G0 o8 n% c b9 h7 j) h
** Set the serializers, Currently only one serializer is set as
/ X0 Z, S3 C# V4 m5 w7 u+ T" C** transmitter and one serializer as receiver.; h; q9 @' F4 U0 u8 |/ @: D
*/
3 @' _0 d0 z! J3 Z5 i/ JMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 |- H: C0 `* ~& p$ q7 t4 O# N
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /* ^; v% u! E1 H! G( I& F
** Configure the McASP pins
' J" Y1 U/ M. a$ ~** Input - Frame Sync, Clock and Serializer Rx
7 G* q) t$ Q" W8 O, U" }. S** Output - Serializer Tx is connected to the input of the codec
; k" X2 q3 i$ I6 x*/. Z2 a: l) U; [% J, S
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); _* |9 `9 k# X! h8 L, i' J
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- M% S8 U# i8 `8 J6 K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ u" y, S0 T' b9 N* C& d% ^( B
| MCASP_PIN_ACLKX- A/ H1 b' y: k+ [
| MCASP_PIN_AHCLKX
3 C& b. @0 H! W" ~- [ V4 ?| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# E" i. D( X( @" N QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ( W8 [# j8 b3 h0 Z/ B+ D. f5 s# i
| MCASP_TX_CLKFAIL + I( }0 ]# s8 o* j( Q, \
| MCASP_TX_SYNCERROR" I! s, {* t# o
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; y$ Y: ?" N, i4 l3 O
| MCASP_RX_CLKFAIL
: `$ t9 t, X8 a, N4 X| MCASP_RX_SYNCERROR
( G) P+ x% _# J| MCASP_RX_OVERRUN);4 |+ s0 [/ H! p# y7 F% [
} static void I2SDataTxRxActivate(void)) W- S( F) }5 f1 O( u
{
# e: C: p1 X3 q: A8 U/* Start the clocks */
' U0 m0 r; L, [0 L3 h7 M, WMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 _* n i2 U. g% R) l) o' r; B% _
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */$ M# d9 E' d; x; \5 l/ a
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# U8 L( X) M% [, h) u: x' r; IEDMA3_TRIG_MODE_EVENT);
, @8 u5 M% H; x M" C4 J7 I( lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* M- N F9 _/ ~8 u2 WEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
9 Q0 z5 P$ M8 z1 }) bMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
1 O5 m9 z2 B. y4 v2 B1 k, X+ kMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
; l7 \5 o5 p# `5 lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
; d' @1 ^1 u5 C; B* eMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; a# G' ^ M4 QMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 w$ K5 o0 | l
} . ~5 ^. G6 x& n2 j& g- g4 t
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ x/ o z" a2 N |