|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,0 T# i: r* H4 R
input mcasp_ahclkx,/ A8 b" `8 S, t% @) Y
input mcasp_aclkx,3 V# ^: ?+ c; W$ b9 R* F. g6 F" j
input axr0,# f& a0 u4 B, y Z2 U! i. l. J
; a0 R0 e& Q( ?output mcasp_afsr,# G& |( Q4 B( n- {$ _
output mcasp_ahclkr,1 E5 f, j/ _/ r4 S; A( s
output mcasp_aclkr,- J. U+ F% F5 W1 G5 C0 U+ R
output axr1,
8 b) M0 }- ]! t* W assign mcasp_afsr = mcasp_afsx;: C5 Y' n% c7 C/ p% |" S- m
assign mcasp_aclkr = mcasp_aclkx;& X4 H4 r7 o% c0 x
assign mcasp_ahclkr = mcasp_ahclkx; ~. e0 i! K! S
assign axr1 = axr0; % y5 ~) `7 X* }( X' Z6 d
( Z0 i# g9 k+ B* ?) U9 v; E在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
& Q3 _" R# a5 wstatic void McASPI2SConfigure(void)
# S* W2 Z/ |2 ?, y% u2 n( Z1 t- `{/ B t, ~2 ^$ |/ k" V6 E$ F
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, o4 \# H) ?; o0 X: p; hMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */* W; E. M+ k- c% W7 R% {
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 m% c' |- k3 _. Q* P4 Q7 J8 sMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# E' z2 g2 f& J7 D
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' U7 U% Z3 @) |, p( q
MCASP_RX_MODE_DMA);
0 p' x, u4 I, Y6 z7 [McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 v6 Q; b4 b7 Q
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
# W- D# L3 T* `8 m5 x7 d6 VMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 R, p: ~* J+ R8 R6 PMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% E% t G) O0 k2 ~5 c w" t
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- ^. v: e+ q) L2 [: `MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
3 w/ O3 k, l/ b4 ?# L8 o( ?! eMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);+ {4 O' s; l, l0 n
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
7 h+ L- M" h( a9 Q1 n7 }" AMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, X# b. U, ?, L0 {& n( n" L% d
0x00, 0xFF); /* configure the clock for transmitter */
' J6 ^5 s3 _. |* W" e2 yMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ U3 B7 ]3 @7 A9 E7 }- Z
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. K ?2 _/ v" i& F- }McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 g* |( x- Z3 ]. k6 x6 J. V0x00, 0xFF);5 v& Y, L' Y1 `/ l
" t( k# ^- i% P' [
/* Enable synchronization of RX and TX sections */ " K8 D8 j/ ?+ a. U4 v$ @
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ @' _1 e6 f" y' ]9 nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ G r5 Y4 R8 I, N9 AMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*3 K4 ?) d6 x9 G6 J; P
** Set the serializers, Currently only one serializer is set as: `" n- w; S! }; w/ Y
** transmitter and one serializer as receiver.
4 a* \. p- n2 a*/& r, p" a! |5 B, z" r" k+ ~5 J R3 } g& j
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
P. L; d2 F H. IMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 W9 \& H v7 X
** Configure the McASP pins
# c# }7 O4 q& z** Input - Frame Sync, Clock and Serializer Rx9 U3 ]- v: o& ]2 B3 }
** Output - Serializer Tx is connected to the input of the codec
8 Y7 f( d3 a6 b: G+ [& d*// F9 M1 l3 o/ J) j+ Y- v
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: w$ j! J) y6 R! p: s
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) R- H0 D3 k# m& P" U
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( F! o$ _; A( A, L: P9 U| MCASP_PIN_ACLKX4 M) i) c4 F$ S$ M& ~0 {7 X: V
| MCASP_PIN_AHCLKX8 m/ t! {+ C3 U0 e0 V
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */% J1 C3 `6 ~4 t/ z3 @" q0 T i, Z$ f8 J9 |
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 }% b5 G" M7 V, ^& s7 Q, p
| MCASP_TX_CLKFAIL
. ]. d* e" X; G$ [, |+ h| MCASP_TX_SYNCERROR
% z$ x. t6 x* Q% _- h| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & M# M; H! Y7 G! n7 h7 x: |
| MCASP_RX_CLKFAIL) e0 V$ [( ^0 u G( U5 w9 F/ M
| MCASP_RX_SYNCERROR ! m( U' g6 o; F0 W: K
| MCASP_RX_OVERRUN);( J, f7 b5 a/ i% w" ]3 ]
} static void I2SDataTxRxActivate(void)# O+ R4 I, f& M- g! `+ v/ w) S
{" S7 o0 i9 B' W
/* Start the clocks */
8 Y9 _' L W* f$ W1 kMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
7 Z( r+ q& ^, H- D( W. ~; bMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
7 g1 ]# h0 ~8 k' [EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ w6 w& J. D- L5 H! O; _6 Q/ S6 EEDMA3_TRIG_MODE_EVENT);' @, M8 ]$ C' f8 ~
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
! M* O5 C% E* g7 J% Q* \+ z- AEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
" G) ?2 g3 v2 K/ L8 i3 a6 _: ~McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) f3 P+ T, x5 ^ x* }
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */; v% J+ \/ v7 G x# Q. j
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
0 Z/ X& S* v0 VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);' _; m3 _3 W/ j! b2 w0 F7 m' a
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& ~% E6 h+ O/ m+ W3 f- ~} " F, F& J+ B% {+ h \
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ U+ M8 i9 S! S0 y: O' J: M5 D9 P! l
|