|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
4 F; ~3 c6 C& K! t" e0 P& T" E* G3 Y. jinput mcasp_ahclkx,5 a7 |, j/ n0 K, Y+ c) n, E
input mcasp_aclkx,4 K% R6 H+ C7 K: O* W0 I& b
input axr0,
9 x ? l/ _5 g0 D
1 s+ Y9 g2 `- x! w$ {: a- qoutput mcasp_afsr,
) U) }6 V" u; coutput mcasp_ahclkr,7 E1 S- _5 R# {4 S. `, u; ^8 z
output mcasp_aclkr,( }& z6 U( a, G/ b
output axr1,
, p. |9 |% y) \* \9 D2 X assign mcasp_afsr = mcasp_afsx;. ] [/ k4 h* H: J9 V4 G
assign mcasp_aclkr = mcasp_aclkx;+ j4 a+ A. t; Z* \/ [$ p
assign mcasp_ahclkr = mcasp_ahclkx;1 h8 P9 s/ \* |
assign axr1 = axr0; ( r2 M$ w9 W; ~7 M' b E
5 U, v8 N' B& ~
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
4 [4 K- s. ^4 Q. s; P5 Z% estatic void McASPI2SConfigure(void)
: t$ u; B% |. A _" D5 g8 I{! F) u) u5 Z D) p, ?! ~# N
McASPRxReset(SOC_MCASP_0_CTRL_REGS);: X5 W! a7 W( ], S1 w
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
1 b: u/ |; b: [9 p$ g `; c/ C, @McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 A0 R+ T; D- y6 f; r IMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
$ k# m0 ^5 ?) q2 s% `; BMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' j# Z/ ?" l# ~. j1 g1 GMCASP_RX_MODE_DMA);: ], X) `5 Y$ u8 |/ o) N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 i! i1 M! x, Y8 {
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; |0 N. S& L% q7 b7 u$ n# J9 iMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) g1 B% `4 p* ^3 a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; r1 l( Z& x: T N
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 U) `4 c3 o; N- U J; fMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% O; i2 m8 V0 D9 F+ Z( ^% X
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: K9 O; W; s3 o0 q& V% J# t3 AMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " ?8 t; Y7 f O8 \9 t
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 I" j- e8 x, s4 r: {) y; e0x00, 0xFF); /* configure the clock for transmitter */
; n8 t0 A; Q$ L( YMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ j/ F" P. c* m3 IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
* @, p' \4 x5 p6 n% FMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 g3 f* q. v& U- r5 r, e
0x00, 0xFF);
; t0 y9 h( I5 P$ I) ~# {: N" o$ e' O' w; `" ?( r' H7 y+ \
/* Enable synchronization of RX and TX sections */ % b1 K+ d! Q3 _( b/ S. S
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
6 o& ~: Q& l) d' OMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 k( O+ l. g7 w6 u5 P) nMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
, j4 f: r# }! |9 R* u** Set the serializers, Currently only one serializer is set as' k, o- y4 j" S x# i( b v
** transmitter and one serializer as receiver.# E! z6 r6 `1 F
*/
7 e0 J* H9 D3 tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# Y5 H, q+ r: S0 l* E
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
9 }) V% d# h9 S: l** Configure the McASP pins 2 Y) r* j( l0 m" |
** Input - Frame Sync, Clock and Serializer Rx
% b* T2 S1 E; q y6 D% N** Output - Serializer Tx is connected to the input of the codec . C. w0 _: r, w) Z, K
*/
1 b9 x' [! Z! v$ E9 \, MMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* {* k J/ k9 C9 k5 I% Q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 T& `6 \! Y6 B6 }McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 s' m6 _& l0 P
| MCASP_PIN_ACLKX
/ f+ F2 ~6 U% _: I! ^9 _| MCASP_PIN_AHCLKX
! P. \' V) Z+ b7 N! y| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% K5 X/ m* ~5 x: p1 A, uMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + c5 [* i/ a0 G
| MCASP_TX_CLKFAIL
2 b5 d3 X7 w( `; f| MCASP_TX_SYNCERROR
" v/ O, p, h5 w1 G7 u| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* Q, O; \9 [4 O4 [1 r3 V4 y0 l| MCASP_RX_CLKFAIL
/ ~! }* o3 Y9 E2 Q. t# j| MCASP_RX_SYNCERROR
0 |8 q& t' T1 y| MCASP_RX_OVERRUN);
) o: ?: ]+ z" z/ h' @' D% C' K} static void I2SDataTxRxActivate(void)- a" g4 l! Z) W! s4 }
{. a/ R4 _" o! n ]
/* Start the clocks */1 I! I: n B! |4 G! ]1 m
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. K, N2 _0 t- ^1 `6 e( m( t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; H" Y% \7 c- d9 [4 n
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! \2 n U( B: bEDMA3_TRIG_MODE_EVENT);
3 z& T& i4 E8 _2 N/ H6 X e6 H/ AEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# F B' ^+ p3 g, }2 D6 O6 eEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 l+ G: m4 a. j+ w1 t: x; g+ f: E
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) g1 w7 y+ \: |
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */4 n- Y. g; s. r5 z8 D
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */4 G3 E' e M8 R" h7 \* i* d1 H
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
# W% T6 u {% B* A7 G) `* u: M: mMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* \- ~5 e. a9 z3 ]} 2 M4 v7 @# u# R9 S$ e
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 m9 Q3 v8 u. ~- i
|