|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,/ ?; w2 N7 W% ?8 v" Q$ J' ~4 e3 y
input mcasp_ahclkx,0 f) N& Z; S6 V- ^
input mcasp_aclkx,6 Y- _/ ?3 W: _( z
input axr0,
( O6 @: r9 X' H$ \& ^, ^. i6 i: I' ^/ D, e
output mcasp_afsr,- t Q3 v2 \, a" q/ D+ A
output mcasp_ahclkr,6 }, p( k# M6 x) _* p
output mcasp_aclkr,4 X$ \3 F8 e6 u4 W! V! T
output axr1,1 F! X8 M: s7 D' B
assign mcasp_afsr = mcasp_afsx;
( E) S C, v: A/ ?2 tassign mcasp_aclkr = mcasp_aclkx;% N ?# h8 v" F/ H S
assign mcasp_ahclkr = mcasp_ahclkx;" x4 ?2 ^. c! @. {
assign axr1 = axr0; . D2 r( J. f9 d# \6 Y! _) O- f! s
* T: w5 y; {* b5 U+ W; l在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
' F8 W# ^' b, N) bstatic void McASPI2SConfigure(void)! \! a% J+ K$ y. X. J0 E
{
6 ~/ w2 Z/ a/ s. F- b& hMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; S& l0 O% s9 z/ v( M
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ t) l8 j5 A# F
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! R) _1 r0 A' N3 Z6 \8 G
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */. s# X( e6 A4 J0 r5 I6 S* t
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) Z' n& O K8 G' w! @6 x+ ^0 aMCASP_RX_MODE_DMA);& b- U1 m$ ?3 c h5 v! I3 S
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 ]+ S" K p7 |0 v8 u& ^9 L, i# AMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
( a3 W1 q6 B9 g& I% _3 ~5 l/ z: lMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. s5 e+ y7 |9 c& @2 K9 ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 E3 ^/ a" U5 M4 W/ W, I/ @
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 0 w& W6 h2 Z) s% ~, c; E9 h
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# J/ M. N+ d1 a- SMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 l* u6 W2 f' `$ W4 l' b. j0 H
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 L; N: M: n6 O; @1 m0 |* j3 F
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 B. A6 t9 {& P% x% s$ u
0x00, 0xFF); /* configure the clock for transmitter */
+ y0 o) A, a: U/ D8 X" ~McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 M. S) B4 H% X. e, f0 WMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! `. i4 m6 J' w/ y, \9 qMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 E" t+ _% y- y7 r4 g
0x00, 0xFF);+ D9 \; r2 O# v* ?; ? M
" w8 \* w X: |# S; S ^1 ~& e' c
/* Enable synchronization of RX and TX sections */
6 ?' V1 u+ ]8 @# v7 t0 {% E: Q A: F5 KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
K7 q( R! S7 nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 [+ h) q* t1 _' Z$ j, M" \
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. }; R: u: k& ] I$ L5 R
** Set the serializers, Currently only one serializer is set as! P) E% b, u N, [$ p5 w' L
** transmitter and one serializer as receiver.# z2 ~ [4 k, z5 X- C% ~ @+ y, o
*// K7 K8 V/ v. c! D( [
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 G D; y$ W; MMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 P2 y( J) d1 V2 ^4 \* d** Configure the McASP pins
$ W, ]1 `/ Y6 @( g- x** Input - Frame Sync, Clock and Serializer Rx& v( w! h% h6 v+ p l$ B3 A, g
** Output - Serializer Tx is connected to the input of the codec 5 S7 v/ R; w9 @
*/! U- B; \, D8 ]4 E! q: m+ [
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ ]3 \8 q+ @2 K+ V; E: aMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ v3 p, f0 d+ S' W, r) y6 b& y) J$ t5 H- @McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 x, ^8 n6 @5 h' y| MCASP_PIN_ACLKX( b) A3 p( i! n% g1 m S+ V; u5 r& h0 U6 K
| MCASP_PIN_AHCLKX8 d6 ^3 {( h) u/ M6 w" j
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
( A6 X; x2 J0 N0 ]9 \# [6 rMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ k! P9 J' Y w
| MCASP_TX_CLKFAIL 6 x! C5 Q' B& `6 B7 d0 p2 S
| MCASP_TX_SYNCERROR
. G/ L- ^; `7 h0 Q) x* L% r8 @| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 x* }, [9 i* I+ N+ I+ J| MCASP_RX_CLKFAIL
' S% }6 R1 i7 v, B| MCASP_RX_SYNCERROR
+ [ K3 I( k. ]6 y2 ~| MCASP_RX_OVERRUN);
# @ V- ?/ w; B) s1 W} static void I2SDataTxRxActivate(void)& j P6 I |$ g: s- s0 t
{# p1 i( [& M, c9 ~) k
/* Start the clocks */
, t* O; L5 d! e5 d: ?% x5 O' RMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);1 N0 A5 X3 r" k7 G5 |
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 L9 ?1 M9 A) ?4 `% f( P* EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; w- v' s4 a9 q. sEDMA3_TRIG_MODE_EVENT);# R% W9 l8 h) {5 Q6 C# f+ ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - k4 v( ]. l) h* i
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
1 {0 @' u% F& U& G/ lMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- ]) s ]$ c# T$ R! `" N, yMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */$ A( G8 {7 v: I( ]& M; w4 H
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, A8 w$ y! [' K, n8 R7 wMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; u" T1 T! q, z3 J, f2 I7 Z7 ^* K& MMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) B( L' a4 `" \: W/ R- O9 b
} 6 J. W$ N& w5 K- A
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 Z: {) S$ X! u: k |