|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ z( A6 g& H/ L) C! q1 B
input mcasp_ahclkx,
3 ?0 j4 z: l+ d# D6 i% [4 B5 R- Binput mcasp_aclkx,* I5 {" z( m6 o% q
input axr0,1 M7 K4 U, h" @/ Y
* a# K% [# Z6 }: T; coutput mcasp_afsr,
. P0 M ^! s; z/ v9 t" U; k. p( Eoutput mcasp_ahclkr,4 P, ~ P7 O1 _4 T% u7 R9 I
output mcasp_aclkr,
$ S$ ^1 v9 x E; S5 x* Eoutput axr1,% j- B6 X# g& Z0 {" c0 A
assign mcasp_afsr = mcasp_afsx;
6 R# V5 T* k* D4 V+ u6 uassign mcasp_aclkr = mcasp_aclkx; F8 R; m5 @+ J+ f+ Z/ w5 g
assign mcasp_ahclkr = mcasp_ahclkx;
5 y: d# S) Y8 _- S7 r$ @assign axr1 = axr0;
9 @" U9 M( \) J, {- [; @0 j2 o0 a
$ m7 e; N* A6 ^1 ~4 W在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 , O: h4 K1 R) V$ N& j0 D
static void McASPI2SConfigure(void)9 G% [# s7 W: M/ P
{
2 r; p$ ]* s) I4 @ p Q/ w+ ]McASPRxReset(SOC_MCASP_0_CTRL_REGS);2 |$ r1 C, r; x5 |4 ?8 J
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */' o6 a1 o" k* ]0 h
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 E& h2 F w" l; P
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */; v% w V% h& A% k. Q. u. v
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, ]) R k. u, ^ g: c# g) i9 S. J
MCASP_RX_MODE_DMA);
' l" W# u( B( V/ fMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# o3 g8 E; Z+ L/ j3 G* j% W
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */6 }# e$ i3 t/ Y" J. G% H
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 ^! n. d; M3 O% M' I) j8 Q
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ g6 C8 _+ @2 u* N7 a7 }McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 P7 X$ x! z; P( ]% I9 BMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */$ ]* ~# n/ A1 ^) D* p, W$ Y, |/ [
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* C, a# y+ x$ h$ r- G) j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; n& ?& f& @7 f; \, u0 V
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) f P& p- U0 N, F$ v1 Y; ^) ~9 U8 G0x00, 0xFF); /* configure the clock for transmitter */
. u( f% W* `" v0 X+ J% ZMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ K; q! H& @0 J/ ]7 B! _% WMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 V7 B. W8 S/ Q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 v+ m8 Y$ [' Q& T1 B( ^, u0 L0 M0x00, 0xFF);
8 a* V0 L5 Q; r& L8 b, T0 K1 }' Q8 L% {7 b' @. A6 X' R
/* Enable synchronization of RX and TX sections */ ; F8 }3 h- g" x
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 g' s( z, z( \9 o& C/ nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* x; u6 Z8 B: iMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
- k- f5 i7 _3 l* M9 Q H1 H4 q$ I+ J** Set the serializers, Currently only one serializer is set as
( i) g6 `- a+ }' b0 d$ A** transmitter and one serializer as receiver.
+ W& i: A0 o2 q* [*/
& l; D2 [/ y7 TMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 D% \! P$ k# x* H2 B
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*. u, |3 X) Z& E8 M! d' C! b
** Configure the McASP pins 2 w# T- \* @+ D7 w% s
** Input - Frame Sync, Clock and Serializer Rx8 @: C7 w8 A2 k6 @$ l/ x* S
** Output - Serializer Tx is connected to the input of the codec
( h' G; f8 E7 _/ R4 P* V/ v6 F g*/
+ u0 ]: V% E& t* m: c' ?8 K2 M- LMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ M+ r; M* `2 K+ C, }+ C/ k) q @) jMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, i- y, u1 n, m4 `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 H* e6 l T0 G| MCASP_PIN_ACLKX. ?! o' c% F8 r' Y
| MCASP_PIN_AHCLKX6 P8 r8 k8 h; v, {4 {! e- ^9 \
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- o/ ?& J7 P0 Z+ C9 y) ]
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
8 D0 ^4 E; f Q| MCASP_TX_CLKFAIL # S3 S% Z7 ^0 O7 x
| MCASP_TX_SYNCERROR5 \9 n. c4 A' H2 V [( `1 n
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 u f' y/ `, B3 X. U: R
| MCASP_RX_CLKFAIL
$ q; k- c/ V0 U| MCASP_RX_SYNCERROR
- u% X5 ~2 x4 U# f7 z/ H| MCASP_RX_OVERRUN);6 W! F, \- b# k4 _( m- f. Q
} static void I2SDataTxRxActivate(void)
( I- @& w2 S) s! X" T{7 K# d" `' d* a" Y: o! l. U
/* Start the clocks */
! a1 {0 j2 K. n9 S, y4 S1 |McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. q* Z- `# u, E/ c7 F& wMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
& z5 m2 f/ @ j& V' s( s) SEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& j- ^! P* h2 W6 r& bEDMA3_TRIG_MODE_EVENT);
. L2 @) P+ ]: A, u# K6 A& A1 E5 ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 A0 }0 m% G0 M2 U6 B
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
# ?9 u0 r" l, U0 w+ PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ [8 f! i* m6 a F: O' T
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 E& M! n6 Z1 T. c. X7 W
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
8 f& h( i [6 o* t; O J0 qMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 ^* M* t2 H% `McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" R" c5 q& E$ i$ \' `. P
}
8 `" `8 Q( u A4 x, Y( L2 x. R4 }请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 6 D4 G. n! e0 o5 l% m
|