|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
( x" }' u6 X" z( B' R% S' w- sinput mcasp_ahclkx,
. m. A9 O5 z/ |: Xinput mcasp_aclkx,
; w/ d+ ~' M |' h0 i7 |# k* N0 {input axr0,6 Z( h5 M% p9 t( \9 B) w& q
; E6 v, A) L- v9 C+ houtput mcasp_afsr,
6 G% P4 c" C% {, A& q0 ^output mcasp_ahclkr,
1 C0 f+ p7 ]$ w! c$ s& moutput mcasp_aclkr,
/ ^- n8 ?2 _ [2 W: e: ?" Eoutput axr1,, M! _0 d. ~! `6 h$ x& p
assign mcasp_afsr = mcasp_afsx;: H2 s3 I5 u1 T) J) ~) q5 R
assign mcasp_aclkr = mcasp_aclkx;+ B% C$ T6 ^* x) [! K
assign mcasp_ahclkr = mcasp_ahclkx;
0 w8 n" r: q/ K' \) Z( Sassign axr1 = axr0;
/ o+ \1 X0 G+ [( ^; z o4 [4 A* R, ]5 {& @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# O6 r/ N7 \% `9 d T5 Fstatic void McASPI2SConfigure(void)
) [! g! d8 d( T# E{
& H- \5 z% H0 n1 ^McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- F) T, m; A' S3 V2 T7 H# e1 OMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */4 O7 C$ f4 G% W& f
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ g5 p$ D! K- X4 K4 }
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ h4 w* D' q. z1 B) dMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& m4 K2 ~3 e, v* ?- R! N* _
MCASP_RX_MODE_DMA);
1 s! ]% L# l1 F( F7 VMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 e# m5 |8 \2 M7 S! _! I3 yMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */( ^; T2 H1 M8 a }
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 D# ?0 L, @4 {- n8 D
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" V+ v: B0 C- F2 z, l2 d+ a
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 h# K( f( H* n* [9 F5 p' b1 ^
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 T D* w1 c* e# w2 o
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 p2 d8 X9 Q) o+ V+ }# uMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 R5 S( ^, G' Z- }2 JMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; S6 x6 a% J3 H6 I
0x00, 0xFF); /* configure the clock for transmitter */5 Z9 `: B! M# b* Z
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; Q8 v2 |' P: Z# r- j: ~McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 l4 z- V+ i+ d+ EMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( I7 Z* p" B' X3 g: s& }
0x00, 0xFF);
5 A- N* y: G, h# o4 V; \1 S$ \3 U2 F2 a9 R" \
/* Enable synchronization of RX and TX sections */
) ~$ o/ u- {) P7 B3 s5 ^1 `McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 O* y+ b7 {# `. {9 Z9 m& j7 p
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 z8 D2 L: N) p3 {: `" \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
0 y4 e7 R+ F8 X1 g* f n** Set the serializers, Currently only one serializer is set as
! l1 [* ?/ U3 C; u/ J9 ~4 {** transmitter and one serializer as receiver.: t, a8 ^/ v/ h8 @* v2 [# F
*/7 a, b, r5 }. k6 F, q9 S& w: X
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: O# n6 Q2 H+ B7 T7 A( O* s( tMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
8 O, ^) q* U, F* t0 L. |) G! p& Y** Configure the McASP pins / I. P4 b* O3 J; f7 h
** Input - Frame Sync, Clock and Serializer Rx
6 v& ]' P+ r$ G' l0 P9 G** Output - Serializer Tx is connected to the input of the codec
9 { e) k' Q7 H*/
' I p# d6 B+ p% V: x7 DMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
2 K* g9 B( n/ r0 s6 |McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, ]3 D6 e/ u. H* t8 v4 q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
* F+ l6 A7 }, q" N' n| MCASP_PIN_ACLKX
6 ~7 S4 q/ T, z8 h$ i# [4 b| MCASP_PIN_AHCLKX: `" p7 v) b' Z/ Q) t# H6 ~) w
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */$ v5 B2 [ \! [% N$ i$ z. e
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 b9 b. B/ d* V) ?4 C- J. n| MCASP_TX_CLKFAIL
4 R; c) Z5 k1 V v| MCASP_TX_SYNCERROR
( F9 }" n+ }0 O4 K| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 E3 N# ?9 g6 u6 c3 |2 _
| MCASP_RX_CLKFAIL% H0 x6 s0 d/ r* i' L' F) d' q
| MCASP_RX_SYNCERROR 4 O# G; H7 [& p$ a4 f
| MCASP_RX_OVERRUN);
* H* F, n' d! G) O/ L} static void I2SDataTxRxActivate(void)% b1 l( L) Y2 {8 s0 t
{7 T. Z2 a- _( Y/ V# o
/* Start the clocks */
% G5 K8 A+ \ t- bMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 G% ~. k( S) Q9 J9 i2 J' y) eMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 n0 f0 l! Z6 |; G2 fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' e P* N8 F6 W0 [' a b+ _* rEDMA3_TRIG_MODE_EVENT);
& [1 l+ Y% `* E. \5 vEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) A/ @! q; M# H6 }0 }EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ _7 k9 V0 d2 O; H) [( z- I3 ?, i
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- P4 F3 A0 }1 q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) Y& ]. [( K4 `% H' }
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; u- v8 F1 D% I! P. \
McASPRxEnable(SOC_MCASP_0_CTRL_REGS); U+ d4 T) Z3 d! a) X" Z
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
@! N6 L+ Q2 m0 F7 }& Y} X+ w+ [7 h5 d& A/ d( G
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 L8 @3 j: v! m& V7 F; j/ k( d, a |