|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,: m, a. ^. Y; a5 a2 n3 y/ ?* S
input mcasp_ahclkx, y1 \, `' q' c. M" q
input mcasp_aclkx,+ J) ^. a! s7 N4 h; @
input axr0,4 Z6 f" M2 n; e/ d4 x5 T
, P4 \8 Z- E7 l5 E8 Z5 |/ L$ p
output mcasp_afsr,6 ]8 j# m2 y9 ^ W
output mcasp_ahclkr,' j. B/ e) n) g9 f! e8 N" `
output mcasp_aclkr,8 c: H5 E3 ^2 b9 `# r
output axr1,
q! C+ h3 S9 m assign mcasp_afsr = mcasp_afsx;
* ^$ Z+ ]3 C; X, m) _ X9 Iassign mcasp_aclkr = mcasp_aclkx;
3 s% [" C- |5 [' q+ |assign mcasp_ahclkr = mcasp_ahclkx;8 d7 \2 n+ V9 F. J. {' b" S- ^
assign axr1 = axr0; 9 p3 W& X; a3 @1 A/ L) J# n
/ i/ @& y5 u j" k
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
; A) d1 p' ?2 nstatic void McASPI2SConfigure(void)
8 I7 [: C& f& F! [+ ~9 d{
; n' P" E) h( r7 t G& o) V) u/ nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 o8 {- M5 \4 @- q; g5 ^2 c7 x1 CMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */4 E5 U/ C, E% u% M0 F! o: }
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 u" T4 B: s: f9 U) SMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ o9 \1 J' P# I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- P. t" L D4 Y! B- k
MCASP_RX_MODE_DMA);% Z" c* x6 E, g8 E3 V2 p; I! ?
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) j) L6 y: ]0 H% x3 B$ P4 _MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 Z! t9 P! R6 e: CMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 f8 ]/ u1 F" ^
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( l+ j! V4 D- [6 c, OMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, , F/ ] z) @2 j* }* J# |. ~
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
3 L; a* @" @% F0 T, hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# ?: y+ H) S. y0 HMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & ^6 M& H! ^" d5 H, _; O3 @4 Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 X0 M9 `& Q. X3 c/ g5 a! `
0x00, 0xFF); /* configure the clock for transmitter */
% e: M ?* T# K7 qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 s: q$ }# A% o! G8 \ c$ g
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! G! R- o5 G. q9 t) P4 E+ T$ @% qMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* G0 G. _( m# F/ V- o8 W! M
0x00, 0xFF);8 c4 _8 F" v% r6 \( p# J Z
% C" a9 C) Z2 b
/* Enable synchronization of RX and TX sections */ 6 v2 x3 V$ ]0 s, X7 c- Q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */9 F, D* V- z! R/ @
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ C0 S2 @ Y& h) _% a8 q: t" xMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*6 G4 t1 n3 f- V H/ S
** Set the serializers, Currently only one serializer is set as. f5 r q8 n3 }/ n5 f! e
** transmitter and one serializer as receiver.
: @$ X0 c* r5 i1 Z% e% a9 R' s*/ B8 r8 B r( c' g g# z$ u" E
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% J, I( i) T7 y, ?( f# _
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*8 K. L& D7 |; W; m2 I0 a1 N
** Configure the McASP pins " v9 q- i5 d: R/ ~7 }& m) m
** Input - Frame Sync, Clock and Serializer Rx% `$ T1 e4 V( Q9 Z4 `
** Output - Serializer Tx is connected to the input of the codec ) W" ~9 o _' ^ g
*/% u: Y7 u% ]4 y$ T1 s* I+ N, L0 Y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( @, [$ X# ~7 u# B% s" k; E4 O
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
' s$ a8 U' Q: g/ YMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 T0 c( N/ o. A+ _: }) a1 {+ B| MCASP_PIN_ACLKX8 z3 Q. o7 y$ }0 p" @1 g7 A3 k
| MCASP_PIN_AHCLKX
6 s6 i p! e* `- c+ G| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
$ i" b) | L7 X B) T, Z' _6 NMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % j' N% V# R5 p- P6 y
| MCASP_TX_CLKFAIL
" g) x$ q- M5 x6 o- r| MCASP_TX_SYNCERROR
* U; U& \& B' y8 V( w| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; z3 k/ H( S4 z: x* d# `7 h6 t
| MCASP_RX_CLKFAIL0 c5 a& g- x/ U3 l: R4 d3 \" I
| MCASP_RX_SYNCERROR ' l+ x9 C4 g# j
| MCASP_RX_OVERRUN);& ~5 d2 {8 r1 O8 d
} static void I2SDataTxRxActivate(void)
% x' S( ^9 f, J* `3 h{
# r0 z% p/ h9 f/* Start the clocks */4 R- w' R, B: {6 f+ l2 l2 n
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* ~5 N2 |0 r' l! @- j# Y W0 P. xMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
% R3 l) H. J0 i6 `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' h- c$ P" B; X* @0 G* L
EDMA3_TRIG_MODE_EVENT);
# a- j4 V2 k' k, ~ ^7 R( w+ Z: fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# g) v- C- Y2 }0 e) c0 jEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 Z' f7 q: L* J* \" Y. k( `McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
& W* q( I- E1 [/ p1 eMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
( C- r! T- S+ ?9 K8 P6 T6 T; C$ lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */4 T+ \, o5 w; W; K- z4 t
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( Z: D5 o2 T$ IMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);' I( r& B% g- V" }+ G+ z7 o
}
# o! l2 s& y+ B) u6 T请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. }6 Y7 K+ @( J' j0 F9 k
|