|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ ~4 X+ r7 N% |9 G A
input mcasp_ahclkx,
2 A2 R. x. y+ m' Z* Ginput mcasp_aclkx,
f+ U0 u2 w1 ^5 finput axr0,. Y1 h; }7 f- T7 O: v- v
; P P/ ~( w, i+ o0 F1 ~/ \5 l
output mcasp_afsr,
; W6 }9 s" o8 moutput mcasp_ahclkr, R, |' ~+ c) K7 Y
output mcasp_aclkr,# A0 b2 @7 v* c* E# }
output axr1,1 k' F$ W+ M% Q* v' m6 `
assign mcasp_afsr = mcasp_afsx;
* ]5 G1 L2 ]' E+ ?assign mcasp_aclkr = mcasp_aclkx;
9 [/ X" ^0 \1 f1 Wassign mcasp_ahclkr = mcasp_ahclkx;
7 f% [5 e; f" @1 H5 ^! @/ X1 lassign axr1 = axr0;
2 Y. s+ W [. L4 b% Z2 O; n- M( _- o. _: V' `: F3 H! F1 _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
; W, i3 y* B- {static void McASPI2SConfigure(void)' s5 p3 K/ u4 t/ g
{3 X. Q$ x, M. A W0 g" j
McASPRxReset(SOC_MCASP_0_CTRL_REGS);/ C, u \' i9 d9 g6 j8 y* o9 o
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
6 j) j* p* R2 ~( hMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 H" [* G1 ]- Y# ~& P; x
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- H' l# D) |" d! {4 t" V9 B
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ C8 [& ]& a0 U
MCASP_RX_MODE_DMA);% E4 Q6 ^, p$ ?# X8 O
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# G4 j9 ?9 w: L, t; CMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots *// Y: D/ s# A6 W& ]# A
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / g2 g/ Y P& \5 t' ~
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 w/ h/ f* l% ~( lMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. X9 r( Z/ A$ r) x) sMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 Y: ^8 M- R/ S. r. X
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 J! \1 y( }1 o; v5 p
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" j5 ]* S) F8 E) G# i# Z; L: p9 \: TMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( Y3 g/ g# c- N+ {1 V" B/ W
0x00, 0xFF); /* configure the clock for transmitter */
" g9 L% J B6 e; }' d: g( @( rMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 H2 Z+ ]; [1 ]9 N" B
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 }% @; u, K7 T: a7 J! z2 ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 I" @" J, S8 {: ]' _
0x00, 0xFF);
7 |2 D9 q& e8 ~) F( y) `; q4 i1 @' H3 B# [
/* Enable synchronization of RX and TX sections */
& b- @" T, ~* F4 s/ Z, G3 Z5 T: LMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */2 ^! l- [9 [0 ?$ g
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 o! p' b. h. l' _
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: l/ Y- Z" C, Y2 G3 V- l; T9 a
** Set the serializers, Currently only one serializer is set as
1 P9 A- {; h9 q% z6 X# h** transmitter and one serializer as receiver.
! q& s9 ^1 q, h( _*/
* L' l6 W0 Q! {" @McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; _$ W" c2 Q" [" J1 P G; V3 | {McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* B) F+ d% w& h' R, _8 Y5 R** Configure the McASP pins $ e5 G/ Z: G$ y' f+ @0 D9 O, L8 a; O
** Input - Frame Sync, Clock and Serializer Rx
5 I8 q& W1 t3 j** Output - Serializer Tx is connected to the input of the codec
& n% d [4 q9 _$ L; D$ a*/
- t0 U5 \* ~5 S2 p' h7 n5 Z$ `& F) BMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! ^2 |$ j/ R- U) J' I
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));6 B- h5 a. \9 `: M3 O
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% ^3 [" G( V; f# u| MCASP_PIN_ACLKX
! M9 v8 f( T/ y8 R# S$ Y0 C| MCASP_PIN_AHCLKX
. `/ y! L2 B* m' j4 v" q| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
, k$ v' c9 Z$ B' bMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR g" z: e4 |: O, i) i! P
| MCASP_TX_CLKFAIL 5 d/ {. p# H, _- p! l
| MCASP_TX_SYNCERROR
4 w4 m+ y0 w6 `* M| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # J4 e1 a* r) R( u
| MCASP_RX_CLKFAIL
Z% g @" n6 ~# Z6 U| MCASP_RX_SYNCERROR ! b' D- K. E( j7 \
| MCASP_RX_OVERRUN);
' }1 i# u- |7 } [% f# d I! l: k} static void I2SDataTxRxActivate(void)
6 O5 ]4 K7 b) Q" H! k4 C{( s) `2 v5 H0 Y- }5 H& T
/* Start the clocks */
% h# B* L. S3 L; k5 ^- \$ _McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% c+ e }( V- e1 b: w4 kMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */# i' P( l! z. V/ R2 B5 {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' F! u3 K# ~* S- E- EEDMA3_TRIG_MODE_EVENT);7 q. O0 E C" g. d& |) P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& j5 i5 Q2 v Y$ \EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */2 t' ]1 P- L4 p
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 e4 ]. T/ Z; e: G$ n
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
, i- H8 k* [! q( i/ x+ z; Z% rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
; W; a5 e, \$ {! l O' I6 EMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 t2 B* R; ]$ n# }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, _6 F, G1 F+ H+ l9 u* m} 0 ^$ r- Q1 u6 T' J2 g# [- h2 J
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ; H- g q2 Y) j0 S
|