我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,# P2 x! r$ v+ x# l$ v; S0 @
input mcasp_ahclkx,
4 p! z' Q# }7 ~input mcasp_aclkx,
- ?) X" j0 v5 K9 G" g9 A$ ninput axr0,
) n" ^# c n5 ^, B& G
" \. ^' v; }! Y) W" foutput mcasp_afsr,7 l7 a- L1 j0 i5 u
output mcasp_ahclkr,. w; c$ ]% `. v- p+ G- {5 W# o Z
output mcasp_aclkr,
# r' e* B! u& @. p6 s. z9 m4 [0 g$ woutput axr1,$ X. }9 B9 s" J* O. \
assign mcasp_afsr = mcasp_afsx;
* B+ p, |! e }7 H4 |assign mcasp_aclkr = mcasp_aclkx;0 h% C# Q8 J# p* {
assign mcasp_ahclkr = mcasp_ahclkx;
# \! }$ q* J g8 K9 \assign axr1 = axr0;
( J# h7 v# r% S6 F1 a
% p' [! m9 x( M, I1 d: C在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
2 j5 S( d2 e- z4 istatic void McASPI2SConfigure(void)
) X' O& U, x: E5 Q" [3 X3 {{' J4 ?' g$ K. e% o+ F2 V/ i
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 w) I. r# w, W: MMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */+ Z7 |# d( ^0 Z+ s5 f
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 K. f! b; l" c$ Y) o* r2 p2 R
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */$ U! B& J& M! M; q; g
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 }# u2 z8 {3 IMCASP_RX_MODE_DMA);
- J E8 @/ t1 F8 t3 K7 Q5 QMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& L) o0 V* y3 g5 F
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 u6 i7 X# I4 p2 s
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , ^: R/ v$ m: l x1 f$ H3 j( L' l: g
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) \' Z/ _: G( E" B1 J" ]9 T
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 ]0 p) T: P6 C( G& K+ c) D1 J
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% N/ d* N: m! u
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
4 r/ g! u" A) ~6 g. yMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 2 [% i- f& {; b. O. S; P* v
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ R4 J% G4 C# x/ G! \& m0x00, 0xFF); /* configure the clock for transmitter */
% U9 Y, y) @' F3 qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, I9 M* M, ?# l
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
; h# `0 I5 t2 j% ~8 @7 fMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# ~! K/ d0 g o$ s. y) P( x8 R7 F
0x00, 0xFF);/ V9 o4 d X3 D. K
2 ^: J; S# j* @2 I7 G6 U( [/* Enable synchronization of RX and TX sections */ " C5 Y! V+ L, Q! Q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */& z) R6 ~7 X2 S6 A q0 A
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. a% V% e. l: m9 vMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*+ q& N; p1 T: K1 I1 y* t
** Set the serializers, Currently only one serializer is set as
. m3 B. Q4 k1 I1 ?** transmitter and one serializer as receiver.9 z3 y. ^* F/ {" W
*/
& w8 k& h( p/ N7 ]* KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# T; S$ [4 E* J9 H/ Q
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
" v' q. o1 c) u% z4 h: ^7 z** Configure the McASP pins
: [. c( N8 x, S# _7 u8 \& j** Input - Frame Sync, Clock and Serializer Rx/ \9 z0 Z0 a0 v/ n) ~' h
** Output - Serializer Tx is connected to the input of the codec 9 X3 Y: v3 l: C/ v% `% [. m. [
*/8 C7 k+ ]7 \* p9 {; w0 O) @" n1 C4 F' {
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 M% q1 y- j+ p/ ?# oMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. q* y# h+ H! W1 X3 A7 EMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% Z9 E; w5 h% X7 a| MCASP_PIN_ACLKX1 _+ d5 b3 t. t6 _
| MCASP_PIN_AHCLKX
- l* q6 G# O+ T" T. E| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
8 w5 S; h" X- t- WMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 {0 j, ~& V9 x8 c
| MCASP_TX_CLKFAIL
7 R7 _6 |; M0 T0 P4 B( R9 a9 C| MCASP_TX_SYNCERROR: \ |# t% v$ i; M7 M5 w- J
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
4 z) q" O! l S- S3 B z| MCASP_RX_CLKFAIL
2 G& R4 o9 n0 N' U% X, j( O| MCASP_RX_SYNCERROR
0 A. o( G! j1 x9 t| MCASP_RX_OVERRUN);$ e) s t2 j$ g6 C+ a/ N
} static void I2SDataTxRxActivate(void)- P# a# U4 l' n3 _) `* T
{
, j( D( U# Q: Q3 G/* Start the clocks */6 m8 m8 [) P0 o a# K
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 [" ?; U3 M. Y) i
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */5 o0 r' I+ k* S9 m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 i3 s( V: w/ e4 v
EDMA3_TRIG_MODE_EVENT);
# n$ }9 `+ F% ?3 C' w+ H% Q# K8 J7 fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) B3 U: b% x( k6 B- xEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
$ W4 b0 [6 g% v% m% |4 F% aMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 { c5 z/ T& A5 x, F7 |4 g5 dMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 d [- p7 K! X2 X
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */0 d+ L- k, p! @4 o
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. Y& P( e( C1 t2 LMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' {3 ^/ k8 x# y4 O) B}
; b9 e* }& B( g- L请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ |( Z& g3 p2 ~: d s |