|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- _4 w7 g- ~+ S, t+ P. q
input mcasp_ahclkx,
: U4 _ ^( z4 \8 o' O+ Xinput mcasp_aclkx,
: h% Y* g3 K' i j, o4 einput axr0,; n5 D$ E# V1 W4 c# l4 @1 K
5 @) k9 B% L+ S4 S( `& p
output mcasp_afsr,; f+ b! `; u7 `; U- I9 z
output mcasp_ahclkr,1 M# [" G1 ]" ]: Z
output mcasp_aclkr,' a7 u# s2 R$ V2 L, U. d! f
output axr1,
5 I; C- v0 L' m, M assign mcasp_afsr = mcasp_afsx;
4 q7 [2 d P/ H. a4 [0 i7 ]assign mcasp_aclkr = mcasp_aclkx;
5 q) v$ W9 @: I% ], [. L: `7 _assign mcasp_ahclkr = mcasp_ahclkx;
, ~4 w, u7 V6 b* K) X" x/ Q+ Zassign axr1 = axr0;
' b1 ?1 l- D* g5 c" l3 y( _
* D( k$ d E) J) u在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 - L$ r# G( ^, H; l2 G
static void McASPI2SConfigure(void)
d4 F5 Z& H3 H& p{
/ ~8 @& y* B! l: G3 dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 _7 w) ?8 F: F# ~1 L3 eMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 r' m. u+ }# w" s8 a6 G
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# `8 _& o; B, S, M" @
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! w( Q0 p. H, N1 b* V4 hMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' F# U& W( C" l0 V1 ^" z+ G
MCASP_RX_MODE_DMA);
% J Z5 P- n/ J! z$ u/ q2 @& V5 x9 ~McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 @4 l; L3 X% s/ R7 H" e5 hMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* b" U0 \7 q8 g1 T/ J4 UMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" r0 [/ l: v U* H) zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 ~, M1 f' d7 Q& ]! p, ?" L- A
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 x+ u* ]$ p8 W$ x: uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# P6 l* R6 a4 @3 n6 h" t
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* {# ^6 q0 r. G: [$ }& U
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ D7 T/ ~& A; l3 JMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ p$ x5 s) W: M1 _0x00, 0xFF); /* configure the clock for transmitter */ E; V3 z( W, n+ n$ P% `
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# B) _1 `2 T/ z6 A
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ E- y, A$ k. \3 T: K! JMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* A5 ?" b$ e" [, {# I
0x00, 0xFF);
# Z/ [4 U& M# F- ~/ Y
3 e$ t3 B R) M2 v3 V* n5 F/* Enable synchronization of RX and TX sections */ : ^ P4 o1 x" P2 a5 J
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; }8 n J& B6 t% b" ^/ l- K
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; n/ |) z# ~% f
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 J- _# X0 `" g" N# j2 V
** Set the serializers, Currently only one serializer is set as3 Z' l( k" Q. z- B
** transmitter and one serializer as receiver.
! `* C; s/ E6 K L% ^) ^: w/ Y*/
# L! W& x- V* `+ z/ uMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" W# g2 X* k( S' A- ^& D1 ]! N+ i( b! sMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# ?# m! F2 c7 r: E) n. ^# ?** Configure the McASP pins
g6 K; X+ a/ w! i% k. }- F** Input - Frame Sync, Clock and Serializer Rx
( h* y. K1 Q! g9 n; A** Output - Serializer Tx is connected to the input of the codec * U- x, z9 T9 J2 N X
*/' L/ Q; f$ v: N
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) V5 V0 r1 _! m2 a& U3 ~. Y, K0 {1 L
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% f, {/ c f! h7 Y* a0 b/ I# ~# mMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' A/ U$ c/ F( s$ D
| MCASP_PIN_ACLKX
3 q) u9 F2 g6 ~9 t7 N9 f2 L| MCASP_PIN_AHCLKX" r, q4 D# a0 \
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */! h9 D2 M& ]% N; s% Z/ |0 ~- @
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 U: Q3 j8 U5 ~
| MCASP_TX_CLKFAIL 1 i+ q6 C# `3 c8 w" e' b
| MCASP_TX_SYNCERROR$ N9 m, g2 A- R: g. Q: t( Y! f z1 {1 E
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: s( W7 }; Z- || MCASP_RX_CLKFAIL2 U1 r9 t" ], D& t5 ?9 Y) n( \
| MCASP_RX_SYNCERROR - J$ t M5 J# J$ [9 K& G$ b7 o( d4 u
| MCASP_RX_OVERRUN);
: y* N4 B. W; O$ y5 n8 N} static void I2SDataTxRxActivate(void)! \$ P1 X2 q c, N) |. w" R3 n& Z
{$ W" g) [0 N2 p/ R2 a
/* Start the clocks */
2 o( X2 M2 G" c. j( Z3 c/ L) T2 t& `McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, N* i+ @* \5 R; z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
' O9 T5 N: x" C& r2 S, MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 K* P, d. ]7 Z$ r; W. ?
EDMA3_TRIG_MODE_EVENT);; c6 o. g* z4 [7 M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " h* U) I6 h+ q/ D3 T
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */( s) v$ R. z- i5 K9 }
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# x+ F( ~ h, k1 _
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
4 M# I, C6 k( @+ i9 l2 lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
$ m, }1 l1 s! t+ n; \, \2 ?) GMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);) |) G; Y# E* p* ]" \
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' A& i: [! g; k! c7 n$ i) z} 5 }4 o0 W0 [' G
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% U, t) H# K$ ]) L3 @# n |