|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! c/ c- Z+ J% t& C9 _
input mcasp_ahclkx,6 w _- z3 l' L" Q& w6 j3 [
input mcasp_aclkx,
! A9 s% V- x+ c0 H6 w( r6 Ninput axr0,) d1 h' B$ h" M! o/ C! O
* t' [8 z2 V# D6 w9 l- z9 B
output mcasp_afsr,
( g* S) a+ J9 _" v7 ^/ koutput mcasp_ahclkr,/ g9 s) E8 k+ d- N: R( d% \1 Q
output mcasp_aclkr,4 y3 m3 z$ K" x0 |" H9 t: e
output axr1,) x: `& Y5 }, m6 o+ f! T0 j
assign mcasp_afsr = mcasp_afsx;
- I; q& B7 l$ Q: ?assign mcasp_aclkr = mcasp_aclkx;" q% V6 ~: r7 w& T1 G
assign mcasp_ahclkr = mcasp_ahclkx;2 B% t9 E5 w- `6 Z# w( w$ {
assign axr1 = axr0;
5 K5 L# C. I: k, l& ]. Y. T; k* ?7 n p/ L J& @6 o
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 , R1 n* `) y: e' L( T
static void McASPI2SConfigure(void)! E6 U: A' Y# e' X' @$ W
{
, [8 T8 v" H. @$ ` q& PMcASPRxReset(SOC_MCASP_0_CTRL_REGS);% q- P- \; l1 `1 l% S0 c& \
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */4 k; Y* q: p4 N: B/ B
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; C/ ]. l& E. lMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */* y5 S* h1 ~3 c0 l) Y' g: g
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ B( K4 q; T1 n7 \- g9 B7 [! R3 RMCASP_RX_MODE_DMA);. M+ ^3 s5 @. P/ V7 k0 ?9 s$ B
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 U* P: Z V. @9 f3 A
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ L0 u. n+ X8 ]1 H3 wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
6 X; t U& N$ Z6 O9 L' S' RMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 W8 V8 U4 |) Q n( p- t! ^' z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ( Q( u3 l w3 k. j* {! { N
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
, V- @: s& a# w$ y o) bMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( z: r0 ^7 @4 i+ K( l+ ]: b% z
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 B+ L5 l- d1 f s- N
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 i+ i# r C# b0x00, 0xFF); /* configure the clock for transmitter */, `3 N/ x% }3 D" r( _( T! B
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ a, f" r7 [/ x, R
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 U9 l# R, C9 s! d. g- V1 iMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 |2 @ L* N/ O G! U. i# R1 S0x00, 0xFF);
( g. p' p; b: V2 ]5 B5 s" U) i6 C8 E7 D+ H h2 m$ o/ Q* F8 @) v
/* Enable synchronization of RX and TX sections */ 6 i E1 C( Q2 o) F2 K5 j; U
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */' P( L D4 z3 P; Z( O6 C$ l+ z5 A# u
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" l& k$ f1 _; L$ P5 w
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
0 s8 Z/ K! S3 h7 I9 v** Set the serializers, Currently only one serializer is set as
- v$ _/ l: D; ?* S** transmitter and one serializer as receiver.
2 K2 N% Q4 [1 f7 }*/6 L& h% z+ p4 P' M9 f% o
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 H* |) E' s9 W7 T0 o% BMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
1 T; B* z# s( f** Configure the McASP pins ; a: u& F! v9 l* t* x _! R' i
** Input - Frame Sync, Clock and Serializer Rx7 G+ L% } e; @+ B! X2 f
** Output - Serializer Tx is connected to the input of the codec
4 J* h+ W j' ~. J*/% O; S7 B5 I& T n0 {9 M
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 \2 G5 V- ?1 R6 o& y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
1 W) H, m" I; n! h; C3 L7 rMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' a1 _) r/ ]2 v4 g/ x| MCASP_PIN_ACLKX
' ^9 f5 I4 `$ ?* {' N7 O a* }/ Z| MCASP_PIN_AHCLKX4 ]& _6 i J$ K: P
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 t4 G" B x7 ~+ l! }3 Q. zMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
H5 \9 B% B2 `* G5 ?( i| MCASP_TX_CLKFAIL * R6 e3 {2 z" N7 o) Z# ]; ], f
| MCASP_TX_SYNCERROR
9 _: }3 Y! u- P3 m| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : R+ S3 v1 N7 X$ C- B' b1 L! q
| MCASP_RX_CLKFAIL# j I; q3 _- q- Q$ v3 p
| MCASP_RX_SYNCERROR - ^: s i' g# C* K
| MCASP_RX_OVERRUN);
* K3 H& R8 F6 X4 [) Z: k9 J} static void I2SDataTxRxActivate(void)
1 v3 w/ S# Q4 \ ~. B t8 F/ V! ^; W{
- S4 a& J8 F* w, o# L! _/* Start the clocks */( K' n- ^% n2 G% i. u2 @" H
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 \( s7 M2 ~7 e; N. ^/ W
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
# V+ y# B" H& k3 `7 ]" N1 qEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' o. f: C" | o5 m9 T u5 o4 uEDMA3_TRIG_MODE_EVENT);
) e+ t# K5 i- v6 ~# XEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ l M; M2 {3 j& q- M5 v2 V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */: {# R, o+ y+ A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# q# S& P# q o+ D9 f h: e5 J& ~
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */0 o4 [0 T! h2 k" B. g b
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
- G- {" q4 q- l% ~McASPRxEnable(SOC_MCASP_0_CTRL_REGS);+ o9 I0 F: L3 C0 X }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 ] t, b/ G) q9 H i
}
3 C% d" r" V/ T: B4 S& {- I1 J0 C请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ M; j* @- \( ^' Q5 ` |