|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
& g' W+ ^- d( _! o4 K# ^input mcasp_ahclkx,
( G2 Z3 c; l3 Y/ |1 h1 yinput mcasp_aclkx,+ R/ W; S* D* z4 h4 J
input axr0,. c# s7 E1 I- @; L, W2 ~0 g3 Z. j
8 \0 y3 R/ O/ Y, Noutput mcasp_afsr,5 q5 X. I3 @' o I8 a( g% b
output mcasp_ahclkr,
3 j: L8 c+ ~6 l1 J1 a' E5 }! joutput mcasp_aclkr,/ c8 p5 w& U( S. Z
output axr1,
# t; ?( T) z& E6 J assign mcasp_afsr = mcasp_afsx;5 ?, O( e/ ?! Z" `: l* P1 I
assign mcasp_aclkr = mcasp_aclkx;
) B/ i" b; H, q/ s* Z7 O8 Kassign mcasp_ahclkr = mcasp_ahclkx;6 o2 X9 s/ o* [8 t3 M) y7 e
assign axr1 = axr0;
5 U/ j1 }, Y+ c2 S: [' \- _/ i( N5 W* f5 s# f$ e2 q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 n8 @5 Q5 M; W1 k# E; s' zstatic void McASPI2SConfigure(void)
; B, U6 c# e% W- k* A1 i{/ t$ C s; H+ b& t! Q k% Z$ U& }
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ L( L+ g/ m( ]$ l5 ]McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
* v9 a- ?+ w/ c8 s( v) z7 T/ x1 s+ w7 wMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
. b% Q( P6 y2 i" H& _) X8 q- RMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */* D' |7 t9 s" b
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# J# r) R% z& ~* k j1 @8 vMCASP_RX_MODE_DMA);
) k1 B" b9 t5 Z" w7 l7 D, `* X5 FMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ B6 j3 T- a3 M, o% X* YMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 G H& U, @7 ~& Y' AMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' X+ T6 t C$ e% E
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' q( D, V% c# ^3 uMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 Q* n6 d* ]8 R6 W# O7 V3 aMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- y, S2 [; T) g5 s8 |- n0 MMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ V' |- \, A: N! Z6 F5 ?! [8 DMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' ?$ N) u& |3 ^" C% I( q# m, z |- [
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 J6 x' Q6 f1 x( Z+ P+ N0 R0x00, 0xFF); /* configure the clock for transmitter */
% Y0 u9 _* V1 Q/ ZMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: ]! V' W8 B) ?2 hMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 1 {- I' y, i' d K5 o- c
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 K# B8 Q$ m8 t6 |
0x00, 0xFF);6 T' N4 L8 r' K F9 f3 L, A* ^
; u t! @( y# h# R" K" q
/* Enable synchronization of RX and TX sections */
; Q. r9 W' g+ |McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
: x2 h( k% B7 q- S$ u" x# ]5 R% OMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" L. Q% ^( X1 n/ `- UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*0 C9 Y& H9 i3 R5 n5 |7 L
** Set the serializers, Currently only one serializer is set as
$ U4 T. b/ [/ X! n3 i2 B** transmitter and one serializer as receiver.
5 t$ `/ ^ b$ H# x: ?& {# T) n*/ u( \/ j, q$ J5 n* Q$ d
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 _) D7 @ B: D% F
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 m4 t% f6 Y+ t$ D( N1 Z** Configure the McASP pins
0 L: b' H; I/ a, e** Input - Frame Sync, Clock and Serializer Rx
4 \; P6 M1 o% }) ~7 } U* ?8 E7 n** Output - Serializer Tx is connected to the input of the codec
6 g" F" ^9 M8 T, n' C. v$ K*/
- w: S# H# Z; n0 ~( D( i- RMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- j" `5 r; a4 O/ R* O8 KMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( {! Y) Y8 b6 L1 |! g* D
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& I/ G" `) K! r% @: N% c| MCASP_PIN_ACLKX
$ q* O- X2 D$ V| MCASP_PIN_AHCLKX4 h6 W$ f4 t/ i! N8 w6 z% X$ m
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
* i; I/ }9 x; l h' o) `McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ _$ t5 { @" R4 a6 O4 ?. r. H, V# G! z| MCASP_TX_CLKFAIL
0 D. f* I$ [# G! F- h2 Y| MCASP_TX_SYNCERROR/ c W8 x1 k) w0 ]' n3 I- H0 F
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( w+ }. w8 v6 T! l: k" r| MCASP_RX_CLKFAIL8 W1 Z0 Q# z/ ?* @: h
| MCASP_RX_SYNCERROR * {. f6 d, U9 [7 N; i/ H# [
| MCASP_RX_OVERRUN);
/ X% |4 v9 P1 t! p5 F& Z} static void I2SDataTxRxActivate(void)3 L! w V0 A5 h4 T) r
{! @9 N% x- C: A/ B; j3 p
/* Start the clocks */8 d8 C$ l) [) [
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);/ @: g; ^5 t# u. B* a! n
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; v0 f6 o$ @ xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# O1 s) m7 r, q% ?
EDMA3_TRIG_MODE_EVENT);7 }& A: U8 v( h2 h0 f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 R( B+ C' @& V9 U5 b5 _% V& eEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */9 d1 s0 ?8 a n. m s* s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 t) h9 {- @' Y W% F7 |$ s0 j
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
?6 {3 E* \% `: U wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */3 Y( p. r' z# Y) r- J( ~; r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 N% R) j/ p1 n- {8 @McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
5 v& m- ^+ t/ C$ r. B}
" Q$ D8 c2 p7 O Z' y* u请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: o! G7 L& H8 r) M0 p |