|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
) d4 q1 }1 \7 _5 k9 {! V3 b( J& Yinput mcasp_ahclkx,
# \' v2 V" P; x: u% q* ]input mcasp_aclkx,
: ?$ x) v7 T, v: F+ `) i* D2 f) @$ uinput axr0,$ W% j5 R4 A' f8 J8 d% [
9 R6 x3 J; s- ^) _8 _! Boutput mcasp_afsr,2 X0 j4 Q" K# d; r' a; n6 Z& O& H
output mcasp_ahclkr,
# Z! ~; \* [/ t( I; D2 _* Toutput mcasp_aclkr,, Q" V6 B+ m2 e6 H5 F2 x8 b0 X
output axr1,
2 `+ }% _5 e2 \# ?2 d1 ]5 b assign mcasp_afsr = mcasp_afsx;/ q. n P8 o; `/ X+ s `
assign mcasp_aclkr = mcasp_aclkx;
7 P$ q4 W& l6 h1 l: R+ Cassign mcasp_ahclkr = mcasp_ahclkx;- n" A. M5 ?9 X
assign axr1 = axr0;
, ^" C. [( V# l2 B% a- @- t- N( q* V- M( _( F+ z U
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' X% {& o3 A3 e5 x3 b6 o& U
static void McASPI2SConfigure(void)
6 @4 p1 h1 C4 k+ z2 j. o7 s{
. Z% o8 D6 L" o. X9 N$ AMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
# M- R6 i# W& V/ b$ ?+ N: zMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */# W$ X) `: l5 s1 u: y" g
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* X( K. Q* [+ P0 }* K6 H. b* U
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */" t+ B# _3 r# M7 u( E- ]
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ l+ O% |, Y( O( j+ ]8 R2 ]. CMCASP_RX_MODE_DMA);3 C0 }) {' u; ^: c( `
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! h, J% x( u) z
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% j8 j a; _: ?2 X: O' l3 J
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! {& t+ }) P2 A8 j( QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 E2 {; o4 O, i RMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 r3 ^* b# S' l9 O. D2 k9 x' S
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; W4 U2 s& U( e( FMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ ^3 [; d* g9 ~$ S9 w! a0 W0 nMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . y2 `& n2 l1 W! \- Q' h
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ ?$ z. N% p+ ?5 J$ c) Z
0x00, 0xFF); /* configure the clock for transmitter */) f; c' ^7 R$ ]9 G8 v$ D
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ ~2 \: n0 E. E3 k* P0 L3 oMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" z2 |! a. T9 D0 U m$ I! RMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. a# W% X9 c- X, }- u: {
0x00, 0xFF);
3 m/ }$ _2 p+ w
, V+ Y8 c% R, i. K/ D J7 X( t/* Enable synchronization of RX and TX sections */ ' |4 @ a" i0 K6 ~( C8 d D
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */. Z; O5 _8 |3 x: p. Y5 h
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 B% z2 \) g0 t' G9 N; DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*& [( J- j9 r: U O+ G" L v5 y& p
** Set the serializers, Currently only one serializer is set as0 l. j. M/ ?1 S! I( X1 H
** transmitter and one serializer as receiver.8 P- k) K# l8 [/ V
*/
3 o, K: o" E- m, A, \' W/ GMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% v4 @+ r, b. l1 P4 s7 B
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*3 T) \3 T; n* T+ u: k2 K
** Configure the McASP pins
0 U. s6 D' Q! K4 Z4 E** Input - Frame Sync, Clock and Serializer Rx
2 s8 \4 S/ w& b& B5 @** Output - Serializer Tx is connected to the input of the codec 0 ~9 i( ?7 P1 `' Q
*/4 l u, @! x% O
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ f* h8 n3 K$ [1 _# d% iMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
L6 d! f( k* Y- c* r% M' Q$ OMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, q' i) E! r; n8 ~; ~8 {2 H
| MCASP_PIN_ACLKX
1 |( {- c( N( H% o a4 E4 k6 n) k6 t| MCASP_PIN_AHCLKX
4 s5 G% K; h% j" D3 R7 `7 }| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- W- u% i9 r. {$ S( U
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; m. D2 W, t% `$ x7 \' Z# ?
| MCASP_TX_CLKFAIL 2 V6 W/ H; S9 A; a
| MCASP_TX_SYNCERROR
6 {3 P5 ?# \3 M7 Y( O3 O1 O| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) g3 [! l& `+ U! r0 q' n| MCASP_RX_CLKFAIL
) V8 J2 |+ Q# G- z6 `* j| MCASP_RX_SYNCERROR 0 F: V. e, \4 Z8 j/ F: D; N/ m
| MCASP_RX_OVERRUN);
' N! P7 f$ b3 l J* b} static void I2SDataTxRxActivate(void)9 Q2 S) t7 W8 u' f
{
' r0 O( k9 ]6 P/* Start the clocks */' s1 w/ ]# V4 n. a: d
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, ^7 C: O5 r, L1 U; l! j) c
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
& h6 l) S4 x0 Y. C7 q- TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; k/ j5 g: y, E
EDMA3_TRIG_MODE_EVENT);
7 F* O+ ~+ x8 Z% ]/ @, K5 w LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) p) @ O% _% r2 h0 q: Z
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 |* b8 ^) s1 G1 ]# p; q1 ` AMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ Y7 u7 s+ [& @! _0 Q. A+ QMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" q7 J v. B: W2 M7 U; h6 Pwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */5 r8 J4 Q! n" {+ X- ?5 [
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) x" e4 n# k; r1 @5 s; w) P- uMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);' R, @( o: J$ l9 G
}
" l- Q& ?7 }; C' e% e请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 t+ c# z; e5 s1 k, d7 ?2 k |