|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
+ a, ^8 ]. Q# P$ \4 v4 c( yinput mcasp_ahclkx,
5 k$ c: [& e8 t! m% Ainput mcasp_aclkx," f9 G# L6 n& L2 W& e0 @% ?$ v$ {. [
input axr0,
$ i! T7 O$ D6 _# A' ~: p* V" a; k6 V: o$ J
output mcasp_afsr,
4 c% w5 Q% u. X+ o( `6 youtput mcasp_ahclkr,0 L5 a" T8 D B) Z
output mcasp_aclkr,$ A6 Q* W& B3 N i) |
output axr1,
* J6 t' A! `& q' X* Z: N assign mcasp_afsr = mcasp_afsx;7 c, N w0 G2 U3 ?: L# ] V9 o
assign mcasp_aclkr = mcasp_aclkx;
( U; c q \: g# Bassign mcasp_ahclkr = mcasp_ahclkx;
" O/ F. `# ^7 tassign axr1 = axr0; / s# F% `" V6 [% q0 y8 l& [3 K6 V
3 e' U# S" R7 b% Y5 G+ r _1 u( A- g在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
/ V8 z+ x/ `, ]# L7 T( ^. cstatic void McASPI2SConfigure(void)
. |- k: i- @8 u2 ]8 k{
- \2 K, x- b3 q( r! `# WMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
; F2 D) O/ x4 B. d% ZMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
. p9 e- C+ i7 p* \# `; `; r$ aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); J& M6 g: Z, d- ?9 y$ ]' P, A: L
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */8 g' l7 G7 R; G$ y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 _4 v& ]% X5 _% R- H) ~MCASP_RX_MODE_DMA);7 u7 P; E2 d' g; ~+ E7 A3 p6 h
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," j" W; c" C# s- \" F
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; f6 Q; l% v2 v6 _McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) c: K0 ]( T. D: D( ]
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: [$ n: x W ~8 e) D2 C8 lMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
) _1 i. }' L8 d4 gMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; S) W& W: P* B$ {: D4 e& C. u8 yMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, A: u2 q* ]/ x8 n$ ?# P
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! ~8 m4 |- x B! }) T$ vMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,1 I. f- f+ f$ m/ |( G) m R$ ]
0x00, 0xFF); /* configure the clock for transmitter */
3 g- |9 U9 K, ?# VMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 D0 x1 X% @! v* n6 m, j6 pMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. `0 {8 H# o, Q0 L& O CMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! D, q5 s# S& D% M. c, O0x00, 0xFF);2 I" T0 i$ Y/ a; Z& s" R
& ]9 W0 E; p& u# ?' }6 P/* Enable synchronization of RX and TX sections */ 8 P8 [$ A$ p( L! a
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */9 k( v- T/ u" }( W# T, \6 W/ `& D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ _9 _+ T* Z0 z) b N3 mMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
" c) z% _ f8 W# v3 D, T% W** Set the serializers, Currently only one serializer is set as
% y0 A I& D5 L% n** transmitter and one serializer as receiver.( ]9 d1 y- E3 N2 l0 U. I
*/9 c: @5 V" e4 m) ]& S
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ u% A7 K" G+ S; T* hMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
. i0 }' V1 C" u! T2 [2 o** Configure the McASP pins
& z$ Q4 r# m, [$ u) o7 [2 t** Input - Frame Sync, Clock and Serializer Rx/ q/ \' A: @' C. M1 ^ C1 x
** Output - Serializer Tx is connected to the input of the codec
. G! J+ A5 B. x2 A5 H*/, A0 D9 V/ |5 O
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: u3 o) a$ a2 _( qMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 D2 N- r5 s6 AMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 _# U* J ^5 c5 O' {
| MCASP_PIN_ACLKX
( o& H o3 B2 G+ S% r$ T' S| MCASP_PIN_AHCLKX/ v: d5 }" \6 Q* Q t. f+ P8 O
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ z7 ?" _3 P' oMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / n g0 I0 L9 Q) a) X5 M
| MCASP_TX_CLKFAIL
* w1 Y0 r9 A, v| MCASP_TX_SYNCERROR0 J- t/ R( v& R7 n2 Z
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR P/ V- g, U. C7 y* e. H1 v
| MCASP_RX_CLKFAIL: G4 i; _( d0 w3 s6 w
| MCASP_RX_SYNCERROR
8 o g* t, L# R1 Y| MCASP_RX_OVERRUN);
2 {9 R9 C* M3 B, b3 _( ?6 F} static void I2SDataTxRxActivate(void)1 w. u. M2 {+ P: M9 h* S
{
5 z. R9 v) d* `9 p/* Start the clocks */
* J6 _/ E# p) z2 s7 C1 R/ u, ]McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 B4 F/ j+ D0 @& P! d3 JMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 m+ A h _% d2 D6 X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 r" |4 Y+ @5 @$ n2 c" V( bEDMA3_TRIG_MODE_EVENT);6 @9 [$ m0 E) Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # \$ Q9 }6 Z B# g5 c T
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 m; U4 A4 {- a* ?7 q+ }5 VMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# P4 u6 G) M* R5 j) P& e
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" i. \, f3 m! v" [" zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
% d4 n( c+ t+ F+ fMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
# j( w* \" r+ L9 m, X# X8 QMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);; E2 r! y4 `) G# N9 }" S
} % u7 Y& T& g9 W/ e
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 @4 B& x) S% Z' s |