|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
- x7 r' ~) }) K( C8 H- t9 Winput mcasp_ahclkx,; v& Z, b3 w( L! ?! f
input mcasp_aclkx,
+ x# ?- D$ p( \7 R4 hinput axr0,; [; ~& m. K, g3 [
& g' F4 m' _9 t# I8 ^6 Foutput mcasp_afsr,
1 ?# `' [# Q, k& Moutput mcasp_ahclkr,
; u+ O8 F' k; j9 routput mcasp_aclkr,
3 [/ @- X7 x2 L* l) t6 Joutput axr1,, f5 Q/ E" X$ ~8 H
assign mcasp_afsr = mcasp_afsx;4 z7 u1 p2 |* ?
assign mcasp_aclkr = mcasp_aclkx;
% h9 R% k. B. T% ?' ^/ kassign mcasp_ahclkr = mcasp_ahclkx;* J$ e- Q d, g! D x- }
assign axr1 = axr0; ) J" y4 p3 Z' O
4 q' P% }+ M7 @+ T在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + a" m9 `' ~" P- a& n0 ~6 B
static void McASPI2SConfigure(void)
q6 y& \6 }' i) D: k{) M7 l/ I4 g' ?0 v
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* k1 R P. w9 iMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 _+ S! ^6 h$ P( T0 GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 C7 ~, O. ]4 ~McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */! i' Y! A/ d5 a* Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 [& o: B# \7 u/ g4 ~+ ?
MCASP_RX_MODE_DMA);
1 `4 G2 {% M- K) vMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," J7 ?+ R0 T' D9 {5 H
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */, m: }9 u0 C4 T. @1 d- Q5 Y+ c: [, g) A
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' ]) N) g( c4 k# J; Y
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; F8 e# ^6 N" S @' o4 pMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ K5 s" }1 u1 E0 T+ Q
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
6 F* A" w* y3 y, n( t1 KMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 j& G; I, @6 Y5 m2 _
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# I. g) b2 v4 W. FMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
l) H* I1 J+ ~7 _$ a0x00, 0xFF); /* configure the clock for transmitter */2 V$ W! Q, k- l
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 L- E, C; Y" M/ SMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( v' r2 W- R& Z1 z3 c
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 a/ _* C6 i3 u# ~
0x00, 0xFF); L$ Y) v6 Q# O1 ~8 |
g% w# f m) o8 r5 r5 _3 f% @; x/* Enable synchronization of RX and TX sections */ % o! R& o) j- w5 X: }0 t( y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ P& ^1 k( E% J* h: y* S) IMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; B$ N( S- M1 \" w% ^" ?& {
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*5 Z9 R: [$ k( _/ K+ |7 `% u
** Set the serializers, Currently only one serializer is set as
/ z% l! S( J$ L, g** transmitter and one serializer as receiver.
& S( v( O' W; U) F* f; }*/ f) Y& W$ n- I2 s+ q9 Y5 P
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 U- P/ V4 N$ ?: K" F& {7 q
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /* F/ r3 P6 S7 E. V v: m, |
** Configure the McASP pins $ ~ O: y/ b4 u) h
** Input - Frame Sync, Clock and Serializer Rx
/ n* J" j. {3 k f8 h4 j** Output - Serializer Tx is connected to the input of the codec
9 ]9 `6 t0 p) ?7 ?+ d) q! T*/, B& s: W8 l% B4 S% h& o: K
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( M% H* }& u4 k: z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* h6 @, r+ n5 c% bMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
, l8 X2 R [/ V; J. j| MCASP_PIN_ACLKX
/ p- a9 I$ z7 Q$ U) O, e| MCASP_PIN_AHCLKX
/ v" ` _$ p& r ~! U0 m. I| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */, o0 X6 M7 f2 b+ _: F) H/ l2 L
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 O& a8 F, t& h: \! x| MCASP_TX_CLKFAIL 0 k/ ~4 N0 x9 m) H+ Z( a+ o4 x
| MCASP_TX_SYNCERROR
% M; \6 \! V. `0 r( }| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 w h5 ?! h2 ^: F! [4 q3 _# m
| MCASP_RX_CLKFAIL8 k4 s4 Y6 O- N2 J5 u
| MCASP_RX_SYNCERROR ( Q# A' m0 L9 |+ V! X3 j" i' Y j
| MCASP_RX_OVERRUN);
, s0 V- k8 ]* J% n% K M, F} static void I2SDataTxRxActivate(void)2 j U" D* t# C7 c) S; u3 t3 a+ Q( Y
{7 p# W6 p; h |1 k
/* Start the clocks */7 l/ [0 N2 d# f6 y1 U1 g% M
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 E# ^$ q" l; X8 `McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; P, ~, E' T% j2 l" H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) E, W# v% K( t0 WEDMA3_TRIG_MODE_EVENT);( B9 p. Q5 U* r0 x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 x4 [% j6 x2 z5 X& D
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& G. u: Z* g& q3 ^; fMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 n5 s5 y, b0 m4 [McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ M0 V* k0 r' B; K @while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
+ ~/ F- j( @4 ZMcASPRxEnable(SOC_MCASP_0_CTRL_REGS); U% Q. R' {: P
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 t& U8 I m% T0 @$ J& k' K' S% m
}
' |9 Q2 e2 D; X5 Z# H; Z9 W请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: c6 j d8 f6 A, n# e: K, t: X |