|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
k. S4 q/ o3 C+ `) M0 X& I$ Zinput mcasp_ahclkx,& z8 n4 I" K3 e6 J" w
input mcasp_aclkx,' ^7 Z5 n& ~/ B: P9 k7 p
input axr0,4 o" [) u) O; j; E4 d: j7 R
( T. [# {: s+ ~4 `. I# {output mcasp_afsr,7 A% @- s$ t" [% m2 c
output mcasp_ahclkr,+ _2 _& c6 L! W' l
output mcasp_aclkr,
5 l9 n6 [1 t7 `$ C% ooutput axr1,
: T3 y( t( v1 B1 N) M; ?0 H3 V assign mcasp_afsr = mcasp_afsx;
; n E, e9 D' qassign mcasp_aclkr = mcasp_aclkx;
% E- ?/ \' p8 s3 vassign mcasp_ahclkr = mcasp_ahclkx;# P! k% N1 c& l/ @2 g& G S* p
assign axr1 = axr0; * [7 K. R9 U/ b0 q
9 l/ s; g0 J1 @/ l) d/ K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + h3 |- Y; l; ?2 I; u0 y
static void McASPI2SConfigure(void)
, ~) N; U" b' @2 L) Y{+ r3 K6 y$ R2 l! g3 F
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ [0 k* ~. K2 }5 \, CMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */: n8 l+ g% |4 T1 i# M
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 Q6 `/ G! b. ]0 }, F
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */3 o0 B4 Z# B- I0 P, W( |5 \1 s
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: W& @" r" c/ J* Y( v; PMCASP_RX_MODE_DMA);
- J% f! t* @. `- ~3 P. i8 ~9 oMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ k- x1 h5 O( y T- I
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ Y- r' \: x, a- {
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " p, }4 d1 o& v( b4 A
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' U. Z% @1 }6 L% Q/ p
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & s+ b. Q9 S3 V& X& A0 P7 C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 w+ U J; o, l& ]* [7 _8 }% OMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) Z8 U2 x: B- x m. G* E
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 ]0 p7 `. S6 w9 K/ Q* X3 v: ]McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" O2 g# l# J$ i& ?0x00, 0xFF); /* configure the clock for transmitter */) s4 z9 e. l3 C- C
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, e% z# f4 d3 {/ s0 dMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# |8 w/ F1 g9 e' F, N/ \+ Y, gMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,! l% K5 P' u2 E$ i) Y
0x00, 0xFF);/ Q1 @' [. R- y) h1 `# G8 N l
' }4 w# H; w, @" k; {0 I& n( X& N
/* Enable synchronization of RX and TX sections */
9 S9 s* w4 [3 Q4 x% {McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ M4 |- m6 h9 IMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- ]1 M& Z+ n9 g+ g; hMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: Z! _: J$ F \* t% M" W+ z! m
** Set the serializers, Currently only one serializer is set as
2 e1 p# V' g: p2 x0 A** transmitter and one serializer as receiver.
) ]6 [' K& Z& S& u8 }( D/ i*/
( h" h. G. y# {5 ~ w* \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 Q0 D! m. F ^* X2 ]2 A( wMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*# @ }& J6 l' R2 n7 y# Y
** Configure the McASP pins
+ ^0 J+ M) S7 X5 _) H8 l** Input - Frame Sync, Clock and Serializer Rx9 ~& C0 U7 [! W6 }4 |, |: Y+ w$ `
** Output - Serializer Tx is connected to the input of the codec 2 q; U4 H! t0 d0 V8 ]/ W
*/: B/ C% G# ? f: K8 m f1 U. c, x
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 U. C! V' z/ B5 k6 Y1 N* Q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. Q6 ~5 E6 s8 W8 a8 a8 a2 hMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. d8 K. n5 z9 _, R$ ~| MCASP_PIN_ACLKX
- f4 u9 F1 u9 Q8 T. f7 C| MCASP_PIN_AHCLKX
& M. C2 K1 R0 M| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ j: \2 u& d, k- i2 n$ r
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ N- j- d8 |2 _$ F* G y$ u1 _% h
| MCASP_TX_CLKFAIL
2 x& b2 f1 O* p3 r| MCASP_TX_SYNCERROR$ c5 \4 q# i; M5 }1 x3 y9 K
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
$ T: R5 C8 u5 s6 a| MCASP_RX_CLKFAIL
% s$ X* ]: p @| MCASP_RX_SYNCERROR * b& n# A" z; L& g M1 y) F% \
| MCASP_RX_OVERRUN);
+ R: V, k0 V% j5 D3 d3 S} static void I2SDataTxRxActivate(void)0 v/ V/ x: h4 R; a" l0 c
{
' Z2 i7 `8 \- F2 o, J5 y/* Start the clocks */; t) N4 K" q0 W6 ]5 I0 Y- L
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 ~& o- I2 i6 V2 V+ u* \ cMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */. ^4 y# |& q9 x7 |, Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ h3 k) s: u' j' y4 B1 DEDMA3_TRIG_MODE_EVENT);; n* Q# r6 G, o8 M/ E3 U; c* h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! x' V4 e$ u) r5 f9 Q5 |% s
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 t1 R- l: F; C# Z5 iMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 F4 ~; e* X6 s! j; x0 HMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
7 G4 }. C$ z; ]3 n3 e9 K* _while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
$ O* F; C( u% z, T2 f: qMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ \. h& n7 S0 U$ H; ~* f6 l# `
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. h) d# m. Z: i- s2 G} ( _: N+ P: v" G' F
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. % y1 d/ H! \8 Q
|