|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ h4 A8 N$ Q- p- c9 B* ]
input mcasp_ahclkx," o; i' {' t0 i/ N; I& T
input mcasp_aclkx,
( t; @. Q- @+ f2 t; ~input axr0,
, ]! @# V6 _' q5 v7 y) ]
; G. }- D3 ?. a, a: F( F- n8 coutput mcasp_afsr,
3 s: O6 F) E+ X" V+ j& goutput mcasp_ahclkr,/ m, S' s" l; r) m" d
output mcasp_aclkr,' R- c" q$ R7 R" u. r
output axr1,7 O$ _3 g+ n) f# N4 @. O
assign mcasp_afsr = mcasp_afsx;
' W- h) n, R. T; S& M7 O1 kassign mcasp_aclkr = mcasp_aclkx;
7 u" u$ t$ B" I; d: ~9 Cassign mcasp_ahclkr = mcasp_ahclkx;
7 n9 s8 Z' X, U4 Tassign axr1 = axr0;
% n7 M5 f' K% O6 M* ]( ]4 Y6 _/ w2 o# Q! s
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# A5 @5 I9 n3 x/ H- Y3 zstatic void McASPI2SConfigure(void)
% j/ d7 v8 x$ {) Q3 L9 r{, g$ i$ l r$ Z9 u
McASPRxReset(SOC_MCASP_0_CTRL_REGS); Q" s$ m+ l. _/ t: k
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- Y! f* ^/ M3 o( r+ E0 y! Y) ~. {
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% c1 t* J- J8 j `$ uMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
: L* z3 B, Z {' U% @McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* ]( _' H, A6 A* G$ b& Q. zMCASP_RX_MODE_DMA);1 I% e1 X6 ~) g% k& j2 S% d
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# I7 z+ }6 Y, j6 LMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 h" T# C/ _5 j) _ b) j6 u
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, : G$ U7 S- U. N* S0 U/ C) K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! A1 ]0 F( G. P; o. y7 i6 B4 G/ u
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' q; z* m! @% ~" _MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
& k7 _% _. y9 |: y9 u7 dMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* ?# p+ k% l+ ~4 o/ T
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) K. Y# g( i4 {2 ]! @- H: k
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 j1 ~* s; e0 L+ R' \3 b
0x00, 0xFF); /* configure the clock for transmitter */
2 H) s, I' t' F/ M% JMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 A8 @- V9 b4 a% |, j
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); & S: V: ^$ }2 {
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. T8 B! J1 {9 d* t; y4 z W0x00, 0xFF);
5 D2 [0 D N. k- @4 T: c7 U6 `! p/ z' Q
/* Enable synchronization of RX and TX sections */
* E: b$ V c7 L* r, UMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */% r1 W1 c8 t8 \8 |6 m
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! f# t4 R. K5 l; R" yMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** f _5 P; x- I- D$ u7 X: A
** Set the serializers, Currently only one serializer is set as- J1 f! x3 u1 n: l5 b7 v2 {
** transmitter and one serializer as receiver.+ T1 \' B/ Y1 a0 j. H! v" o
*/9 W, q5 D& o0 _4 D! z6 z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 |" {" E* W# dMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*; E# Q9 K1 i' @% N: t# E
** Configure the McASP pins
- s' \3 ] j! j% Q/ O7 E$ k** Input - Frame Sync, Clock and Serializer Rx4 G T* ^& [, |9 t; \6 l9 i
** Output - Serializer Tx is connected to the input of the codec $ n1 V6 ` ^7 t* P
*/
`2 I2 u, y f* q hMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" h& V; T9 c/ t7 v- K: j; y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: V% W# k G4 a |; Y R7 Q0 DMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( Y' x' I. M1 a8 ]6 ^| MCASP_PIN_ACLKX$ S2 H. U6 f; a1 v0 }
| MCASP_PIN_AHCLKX( b# e+ h# j' H( t% w/ V& H) L
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */) g8 W$ H4 J' |$ i+ s2 t* p
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR - a! x+ j, p/ l J/ ~- w9 k F
| MCASP_TX_CLKFAIL
% J$ ?# ?6 ~7 C| MCASP_TX_SYNCERROR3 `4 t: D) o: W0 L
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR / P6 F/ Y3 s! T* T3 Y% X
| MCASP_RX_CLKFAIL1 P' _1 `! W. _9 F1 d1 Q/ S6 p+ ~
| MCASP_RX_SYNCERROR
: G$ r3 U& u2 P0 @| MCASP_RX_OVERRUN);
9 a0 o# a# o' s- ?8 B# U2 W) F} static void I2SDataTxRxActivate(void)
6 w& L- p h5 H# Q{8 ^- r, T$ s5 v: x) ]6 w5 f
/* Start the clocks */
; _5 }: S+ s" A* c/ x: qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" d5 t3 U6 Q9 \- a8 w# u
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 L @- I% @( [1 B; O3 y% |2 S: T4 Q) zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ M; H9 t2 J2 [5 O( fEDMA3_TRIG_MODE_EVENT);
2 n& w x+ k! q/ m! hEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # U8 Q/ i. s& d j3 s6 S% N' D" R
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% E" ?% h& I1 DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" B- Y* w* ^* e, F2 H
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# F. _- e$ M5 K, w% P! ]; @while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" E: `/ }( i* k1 I2 s
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);) u7 x( Y$ [7 f' l
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
# s! B0 m2 s" P, \} ; U: V/ W5 b [, u. m. d
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. + n. `, A; T/ y' O. D
|