|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,9 ?' |. x! a+ L3 f& X _2 F! a% T
input mcasp_ahclkx,
/ T% r( I1 n3 oinput mcasp_aclkx,( h l1 x" B/ w' A7 T9 R8 \3 T& e
input axr0,
, K- @2 R/ t0 e% A; B$ r0 P# k9 D* F1 B9 M
output mcasp_afsr,& x, {- y t" U2 [4 K# T6 L
output mcasp_ahclkr,* h: l: Z( J/ g9 n: o$ K# C5 c
output mcasp_aclkr,
0 }! E( K$ ] Soutput axr1,
/ f& N/ E2 z- S4 u$ F- u assign mcasp_afsr = mcasp_afsx;1 ~& W8 u" `9 U* |) ]% Z
assign mcasp_aclkr = mcasp_aclkx;+ T8 [- d& k$ q! N4 C8 b
assign mcasp_ahclkr = mcasp_ahclkx;
* d5 Y/ Y: h, t+ j9 R7 H7 N* Uassign axr1 = axr0;
# @$ h! Z4 K# l$ I. }4 c9 X( k3 o* h# B0 \7 q6 D. V" m
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# x* F" H, k% G: O9 u/ Sstatic void McASPI2SConfigure(void)
, O2 H: C+ j6 p* |/ h; s{
- y% E; W$ R5 l* pMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
, }# C: W! j2 B' w% u; c7 ?1 RMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */" R+ H( U( y M/ _/ {
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: n$ _: ?: O1 L ?8 l; g! QMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
. }" \ {6 g) pMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) E0 O- m' @! r6 NMCASP_RX_MODE_DMA);& u+ C* q2 A. M, |
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ J) Q& }% ]3 |1 B5 S
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% X% s% a$ ~7 z0 J) Z iMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
0 i. ?: n! x6 v' mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
7 K& o* D3 F1 X( K) qMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) A7 r/ o$ W3 e! r
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
@; l7 @) D- w% p5 b: Q! V0 r5 ]McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. Q# j) F8 w U; p7 D5 u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 r6 i, V4 u5 H6 S# }, {McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ u7 q$ p1 ] s: [0x00, 0xFF); /* configure the clock for transmitter */
4 p: [1 {7 u$ ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
6 o8 Z6 P, f# H, I4 M: W- a! ~2 iMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); R2 a/ O7 m6 p) v$ T* l3 ^
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 @, E& L- q2 U0x00, 0xFF);
- R- s {( U- D' l$ V, K# _( l0 _* e* B. t/ N x
/* Enable synchronization of RX and TX sections */
8 s1 o" h0 j* s* `1 PMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
, _; n$ [2 n1 K. H3 ~, |5 dMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" l: X* ]( P$ c9 ~' aMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
" {: i- l. L9 m; J) P! h: b** Set the serializers, Currently only one serializer is set as
! e5 r8 ]! y# Z: R+ O** transmitter and one serializer as receiver.
/ J) _/ N G2 ]$ w; k/ B* h8 ?*/0 ?0 ?. {3 q+ g: C3 \" p
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: ]5 T! P) B: x/ e, sMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** v l0 u; i/ _5 H( \8 u
** Configure the McASP pins
+ @: @ ?0 g- \' M3 \5 K) A$ o** Input - Frame Sync, Clock and Serializer Rx1 l. i. C: V4 G$ o
** Output - Serializer Tx is connected to the input of the codec
" h# R! L- x* D8 k% w* o*/! U/ j i; S0 @5 e
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. x3 }% b2 D" E( y" AMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 p" n1 W8 z8 K, l! s! ~
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. l/ g ]* D8 r' N: j
| MCASP_PIN_ACLKX: P5 Z$ i) l; b' P, ^1 G \% n+ M
| MCASP_PIN_AHCLKX* _: o! f3 [" A/ \7 _4 ~
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
$ W( V/ K3 H1 x, g: s$ ?McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: {! d1 W Y8 s) f. W9 Z| MCASP_TX_CLKFAIL
0 d0 e1 `5 s5 J* \& I7 Z) t5 O| MCASP_TX_SYNCERROR
0 X; e: ~7 ]7 @. v| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ W% y5 h y& V( ~
| MCASP_RX_CLKFAIL9 I, x o. p" L
| MCASP_RX_SYNCERROR
/ z5 Q- m+ K+ p6 J' E| MCASP_RX_OVERRUN);, k* l8 Y9 _+ S% ?( ]
} static void I2SDataTxRxActivate(void)0 b+ {9 H+ l0 o
{
; r" `1 c# f5 F2 K* z# @/* Start the clocks */
0 i) X$ o6 d& I5 Y' W: {7 mMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL); W$ I, y) V. `5 P r* v
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
r& M" n, B' F( d( ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ p' q) G: Z. |8 g1 J" m
EDMA3_TRIG_MODE_EVENT);" S' ~* A# R$ L% `" Q3 V9 v/ S
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# R2 P$ E% n& F8 e3 ^- HEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
! W: s, A" A2 eMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% O5 r- L3 f, u) @
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
- L4 k2 v" P) I' Gwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
& X3 U, N9 p+ u6 }! y3 ~McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' k' F$ l$ w; _: w; S
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; O- m, W5 ]( i
} + z7 C+ T3 K0 `2 k4 {
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" ~1 f2 \- |' X; F1 h |