|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
v2 }0 H, ~/ Q' u/ Pinput mcasp_ahclkx,7 Z9 q4 z( c" n
input mcasp_aclkx,
) O) D6 |8 @/ a# W8 Dinput axr0,! B$ T1 ^ v% s; v
; u1 o6 `3 }2 u- B+ W
output mcasp_afsr, E: [+ n( U0 j9 I% s
output mcasp_ahclkr,
) O. @2 Z! d. Y1 X/ F+ t. youtput mcasp_aclkr,
z# U8 v; b' k" O% U, \1 i) r$ ]) moutput axr1,. X1 T' |# o. C! B: ~2 d
assign mcasp_afsr = mcasp_afsx;# D6 E d& Y7 F' c
assign mcasp_aclkr = mcasp_aclkx;4 T! g+ |. k; Q, U
assign mcasp_ahclkr = mcasp_ahclkx;
2 ?4 A s9 ~- c/ Oassign axr1 = axr0; & Q& J) O4 k, u" k2 X
f t4 W6 Z4 g在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
* B. n$ m$ b; ~1 x9 h; ^static void McASPI2SConfigure(void)* Z! ~4 X$ E [* y `3 ?4 j ~; Y
{% A4 T h9 G# P6 u
McASPRxReset(SOC_MCASP_0_CTRL_REGS);& [) p9 a8 u `# f, _% ~0 @
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
" f8 u# a! @$ d- [5 S6 SMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& L& d1 s* V- ?6 W0 \
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */1 O' n' f' i; S, p! S4 e. R: d
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ f6 B" V1 l4 Y# ^! a5 `MCASP_RX_MODE_DMA);! [; ?1 i) r. z" g+ q4 _
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 S, F1 ^* f# Q0 FMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, k1 P( N* L- q- H( gMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
& L5 m2 k* x. \0 ?9 |" k. zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 s a) j5 X6 U$ EMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 e+ S. n8 W4 @; t' b: X. f! ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 z9 K2 E1 J. BMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: @8 x: Q& O6 q2 }: [9 g8 H
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & U: h2 L( z$ @- ^1 f
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# Y5 v& j+ C' Y0x00, 0xFF); /* configure the clock for transmitter */$ }- B0 p% ~! E* y/ k
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 x& M5 R4 t/ ]3 K; tMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " z+ E8 U& L* q! G% D3 F! }
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," S$ P0 {: m) \; ?
0x00, 0xFF);
8 S+ v1 k: C6 h$ Z: k2 v1 E. E. p6 @# ~$ I( \
/* Enable synchronization of RX and TX sections */
5 h( Y# g* \# ?3 e8 Z( M8 m5 Y' dMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 K+ A1 U5 u: P' X6 F1 C6 p: }) A) nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; H$ P5 R/ b: J7 o. q' F
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
6 m! w- g* d' o) \: K6 I** Set the serializers, Currently only one serializer is set as
/ _4 _' R7 E q. l8 _; ?: X/ W** transmitter and one serializer as receiver.7 W8 ?* @: i7 z' _( m1 o
*/& V- g) `* ^: I
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; P! X. w9 i, H( Q% F: {; h7 \3 oMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
' B0 t% c5 ~: w/ v! l** Configure the McASP pins
* x: J( U* m4 J; w** Input - Frame Sync, Clock and Serializer Rx
: P8 p& P( f/ b* P- W: T1 |** Output - Serializer Tx is connected to the input of the codec
3 i! e& h% C' |8 x*/6 ]8 B9 ~! M* k. h- \: |: A* O- V
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);+ ^$ X ^7 m% X/ i, v7 c
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& u, |; T$ b' G9 J$ q" w1 dMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% Q, c( ^6 \/ S3 A" s
| MCASP_PIN_ACLKX3 B$ B% z2 c; b. P0 g% l. `+ E2 @/ p( s* |
| MCASP_PIN_AHCLKX; D7 w( N3 B: w0 u& m
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# G; w8 r# \3 s2 u- }McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 `; Y( E8 _- E/ }6 v2 V
| MCASP_TX_CLKFAIL
0 U0 B% M$ B! n: A& ~( V8 U| MCASP_TX_SYNCERROR
/ L' G" A: R8 h; t5 x# \| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 j' g4 v5 G2 [1 O& b$ ?% \3 J
| MCASP_RX_CLKFAIL) E5 q0 I0 ~% W. S# F% T+ v/ Q4 E
| MCASP_RX_SYNCERROR
8 P& ?1 p6 j, ^8 o, P6 G| MCASP_RX_OVERRUN);
# L8 a3 I! |$ e& V} static void I2SDataTxRxActivate(void)
( d) Q1 e# `/ C; q& N{
& B3 ?) d% U: B) a/* Start the clocks */
2 I( u' F4 B4 B9 f2 T) B0 ^ ZMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% W. `0 T# i* G. q, D% o+ pMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 p4 C5 m# L4 ?! E1 h ^" x% |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
7 u& N% ^; m1 r# }6 CEDMA3_TRIG_MODE_EVENT);
4 _$ Q7 y9 F* zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ u3 g$ Q3 ^. Z8 x4 ^! @% O6 ]EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */. u) y$ N7 O6 U
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 s( q7 C4 S5 O2 _. o5 \9 [! H: P! OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
3 R& Y- u- G$ [2 v# bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, j& d: z! w% h* GMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 V' X" _) ^; ^9 C
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 S! r7 f9 I0 Y9 F6 x) S5 p
}
; B! }7 Y! \ e4 D1 F) [请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 a+ p# P) n0 ~6 @
|