|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,' R0 j: }3 j; A: g! y- e
input mcasp_ahclkx, a9 h) u; `8 @0 n
input mcasp_aclkx,
/ W" Y2 C: r* Dinput axr0,
" V3 S5 p$ x0 S# s5 q. t: a$ b& p
, v6 v! s# Y9 {0 `% E! [output mcasp_afsr,
9 P" |- z. B2 }output mcasp_ahclkr,9 L7 y$ L J5 B, V/ i- ~ G' ?
output mcasp_aclkr,
$ @6 D4 h) f5 ~# q" Y; koutput axr1,
2 |7 l/ v1 A" z) X) }/ r. M assign mcasp_afsr = mcasp_afsx;+ Y1 E- s+ ?6 z7 A
assign mcasp_aclkr = mcasp_aclkx;
: o# B, N2 x5 L% z2 rassign mcasp_ahclkr = mcasp_ahclkx;
4 F- c& a+ g" E! U1 Hassign axr1 = axr0;
7 I' ~" @& n# `$ S8 z4 s9 W% j( w, v& T2 y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
: k7 M* s0 H4 j! n3 [1 gstatic void McASPI2SConfigure(void)( `4 K, c# _0 i
{
8 G0 [ J0 Z$ P$ ?McASPRxReset(SOC_MCASP_0_CTRL_REGS);$ f+ s) R) \+ L
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( @% Z. P1 b' L& Z0 q4 }: I1 Q" VMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); b3 O7 c+ d! e9 v
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ Z: n+ h/ E4 FMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ `8 s6 c. u6 D% B& F- i6 T" {; f6 aMCASP_RX_MODE_DMA);3 X5 c6 E3 E/ w4 ?
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' _$ R: i$ k4 k1 |3 T8 jMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* T, H/ {& P; q! s/ G( u3 ^1 f; ^McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # s* L, w0 D8 ^$ k+ f
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- _/ g1 U9 ^: L: ^
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: ?4 i, K4 i, Q) a, W8 z* hMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */9 r- _0 d# x& V8 K1 p
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" b& x4 ?0 Q" `+ I9 w, V3 e4 F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* E V: d c3 E+ V% a# q; CMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 t5 d1 l+ a; P/ U0 Z0 J
0x00, 0xFF); /* configure the clock for transmitter */0 H1 M3 i+ @ ~6 a' [- `5 w! z
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, k6 t; H7 C+ k/ o, U) S2 B; p$ \) \- ^
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 G }% m9 e. k: D) i6 S
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, s/ G& m: k4 h+ P
0x00, 0xFF);
5 |2 M. w) I+ Y, s, ^- j9 M8 u4 k( H$ f3 c& ]! R1 n. [
/* Enable synchronization of RX and TX sections */
% \, a. O* g+ a$ }1 dMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */, [8 J) S/ _' N1 w5 _) Y h3 k& v
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( v) E$ j& U$ c, z! R' bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
0 B! ^% J8 \3 u0 _) _: A** Set the serializers, Currently only one serializer is set as5 M" t d) r& E1 O5 g
** transmitter and one serializer as receiver.. x: {0 P5 A9 R1 Y3 D: H
*/
* q2 I, O& ]4 D5 ]% wMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ G4 }# R6 n7 ^; g5 }! Q
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
/ p% R) ~& l2 o+ d** Configure the McASP pins # {0 C4 u# O. G* j) w
** Input - Frame Sync, Clock and Serializer Rx
- m( ]3 l) t8 |** Output - Serializer Tx is connected to the input of the codec 5 R& b5 V; A1 k) R7 [- y2 C
*/
( q( F ^: a- l3 B: @2 iMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( a3 j0 |8 m* r1 ^1 q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% q. m( z+ O! x4 y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) l7 w5 H% q6 X; }| MCASP_PIN_ACLKX7 g6 Z" p/ x+ c6 q- E- I' P
| MCASP_PIN_AHCLKX, P/ u- M+ `2 l( Z6 R+ G; }
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
N! v: _ A: S3 DMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 B! \2 v3 K @* s" q" s
| MCASP_TX_CLKFAIL
. A! P* c6 a% x2 Q| MCASP_TX_SYNCERROR
+ Q% ^/ u- B* h! z| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; v2 B# J8 H" R* G7 F
| MCASP_RX_CLKFAIL
& k( A! O+ \& g* U9 H( w5 S; e| MCASP_RX_SYNCERROR 4 w* w; d- V f/ u* N& |" X
| MCASP_RX_OVERRUN);7 Y2 ]; L4 K5 r9 |. {+ n4 `; S2 F
} static void I2SDataTxRxActivate(void)- ^+ |3 g* E+ W/ }( p
{; d' D6 ]" r+ X( T- l& S% z' d3 t
/* Start the clocks */
! ~' c3 ]* E4 ~3 A Z2 v! ZMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, t8 F' h- Y. U1 }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 m. Y) }. d2 g6 ~8 K( [( h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ S# I. {6 a/ N9 m! y
EDMA3_TRIG_MODE_EVENT);
2 O$ G5 n6 \4 \) z) hEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + K& |$ d/ \& L4 a7 v' i
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */. ?/ e0 c: G# p1 O2 \1 t7 p
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 f! n% I9 O* I9 PMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ J/ ?) s9 @- @; I* u; Y& qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 x$ L% _3 R9 d" ]McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
# a+ f9 K: p* V( i7 q# LMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ B. y& A' X( }/ ^9 C9 L4 m# C
} 0 S" v+ U: J9 ]. w; {
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , d- M! @ N8 F1 v
|