|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
# `- l( _- O: g/ R* @) p) w9 oinput mcasp_ahclkx,) G+ _! A4 I2 S( X' R A5 Q4 R& u
input mcasp_aclkx, q) G$ h! G* @
input axr0,
5 ^" A- }" K* s. s5 A
2 W( r+ m T, D2 y& r) r1 soutput mcasp_afsr,& M9 P& q% J4 p! a- n& g$ Z" z- Y
output mcasp_ahclkr,+ Y* a( I3 }6 }
output mcasp_aclkr,
7 [4 u" Y1 M( coutput axr1,
7 Z, p3 P- E, a5 \0 g+ w$ W* h9 V assign mcasp_afsr = mcasp_afsx;
! A+ ~- k! G* z9 o/ O# m" @assign mcasp_aclkr = mcasp_aclkx;2 H* Z/ l/ l" N, y: k' v
assign mcasp_ahclkr = mcasp_ahclkx;& [0 V4 M8 u3 L8 S4 ?
assign axr1 = axr0;
; Y+ L0 E$ D( g$ @2 K! z$ S
- h4 r5 J" T- N% Z* b2 }在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 $ _2 A/ m( N* S' `9 m) W
static void McASPI2SConfigure(void)
* ^% _( F4 ]! O! K; s' N O U4 c. f{
. V7 z6 c$ m+ T5 MMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 \( {6 p v" [1 UMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. Y6 P1 ~/ u d0 ~9 \& F8 X* U5 i i$ C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ {. ?8 ^6 |3 U3 iMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */6 W! `4 ]; K9 D. J- x: G
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% @) Q1 r8 W/ O: S6 PMCASP_RX_MODE_DMA);/ F/ Z, v Z% i- g8 C% s5 q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 {$ E* n' Q7 A8 M, l* Q4 mMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
# k( y& T5 W4 ?4 c% wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 m8 N$ c# R2 Q& O! ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! e( v: I0 h* N- WMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& n/ @, W8 L" l% sMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
6 j7 R' R2 n4 W, X8 H, E) ~. w' jMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ N/ D: j8 {: Z1 P/ S) bMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ l$ {, u2 f6 h. V& J/ ]
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) X( X( p- ?. z4 l, B6 |; P$ E0x00, 0xFF); /* configure the clock for transmitter */. C+ \: \9 L1 v3 m- R' l
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& i; N/ M' a6 t( p4 w; K9 {
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
4 {( |. n7 [8 R) \ {7 s" cMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% a8 C0 @8 T) i) l' ?0x00, 0xFF);
7 Y- G4 B$ u1 {
% o6 W# H! F2 |* N# F$ }9 M5 h G3 r/* Enable synchronization of RX and TX sections */
; V4 _* `! `) {6 k4 \+ ~. CMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */2 q% [3 b1 Q1 u7 s% M+ W
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( L! `/ j" `5 j- _* n+ C
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** }7 a$ U, p8 y6 L, m Y
** Set the serializers, Currently only one serializer is set as
1 X5 @0 i0 G! A: E! b0 D** transmitter and one serializer as receiver.
$ |! ?/ \, Y2 T' p* d& l% r, ?7 K*/! R& e" Y0 K- ]
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ U' e9 V- Z3 T, k' I# q* RMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 X" K9 L8 E7 {) B; ~) H8 [) Y$ U
** Configure the McASP pins 0 p5 b1 j" J6 T* H* F3 Z1 M# H
** Input - Frame Sync, Clock and Serializer Rx
/ l9 d& S4 P8 v** Output - Serializer Tx is connected to the input of the codec $ @" n) q2 q9 U( z3 _* F. ]
*/
! E6 h( M' w |# `McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
8 M a6 _2 Z5 s eMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: D9 b9 T* H( o" ZMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! Z' F" c0 E1 m3 i/ o' o4 p| MCASP_PIN_ACLKX: h0 [/ o- Y) _4 n( V! R
| MCASP_PIN_AHCLKX
+ a0 ?" p; @# S# m R& p, P| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 J$ l/ \% J. R$ J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' ]8 k7 P) P' X" r6 N3 k) t| MCASP_TX_CLKFAIL " E7 n. y- }- M% a( W2 y
| MCASP_TX_SYNCERROR
6 B0 x: D. c8 j' j& r, o" X; ?9 N# [| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; L% K; o5 r. E
| MCASP_RX_CLKFAIL$ p; S% ?7 L; L: j
| MCASP_RX_SYNCERROR
. V& ^/ _- X- R: K. G) ]| MCASP_RX_OVERRUN);
5 W x C+ ^2 |} static void I2SDataTxRxActivate(void)
) q$ F; B1 b. a- d1 S$ `) [{3 O' i/ T5 r6 o0 K8 h- D, [$ g
/* Start the clocks */* T; w% P8 @/ ^* {' o, V: q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' N9 P& V! ?" X4 S( z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */! c7 j* J' } q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% n, B5 v- }2 v5 r
EDMA3_TRIG_MODE_EVENT);
6 h/ f" z9 e# l% L5 a% n2 hEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 W/ J8 b8 K2 e0 { P
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
, x# S) t# B9 Z6 `1 BMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% C, S0 [) n" I2 IMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
I' Y) I2 w# K8 C- O% ]' Jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, k' b) i* `) R& YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 V, `/ f7 @5 _0 \McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
5 c4 ?/ j) \5 Z} 8 g- h! p% d$ N; p
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. & E* [9 W' M7 i" f
|