|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,4 E8 b1 R% g4 \
input mcasp_ahclkx," ~8 J! w/ \; ]* f: g; k5 {
input mcasp_aclkx,
. q% E! f7 { _, [- \ E7 v( Jinput axr0,
/ ~! W5 g% q: C2 |7 q! |1 M8 f( r N& @6 `- c0 q k4 b
output mcasp_afsr,4 U8 x$ J$ D. I- C7 t* d( M* x
output mcasp_ahclkr,
$ P. q- e# ?& H0 x' O* Koutput mcasp_aclkr,
- m3 V. c& P% Z& f9 J+ x) l+ S/ k) |output axr1,
; m* h% f, m! p( Z) l, x, a! X assign mcasp_afsr = mcasp_afsx;
! H# W+ y& r5 y2 Aassign mcasp_aclkr = mcasp_aclkx;
' }7 Y; }9 H1 J$ Passign mcasp_ahclkr = mcasp_ahclkx;) p# L8 U, t8 I/ E5 u2 E
assign axr1 = axr0;
& N& ~( S5 B, Y+ {- Y7 K k4 @$ O0 N9 _6 G a. L& X2 M+ N
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
3 t; C% M- ~$ j; z' Astatic void McASPI2SConfigure(void)" J; Y! _- l9 Q3 V: J/ n# D
{
; z5 X, I/ H' _) }+ Q8 _" KMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ k$ ^6 Z$ e/ n1 i7 E& t0 R; XMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */0 K. M& \2 j' l8 \& N F' {, Z7 ?
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' Z l" d; u3 l/ d+ x: r% iMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */+ s) ~% w0 j+ k: g1 ]+ o! `* Q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* K5 H7 K7 h2 u7 G7 U% o
MCASP_RX_MODE_DMA);
) B. `4 u/ X, D- \9 ZMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- l* E* g/ x4 [" S5 r" T
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */# }3 O. N! Z9 m- ~$ Y! X( _6 ^
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; y7 D5 O- r- d4 c$ s, n) p$ x6 B
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ l( ^- p, }* |: A7 o" J( z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 F& X6 ~& e( c; v; BMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */) t9 _& G3 p3 |5 w
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. S( r3 T. J- B) n
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 g; }! ^6 C$ h/ rMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ f" ~$ a; o6 o# M6 r! b
0x00, 0xFF); /* configure the clock for transmitter */
( t% p2 }8 {: M- u7 v4 p# f" |3 jMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 ?7 ~7 n$ T1 m, s- N& F
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 j$ d9 R8 e2 EMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 @1 F, A1 a0 `7 e, z0x00, 0xFF);
6 w2 M4 K2 [6 C; f8 r. A& V7 U' c% v9 A3 S7 I" ^) P% H
/* Enable synchronization of RX and TX sections */ & I. v4 D( N# u3 V8 ]( f
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */2 ~: J* f6 t6 ^2 H
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% V2 o8 Z6 K. [* ^; k% RMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
7 J1 @; y) v/ D" |' P$ H2 ~+ {** Set the serializers, Currently only one serializer is set as
7 r2 p- I' X0 P/ R** transmitter and one serializer as receiver., H) M5 N9 k, h8 _
*/
$ \8 r6 \& X. u& E( XMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( t% `$ w/ U8 i0 i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 }. N( h% u# ]
** Configure the McASP pins % [& F% i0 y" Y; m* T
** Input - Frame Sync, Clock and Serializer Rx
) t* s& I. L; d7 D** Output - Serializer Tx is connected to the input of the codec 8 l+ \+ B, y# p: {2 j4 \) x* c: @
*/
7 e Q$ ?1 m# f# b: fMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 D n) g- }+ g1 r( x/ E
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! e$ J) @" C- b; F% q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" p ?$ L% L2 r2 l| MCASP_PIN_ACLKX o8 D2 L3 {, G( U3 z1 J9 Y5 U
| MCASP_PIN_AHCLKX/ S: b# t- _$ {9 Z4 ?
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
u7 f# ^: t. e0 xMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR O; w, d+ _6 x% a# \1 k
| MCASP_TX_CLKFAIL
; e+ ~! ?6 ^/ S. R| MCASP_TX_SYNCERROR4 V! B! M4 U1 y1 w* ]) ?. _
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% a2 S7 L* P$ i; v K. Y| MCASP_RX_CLKFAIL
7 a$ Y: X) N- U0 w| MCASP_RX_SYNCERROR
( w% Z1 C9 R3 D; R! s| MCASP_RX_OVERRUN);
/ X) b o; ^ G9 p; V& ^+ @} static void I2SDataTxRxActivate(void)3 s, I4 i" G2 T4 q/ K
{
1 ?# ?6 }8 x3 q1 I: `/* Start the clocks */4 P" S! i$ O- R" F0 G1 k" q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- _- k) E# ~' R$ KMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
6 u2 D: t+ m) C/ r. uEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; o, M" H0 [' i @
EDMA3_TRIG_MODE_EVENT);# x7 s D5 \, z+ ~7 I5 b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( T! x3 Q# }0 H) L: S3 QEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */8 b7 G, D3 V7 O8 r$ A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 \1 p: @$ P' d9 C6 ~/ |- [
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */; V# }. {; f2 j. ^2 q6 T' }2 G5 b! K
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
* w8 t+ J' N: Y9 Q" jMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) T* C) S M0 R/ c# [" L# QMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! m+ ]5 T( N5 B L* l" T, p}
$ i; N6 |3 v( ^$ A1 E& r/ b/ ]. K请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ) {# x1 x1 H+ C \
|