|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& [3 _, r. |0 w( L8 r ] \* r
input mcasp_ahclkx,! t4 K) @6 p. o. _3 [: a: X
input mcasp_aclkx,* `* ` B0 ?9 h$ F! z
input axr0,/ }4 `& E: m8 O% p6 o+ u8 g
+ R9 T( u) i: f
output mcasp_afsr,! _( [ `# P9 q: C' l
output mcasp_ahclkr,* g- h& t% f1 d/ W+ r0 |8 X5 v
output mcasp_aclkr,
7 `, t2 \- M2 D* boutput axr1,
6 L; K2 Y$ x" p4 V$ U' K+ x assign mcasp_afsr = mcasp_afsx;
$ [9 [8 w: N8 n% I( s" d* Aassign mcasp_aclkr = mcasp_aclkx;
$ ]" ~1 l( r- _; u* {1 bassign mcasp_ahclkr = mcasp_ahclkx;! U/ o4 |+ ^6 W1 d5 v. `! _: f
assign axr1 = axr0;
6 T) d6 w* d u% F) W
$ J6 g* F. b8 }' N( d在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
3 K7 E. _, g' _; W9 k; L8 U% pstatic void McASPI2SConfigure(void)
" x0 c6 e/ s) u' t# Y: K: j/ A{
) E9 k- U1 \# [ B: h+ sMcASPRxReset(SOC_MCASP_0_CTRL_REGS);- R3 i3 ?. v: f1 v
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ ~0 I' o) b2 I1 x
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! C( B9 f; Z! |# @
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
4 q) b" q' C* ?) f7 pMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( P% P$ C" U9 g2 m K' S+ I
MCASP_RX_MODE_DMA);8 l. m; _$ }1 Y, x
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
}% R8 J7 X3 D5 y/ _0 n0 L( ?MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 s5 {" s$ V9 \ ^ n; VMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % r) \$ _6 K1 C$ H
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 [+ t9 f- T3 f* `' X; w4 b# IMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) S$ j# b+ \: o1 I$ u9 E
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
& S" j ]4 Q2 h! |3 O7 j7 hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);2 R1 b0 a1 F4 q4 \
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. k9 G8 r- V( Z( |$ z* eMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 W, l( V- T/ z% D( e& R
0x00, 0xFF); /* configure the clock for transmitter */: I6 W8 u) c# v: W
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);5 l+ n, x; M- m% D
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 N) S! D+ p$ M0 j
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 w9 S6 ^+ C$ G6 W& `5 x
0x00, 0xFF);
3 k0 e5 s% ?+ M: X+ ]! k
) Y! \; @6 E- v8 t* l6 t! x/* Enable synchronization of RX and TX sections */ $ ]* o- v7 f: [; _& n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
* M) f4 J. {/ X2 OMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* Y$ U# j; W, F3 g9 A/ _, T) }, R# ]McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
: j! O+ c# R6 p7 s** Set the serializers, Currently only one serializer is set as
8 A; }+ `3 Z+ L** transmitter and one serializer as receiver.
. S. Y/ O0 y4 Y; d, b*/
6 n2 T; B; ~: w- G2 |7 q3 GMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ [/ D! @: S$ v) f& P0 YMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 V# W' t5 C: _8 }** Configure the McASP pins # C, E4 \) z6 L& `, O
** Input - Frame Sync, Clock and Serializer Rx# N5 a" L/ C9 y% h( @/ ~0 E- w
** Output - Serializer Tx is connected to the input of the codec
) V; x& ~6 D5 s' q, r*/9 E; p" m0 F' e# K' `
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' ~$ p9 W0 X8 S/ N7 G( TMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 P. v! b$ z. s+ h$ c& E& cMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% _# c0 r% y$ Z! H0 ^/ w| MCASP_PIN_ACLKX* E' r; @4 Q& n# K6 y( P# N$ Q" N
| MCASP_PIN_AHCLKX; j! t$ U% u9 {
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */" |$ n V4 U+ p
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ | C- G" k, W' U' e8 g| MCASP_TX_CLKFAIL 8 O9 \/ F2 M4 {) h4 E1 S
| MCASP_TX_SYNCERROR# n2 {& J9 f0 a1 J6 X7 q; s& y0 U! C
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ J) g9 ~' O6 A" c8 B* C' f| MCASP_RX_CLKFAIL/ L; b: N/ C! `) v6 w# A) \5 p4 L
| MCASP_RX_SYNCERROR
& Q" V- L/ t5 \) R; g3 {: f6 v- ^& ]| MCASP_RX_OVERRUN);
. [# }2 |& g. d, B' c$ v} static void I2SDataTxRxActivate(void)
$ k/ y& |+ } O" S! R5 b{" B+ m% b6 q' y& _
/* Start the clocks */
5 f' o: B' ~8 @7 t2 V2 ^McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 I4 F/ H; t+ B9 ^: }8 uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */6 w7 U( e$ `, \6 \- r
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 Y* F% K* d) c6 n' L3 \
EDMA3_TRIG_MODE_EVENT);
( g* `) d/ ?5 J$ aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: Y/ @; @2 N4 v6 s9 f9 uEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */ y6 w# p- N) T/ P! T& H! {
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& v( [/ ` {' \2 D# Y# I! k! I3 h
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 T% R: S2 U. X! E3 P( i
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */% G" }* E! d* A, ?$ M7 a# F, w( N
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! ~6 `+ t5 m; P; G+ c# G( EMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) P1 ]6 c4 e# k9 V6 D}
: x! q1 u2 G- a6 K2 w8 }6 p请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' v3 C' o q- v# V
|