|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
1 W. I" W& y' A# iinput mcasp_ahclkx,( u D, d) `6 L( \2 c
input mcasp_aclkx,8 m, e" a% e; `8 X' J2 I. {
input axr0,( p3 u2 y1 U$ _" F$ R: J+ P
) v3 [! U# `- q/ s' n# m4 y
output mcasp_afsr,( ?$ V6 o' e. l8 Z5 j3 ]
output mcasp_ahclkr,
$ ? e- L7 b4 u/ }3 \output mcasp_aclkr,
( x8 w( D7 F, i% y' q1 k5 [7 soutput axr1,. v% S5 u+ K. [. g$ m" j
assign mcasp_afsr = mcasp_afsx;
7 Y1 @$ {( h; K. `0 Z" F- R5 Hassign mcasp_aclkr = mcasp_aclkx;8 Y* z$ m# o$ f
assign mcasp_ahclkr = mcasp_ahclkx;
! O" r% C% g/ uassign axr1 = axr0; 3 B2 O: Q6 ^/ a. n, z
/ l( ?* R1 [( V! L D在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 l# ~" m) S& `3 lstatic void McASPI2SConfigure(void)& m1 s/ [2 ~3 n1 `- w; k$ [0 N
{# f' m. m% I" J/ K( T, ^" e
McASPRxReset(SOC_MCASP_0_CTRL_REGS);: ~2 ]7 [3 \! d# F( W8 h- O: S
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
3 w2 }. l1 a/ `) b: H$ I1 ~McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 h' B* c4 E& F, p
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- G7 x% g0 a* }% y, Z0 J
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) s! b( h, {% r j' u* Q# o5 yMCASP_RX_MODE_DMA);
V3 ?3 ^% R; p1 P! B& ?0 \McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. F/ e. l9 c) X$ D" y. W6 t
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, i* z2 x$ D% W+ d6 n9 TMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - k- E& \+ j4 N
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: r! r3 ]6 M O% q0 E
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 l0 E/ O2 Q# i6 W: o; }MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 K" e* S5 ~9 `McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 o) R$ f8 K/ W4 T* s) B' t0 ]
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 B9 `" `5 Q: O }2 w! C& q1 zMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ _! |" V6 a; v3 t9 F- }# W0x00, 0xFF); /* configure the clock for transmitter */
6 {% @9 t g1 ^0 rMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! B. i. v! P# B6 s6 tMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); n% D/ Y6 b) {, }
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ \+ b Y% F- |* h* S9 |
0x00, 0xFF);
) ~, x% Z& u( |6 }2 M- J, o0 p3 P) J
/* Enable synchronization of RX and TX sections */ , Y. ~) L0 N- j9 O, I/ @' F
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */1 f* F& z7 |% F# {6 N7 w
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! i( V. e5 \* M* ^! s5 h, L
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! `- Z$ j5 a" ]1 l& @: k; w** Set the serializers, Currently only one serializer is set as0 |, c1 n7 c( c/ s# x9 I
** transmitter and one serializer as receiver.
, g k- T4 E: U# V- x- d0 ~& ~*/8 x. h+ ?9 N) a6 ~0 S9 x. A5 d+ x
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, M* Z/ y k% c0 i* gMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*8 ]8 l& D: w0 L( ]3 K
** Configure the McASP pins 4 w, h- I. [2 z
** Input - Frame Sync, Clock and Serializer Rx; X Q3 S* G' d$ Q4 }9 x
** Output - Serializer Tx is connected to the input of the codec 8 M( H# c* K' v
*/, R( |, q* ]! z/ K/ [8 a
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! m8 s9 g2 w4 _) {
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; x/ L: M/ S5 [McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 D3 |6 V$ Q! v8 [ E| MCASP_PIN_ACLKX
3 E: J% e8 [. n2 c/ f5 q| MCASP_PIN_AHCLKX
2 W3 J: E7 w1 K) G| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
0 U$ M7 \- B7 o( GMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; b! U: ?- r$ S+ x. h3 _
| MCASP_TX_CLKFAIL ) r& f) o6 T u* Y. P
| MCASP_TX_SYNCERROR
8 P* b, Z4 I0 A4 r" c4 U| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & K; ?9 L7 A( [) |3 y5 b, f
| MCASP_RX_CLKFAIL- [% A! o7 h6 W P: F- V) [, ~% b
| MCASP_RX_SYNCERROR
. I5 ~ b: z7 a# l: }| MCASP_RX_OVERRUN);
* G1 {5 ~9 ^, y' m$ }) x; T} static void I2SDataTxRxActivate(void)+ s! D6 e( Y& ^: a6 |7 h
{5 S8 D" Y, E' e" T A3 G: h# o
/* Start the clocks */
1 i M; D, l2 F" O& s2 e# cMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 h" q; P2 v% O' p2 W
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
' f, g k7 j1 S# \) GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,3 M7 {- `) R) B0 g
EDMA3_TRIG_MODE_EVENT);; a' \6 P7 o$ x) M1 X! P: {( Y S
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) p: g0 g- ^( Y3 W4 DEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
4 _4 R9 V$ J' u3 V: TMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 k9 Z; h; }4 ]
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% e9 q' r( r+ D" `2 i. twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */9 \# j5 \2 L( l/ H
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! k% h( {+ L; X! O/ B
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 x& z; C+ q: V' t" V% q( Q} ' U3 ~) Q8 K* S
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 y8 v2 z" ?* X. ~) i |