|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,4 b$ O B" J8 ` u0 E6 h( O p! M% p
input mcasp_ahclkx,' ~' Q+ [) n% Y9 x1 W# z
input mcasp_aclkx,
3 _# M( E X, i/ c. q# ?1 W3 Uinput axr0," X: p0 k" Z2 c S s% o* `
" a4 l# X" l* @. N4 A/ [1 _- I, g6 l4 loutput mcasp_afsr,( Q: l. @$ F+ j' D, O s
output mcasp_ahclkr,
8 `1 ^9 j v, U1 C" routput mcasp_aclkr,
$ f+ }+ p! w1 ]' h$ ^output axr1,
) N# I* r+ ]4 T' T6 ]6 }5 K5 D assign mcasp_afsr = mcasp_afsx;3 p6 x; _" E1 u4 z) _
assign mcasp_aclkr = mcasp_aclkx;
; }1 d+ j1 y: v# p0 U. r, lassign mcasp_ahclkr = mcasp_ahclkx;
! M/ k6 a( ^7 l7 K3 Lassign axr1 = axr0;
1 R4 {! p/ S G# E9 }9 f) C8 k+ ^: j Q: [6 l) o$ l
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 j, H6 s6 h5 m5 v. S
static void McASPI2SConfigure(void)
* @3 u. E$ F& U$ G5 e{% ]* }; q7 }+ j
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ ^% n9 q# x7 h. pMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */, W( {4 Y2 h x ? ]% G* B
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# Z" S" E* U5 \. Q+ }; S
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 u) O7 f" A! o6 u0 x
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- _3 ~( `3 Q3 [2 ^ e( p2 T- p9 MMCASP_RX_MODE_DMA);
8 H- S4 h( e, h/ _0 g' h2 H+ O# _McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* h7 \$ h; j: M/ F5 E& n5 [: DMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ \& s9 R6 x; ^( _$ ]* f; L- I- A! yMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 T0 Y9 }4 b* Y& o5 @
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% j! t* P, r% JMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; C/ k4 Y1 G# s8 Q& H
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ A) I+ `9 L) V, e3 I4 ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) g( S1 h0 [9 g
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! y6 x+ n2 ~- _7 qMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,3 E( d+ D- B" T6 u" ^4 q
0x00, 0xFF); /* configure the clock for transmitter */
6 f$ B6 K5 @" t2 nMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 {3 x& N9 y, CMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
u b* E1 O8 X/ g8 o0 B! ^, \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 b& ]6 z2 G! P7 Z' P8 l: B" d0x00, 0xFF);
& g( ~7 g# T% Q. r, C2 N3 w5 S1 x" C
/* Enable synchronization of RX and TX sections */ " o( m3 l3 h( w* L c. n( A! r
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* h" w& M8 D$ @0 Q3 J# `1 @
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" ]1 l! [$ `8 W+ m
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*" n8 U& R6 H. R3 U
** Set the serializers, Currently only one serializer is set as
7 w' v3 y/ S% B; E5 \* q7 T** transmitter and one serializer as receiver.# p: G" t2 d5 Q0 n `
*/4 H( g# r" _4 D' n# X9 J. B
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 n& T2 ~/ o& d3 ^
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*! q' j7 p6 R; I: q# `" m0 ~
** Configure the McASP pins / m- r; C) {% O! q0 w, a
** Input - Frame Sync, Clock and Serializer Rx8 _( e! p/ s4 c: A6 t
** Output - Serializer Tx is connected to the input of the codec 8 h/ g+ E- @4 B5 F( K) g9 z, ?
*/
: c+ W& v7 r3 Z0 u0 CMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);+ p% s+ Q$ ~0 [, a2 j4 H% _' G ^
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# A+ Q9 l; l5 `/ W7 `: O5 t+ `1 R
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: _" i) e R5 ~6 x( n: J% {: [3 w2 l| MCASP_PIN_ACLKX
- C7 x5 @7 S1 e ~0 m: p! A| MCASP_PIN_AHCLKX( @9 r3 R7 J3 z) ~6 Q( O4 M
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
; }- r, o/ _; K6 M0 {3 YMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; c" Q5 j+ ~! G9 {+ J+ j+ ]! b
| MCASP_TX_CLKFAIL 9 M" h' m$ H9 C [, M ^
| MCASP_TX_SYNCERROR1 S- x: P2 R5 T2 C& ^2 I
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
2 Y4 b1 W: V( c" C| MCASP_RX_CLKFAIL
0 G* w' S5 `$ O4 q" K+ s4 ]| MCASP_RX_SYNCERROR - I/ T" [" ^6 N% E. I
| MCASP_RX_OVERRUN);/ n0 R* f0 O" p" z8 y. e6 a
} static void I2SDataTxRxActivate(void)6 r1 x9 {0 {" S. I l' d8 X
{9 G9 ?' c- Z! D
/* Start the clocks */+ |, Y& o" \% l6 J
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
K. F( m! O+ q4 |* xMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
6 f+ a9 H5 U) Q. R1 X4 ~) b! fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& R+ P$ W8 N) i1 rEDMA3_TRIG_MODE_EVENT);; A3 J. `3 X" @/ v1 j, L3 N; m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) Z9 h& `8 ~: S+ [% F0 m; w
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
4 K6 Y- b# e9 H6 B% rMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 p5 ?& N. k; ~3 o% G) Y2 AMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 D) I2 D$ J4 B8 h4 M6 d
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */* j. s3 L( e3 L* i) p4 ]* @; S: P
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, T5 y- E6 X5 c7 aMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ m0 I6 l* S8 o! f& O8 W1 C
}
6 ]! i7 ^6 N* f$ [8 x# d, U请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 A& _% u$ Z, u+ y9 ?5 S$ g |