|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- F# X- j7 K! z* ]0 B
input mcasp_ahclkx,
& D" u8 T3 D0 B) x2 G* t# ?! }! e! g6 ~input mcasp_aclkx,
% i F) D& ?" Winput axr0,
( @7 o5 D r! E/ ~$ I3 s
0 h6 Q/ h, R3 Aoutput mcasp_afsr,# ]& a5 S! o1 q/ W
output mcasp_ahclkr,7 f% B" e6 N) I& U/ x( s
output mcasp_aclkr,
& d& M: u) `3 R6 D; noutput axr1,- t+ r. Q; Y! F {# N5 k; o% {
assign mcasp_afsr = mcasp_afsx;* \3 R5 ^- ?* L1 |3 F H
assign mcasp_aclkr = mcasp_aclkx;
) c9 k, ?" S+ D9 Y$ dassign mcasp_ahclkr = mcasp_ahclkx;2 X w- H- h! e- [+ A, b0 G3 h
assign axr1 = axr0;
3 d0 t s" i* z% w( {. X7 n" ^
, ]7 Z! M7 i4 e! [4 b' G在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 4 f7 w/ a7 ^3 c0 U: T
static void McASPI2SConfigure(void). ^$ x4 m1 x, A1 ?& Y& J D
{) q& n5 I5 |5 u3 Y' Z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);2 V3 ~& B3 }" D2 n5 s, n& ^ Z* B
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
a# g; w9 p1 V/ ^$ @- k0 UMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! z w: H; q; \- B2 s: H1 {McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */% o, v! ^& N* G% g2 F
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. G y. p, F, k1 D1 [2 GMCASP_RX_MODE_DMA);, @5 w' x- |1 s4 U" n, V; M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" F6 Q% V" N$ J4 P- FMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */9 `2 @. r. s7 T6 W6 W- C
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: t5 T6 X& A* P; q6 gMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; k4 U+ J" _! d9 a
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . \& |0 y' R2 ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" ~: X) _# H* K& p9 M: A7 L
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; G4 Q& U0 r. W6 W; E# W& p
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 Q( |" ^- m" \9 L/ ^" W
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( W; g/ O3 z5 y& Y8 j# d
0x00, 0xFF); /* configure the clock for transmitter */
: U' W& l' Q! E1 W- f9 L( T4 r5 nMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) }# {; H& j% [( N/ N) E) l$ r
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! b8 g4 }$ d0 d2 B5 BMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 i& E( u8 j( y0x00, 0xFF);
# G, W; z6 Z1 p9 }, S4 } H) K1 t1 a- }# R
/* Enable synchronization of RX and TX sections */ + v6 @5 f7 `( B z |$ ~
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ q* j, |; X9 T3 J1 EMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; K( \. J( T4 Z6 l1 f( r
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*! A/ m7 }+ I/ I3 [* h3 D
** Set the serializers, Currently only one serializer is set as8 N+ [- o5 s' ?3 ]7 R8 b# @
** transmitter and one serializer as receiver.
6 }+ L! g: J' e, B5 ?# ]: b) U*/0 v( O* Z. @: v* U1 {
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( L4 \ @: [# r: V% SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* G3 D/ e1 d9 r6 o" h, {# D. l& w** Configure the McASP pins
5 u/ ^6 e/ U( t8 ]6 c** Input - Frame Sync, Clock and Serializer Rx2 n2 r+ P" U0 R- a p1 y8 q7 s0 r
** Output - Serializer Tx is connected to the input of the codec 5 K: v1 R/ l# B7 l
*/
3 n" D9 x1 J0 S+ yMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 N. g/ Q- } N7 p4 Q" ?
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 S& ]9 G0 o4 K7 y1 v {: y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ W, _ P/ C' s2 l2 c| MCASP_PIN_ACLKX
# _- X9 l' L i8 q W| MCASP_PIN_AHCLKX, s+ B- h% m. s+ b
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
- A5 O' ~3 e f( y, ?McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 D' f3 j6 N- Z b& @3 q2 V9 n- v| MCASP_TX_CLKFAIL
6 I; h% ], P' n2 ^( F2 U| MCASP_TX_SYNCERROR
) N( `/ x3 c: T1 p a0 D( |) k| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # X+ P1 ~# A* B$ e$ K+ g" l0 n
| MCASP_RX_CLKFAIL
6 ?$ z; [+ Y) {9 v% X9 \| MCASP_RX_SYNCERROR ) [4 Q: v' f6 q8 t3 C$ D
| MCASP_RX_OVERRUN);2 [* W$ G3 p7 b- \' _- ^
} static void I2SDataTxRxActivate(void)
! Y+ Q/ E2 ^/ O3 s* U{
& f& {6 m+ L/ D) {# X/* Start the clocks */
( Z% w. K: L! j4 M: F9 BMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ s: M. g# r9 LMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 x5 O+ L, ^0 a, D+ _& a$ x# EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, Z$ M8 Z9 a' x# b) t% e) a5 |EDMA3_TRIG_MODE_EVENT); \* `! m0 D! O3 E% \0 {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 t$ `) k" |. XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 }) l, E) N# b' V( Z4 p
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ T& b7 u( o% S# ^' }McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
1 L0 G/ Z9 F# h! [, xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */9 b/ a3 z: p, X; C* |; A
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- b) h( Y n" z9 PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' j- M3 k* i; @2 t! @, R$ x A} 5 L# ?( q) Y: o8 z* l) M$ V
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) J$ y/ }8 g' S8 Q |