|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
+ ?; L1 k' K& T+ }5 L/ W% vinput mcasp_ahclkx,
5 O2 N- ]0 i# _+ v Vinput mcasp_aclkx,
x. l+ W* P9 r7 finput axr0,
( u, a S' ]2 w
n G ~' @& O" N2 I* M# Routput mcasp_afsr,
$ a7 X3 g7 E9 K& _, s, moutput mcasp_ahclkr,
: W X/ r Y: i& S1 {4 \output mcasp_aclkr,9 a1 i. T6 o! ]' r
output axr1,4 S7 e! ]# D- M/ {$ V
assign mcasp_afsr = mcasp_afsx;. p( d+ [4 W: e$ H/ N
assign mcasp_aclkr = mcasp_aclkx;
& q. G: M( D: Zassign mcasp_ahclkr = mcasp_ahclkx;
) q5 f3 Z3 I) }5 |assign axr1 = axr0;
& c+ j0 F& A j3 g
9 N8 B) Y" g. K: c; ]# D" k在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 8 `1 {4 f. |0 k \! ?% O
static void McASPI2SConfigure(void)
+ V1 V$ _) ?: x3 b9 |' `* `5 J' m{! s, p: S/ [! ?
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( W8 E/ o y& \/ SMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
% F8 a# w2 q! h& o* A8 \) M, fMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 i% q2 {& K& o( g
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */5 D ^9 P T# O x
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 u" }) M$ P6 `
MCASP_RX_MODE_DMA);6 [% Z& f0 I7 g" A$ a
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: Z2 D, P$ B( r6 Q; V* K" p( w$ DMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 e% \. g3 k6 ^+ d1 g; F( m
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
6 \) i5 \7 L X$ x7 nMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* y5 N$ V6 E; v
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; g# m. U C# s
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */6 Q+ K- ?! S& ?
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 K$ i) q d4 L7 [( m8 iMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" ~1 r# M2 Z0 L3 f+ }+ [McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# {/ [- v" j: {4 ] u5 u0x00, 0xFF); /* configure the clock for transmitter */
) N1 {& b; a4 _& D' m$ `/ MMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( z7 Y2 p2 }7 C; y$ F/ I6 k9 F
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) S7 F5 F: T4 l0 mMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* m' u4 Z, b9 v* a" J {4 c; t0x00, 0xFF);
* E& z: \4 R* E! H( Q
! S6 [. g' B5 W) @( \* p' G/* Enable synchronization of RX and TX sections */ + _9 }8 m+ {. m! d* v- w& C
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
! N; k* m; r% d6 ], fMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ Y7 Z: _# [, z8 ?9 s
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
* C5 o9 d5 e5 K- v) r' c; M** Set the serializers, Currently only one serializer is set as
3 w. X8 W( D. }! i5 }6 z! W** transmitter and one serializer as receiver.* j5 ]' e5 H3 Z
*/
1 X1 I, x+ @9 ?- i& ?McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" _; @) Q2 w( M# l8 wMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
@7 \: w% ^; }0 j3 c8 _5 G, F** Configure the McASP pins
# o- h6 J. r3 u** Input - Frame Sync, Clock and Serializer Rx
' d4 \9 k# i! D+ {** Output - Serializer Tx is connected to the input of the codec
$ R F& L: R0 M& k9 y/ H*/9 a( Z# T' `7 F6 P) j. x: N
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 k( P X- B* b3 a* JMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 g) x* A# l Q; M( k) XMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% W& v0 }3 y: }! `| MCASP_PIN_ACLKX% B* J4 W# k6 I. @
| MCASP_PIN_AHCLKX
. l( R& C& H3 ~" H- ?| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */$ O2 Q3 }& V( R. n5 O6 m
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 G! E& E* z; c: t7 h5 H) k) a8 z| MCASP_TX_CLKFAIL & y' U0 i, d5 x% s
| MCASP_TX_SYNCERROR
& y8 X$ H2 y% C' J* M/ |2 U| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; S# j7 N4 S! \' q! A$ W
| MCASP_RX_CLKFAIL( J, c$ `& v% T- q" g9 b+ F
| MCASP_RX_SYNCERROR 3 B" E4 W: K( x1 n& }' n# H7 m. S
| MCASP_RX_OVERRUN);
. z& ~9 p$ b8 ]) Z7 r} static void I2SDataTxRxActivate(void)
6 A# l/ }8 _1 n0 R* a" g9 k{
: I/ B2 \! \( g3 y! h/* Start the clocks */$ o! R% m( k: Y" `5 E4 d0 F
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. I1 [: G Z) g0 [! p' x' h( K
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */) e9 d5 c3 O' |) N+ J, k* Y# K0 Q9 P. F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 X. k# Q& H! L- R6 \9 ?7 dEDMA3_TRIG_MODE_EVENT);& r& e% A; @* k. ^9 M1 h# \+ d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & G. l/ m5 N3 `+ @
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 Q' `2 C) F: FMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- u* Z) ? w6 U$ i [McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
( D* l& Q+ u& v- Xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */, b1 L' t0 U6 C0 N5 Y/ K# C
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 v6 L$ |" H _* X: E: J# {McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" A3 A- a) E9 d$ ^0 U
}
/ P4 Z3 y! z7 @3 ?请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 d. q# L- Q5 g" o. b
|