|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,3 i6 u2 C- M# d
input mcasp_ahclkx,
" C! `4 k$ n9 B9 S: @input mcasp_aclkx,
& \* Q% ~$ E2 i- @$ G% }5 @input axr0," }6 \' U- v- W2 F& y1 f/ s" t
9 S3 k% O" F9 O% S' D( a
output mcasp_afsr,+ h/ K' B2 ` P5 E/ Y/ o
output mcasp_ahclkr,- d7 ]! K- B" @0 ^. F7 e
output mcasp_aclkr, V6 @" l2 e5 }3 ]8 ?1 M2 v% y
output axr1,' n# [! v2 M$ u/ `0 _
assign mcasp_afsr = mcasp_afsx;
; z A5 B- B, E7 @( M* X) Yassign mcasp_aclkr = mcasp_aclkx;
. _3 K7 g# E' |4 ?7 [: m* `assign mcasp_ahclkr = mcasp_ahclkx;5 D/ }3 m3 K. u/ H! E$ B1 A2 N# F( q5 g) p
assign axr1 = axr0; * Q4 b* d j9 x. O- k" y7 d
0 u1 Z& H7 l8 P$ j2 E/ Y2 F- A
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 r% T0 P) n# U ^
static void McASPI2SConfigure(void)5 w0 B: ~' C" ^; U1 e5 w
{
; }, F* r& q. u- y$ `McASPRxReset(SOC_MCASP_0_CTRL_REGS);0 [/ N1 ]+ [# {# I3 C: x% s8 w
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */7 M+ o' d) O) O5 Z' b% T }
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 G$ O7 M) _! z
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
% S* _- p+ V' a9 W! JMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% G m4 G1 t! L2 m4 @MCASP_RX_MODE_DMA);
- \ V0 c( [# k: B' j: fMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 g" B5 h# i* O7 y: z
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ ~$ ?! b! X6 Z) n* BMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - K. ?7 s7 V5 [: K: t6 X
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" N: Y2 ~8 [; W
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 k) d7 p( F) D
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
1 U3 ^7 |" `3 t9 p9 E# E1 RMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 K4 t4 Q9 F# E, [! J) y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . \* Q5 F- C, S- ]; Y
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 k# W/ _) y( x6 Y0x00, 0xFF); /* configure the clock for transmitter */; D2 b( o5 R( o0 U1 s" B0 w
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. U2 c/ O" W7 k. FMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " k/ D. ^- L+ k4 v% a# H ?
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* x; y' H/ O4 i2 w
0x00, 0xFF);0 @0 S+ _7 G* s( F/ O
5 R8 h4 j9 M y$ ]% Z. P w. e/* Enable synchronization of RX and TX sections */
9 g" }) K3 R* G+ g8 hMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 I( V: i6 y- H0 E* v8 w5 qMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' `" P3 U* s5 S) z; h
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
5 V( O) S1 L0 Y, ]: G** Set the serializers, Currently only one serializer is set as- e( v! a$ P* ?) d+ v8 ?6 k# Z8 M
** transmitter and one serializer as receiver.
, x; W6 ^4 x0 r& C3 q*/( I2 T0 N% y$ A* h
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ B: O& H. v% y% f Y) P
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
, F+ G: Y& q5 B, {$ q! ]0 W1 l** Configure the McASP pins - z A; {+ u0 r6 b+ k
** Input - Frame Sync, Clock and Serializer Rx
6 z N* Q- m( v2 d' b/ I** Output - Serializer Tx is connected to the input of the codec % F" i$ l. d# ?; j; p6 W" D( O
*/
# m- Q3 w B9 Q* yMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: p% Q9 j8 b2 A
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- a6 u' A* u8 r, g
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& L- n0 Z& m1 S# _/ Q" A& x| MCASP_PIN_ACLKX# o1 P) Z% W( D7 P, F3 X
| MCASP_PIN_AHCLKX0 A4 V+ x# k2 K: o
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
. a4 L: i* E7 P1 O/ f. v% e$ G; XMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ u Y% @8 p% m% T0 j: i+ c| MCASP_TX_CLKFAIL 7 y7 z& n$ _; h; W
| MCASP_TX_SYNCERROR
! G1 J" K: P9 \. _, H0 C0 h| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 E4 ?+ z( i S; e: O
| MCASP_RX_CLKFAIL
/ ]4 O; F; ~9 x5 B| MCASP_RX_SYNCERROR
, q( a8 e% n9 Q| MCASP_RX_OVERRUN);
# Z$ ^+ J! }+ d} static void I2SDataTxRxActivate(void)
6 K# L* k: W" h( Q ~9 a{! K# L9 Q" I6 i* y
/* Start the clocks */
2 ]1 A2 e1 k/ Y5 Y1 P, {McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) k4 Y T$ |0 K9 z; y: _
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */, Y B& p8 \2 S8 z: D1 E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) `4 l9 |' K2 w7 @ X: o, ~EDMA3_TRIG_MODE_EVENT);4 h. x3 B6 P5 H# _: m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% Q! r7 V2 W. h; a2 u6 @5 z CEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */3 \' U5 \1 S# x( B9 w1 M1 {& y5 c
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ }# ^/ m$ f4 l3 N
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero *// X8 B1 K8 J* @3 A9 x R# y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
3 c3 K+ y8 \% RMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% ?! [1 T- E0 e' G" Z8 h; r5 ?9 MMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 w* `7 D+ h/ T F}
: Q) O+ @' I1 G2 P4 s1 H {2 L请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. : }( N& a) U4 F' q, P- g
|