我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ r3 W/ |/ K# m- C" K7 P
input mcasp_ahclkx,
, q9 ]4 ?8 [! f5 h1 g$ Yinput mcasp_aclkx,
1 A' @3 j% f `$ M& u& einput axr0,8 Z- U- X9 u& ]/ X- R
/ [ t" o# M9 q9 b4 V
output mcasp_afsr,
8 c" Z+ t8 j& g( _0 koutput mcasp_ahclkr,
: r# w Q" b# X) m4 k9 K) Joutput mcasp_aclkr,
9 N3 v9 y* D; ?6 Q0 k0 woutput axr1,; M9 I: d& j$ G7 F" F% ]
assign mcasp_afsr = mcasp_afsx;# M8 i5 F* t) p3 n: n
assign mcasp_aclkr = mcasp_aclkx; U# N8 z7 X" B0 L2 e4 q# X
assign mcasp_ahclkr = mcasp_ahclkx;
+ v# P: W! @" C' J$ ^, nassign axr1 = axr0;
! w8 `# A: h' g7 C% o" W: Y, ?0 s5 x0 N# S& `; C$ q' [+ ]
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
: N/ \; i. q L+ V' U! Q$ ~static void McASPI2SConfigure(void)4 Y! {$ M$ H/ T$ k; M' U
{
- T& b# S- e% ~' `, C8 f. e% V& j% IMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ o0 \" W3 j% b; N0 LMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */( q P+ Y. V$ F: M- n, `/ A. i, W
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' _1 l3 _: k2 ^# |+ |% s
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ l5 T9 F; f1 Q/ i; O# }( hMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. L# V: b J$ a, OMCASP_RX_MODE_DMA);8 U. p/ w; W7 ]0 d7 N8 h
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 m; M( }* Z+ [3 Y, k" OMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
- Y/ }. E( J; f7 W8 C* yMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' I) O8 k1 g5 Q; f2 ]* W! lMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( a9 I6 l: V$ A+ Q; f
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. J* ]- y9 r9 ]9 ]7 Y& ~* b$ H: OMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
( P+ ^+ X9 g, N+ O8 |McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
T7 F7 K" U7 B0 q- o9 dMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 l6 j* M) f6 E! y$ ^
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# p& b; O' V% ]- q$ v. ~/ ]0x00, 0xFF); /* configure the clock for transmitter */5 w, j, }# h" G0 s$ d7 G' H- s
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. T& L$ d( S8 p5 Q6 w; J1 d
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, E. k$ V8 I& Q" sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. @- }& t* N" S
0x00, 0xFF);
1 f# ~. y* F& f1 l; i# _/ o8 j. e# n3 C F, h
/* Enable synchronization of RX and TX sections */ 5 t% ` s% u: Z. D" c& b
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) y+ E9 H: T- i% V8 J: }McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* X- Q0 p7 ~: G7 p$ v' U1 ~
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
5 A9 L0 M) Q& R/ c7 ^$ }% y4 d& }** Set the serializers, Currently only one serializer is set as
5 A$ o) v+ [' Z** transmitter and one serializer as receiver.
' D- N. Y' I3 B9 f*/: b. |: _0 q' m% r3 S! J
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: E6 a) H8 d1 Y6 b, l7 M1 BMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 N8 f7 V1 W' s8 j6 h** Configure the McASP pins 4 [# n, U: {( c; M2 ]) `% K! D. e
** Input - Frame Sync, Clock and Serializer Rx
) r D1 A y4 K& w' J5 @** Output - Serializer Tx is connected to the input of the codec $ q2 U/ x6 Z6 a: t2 W
*/
$ P- a7 U( c4 B n) d5 s- }* DMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ V7 s- J& w+ f) R8 MMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));3 q' Q3 _/ A4 o
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: _, @, \: c! ?( R0 y1 F4 N
| MCASP_PIN_ACLKX) C* ?% \. z1 n' I, u/ @, z4 q$ x
| MCASP_PIN_AHCLKX
& F8 p' }. k. L) E- |. M| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */3 H9 u- Q1 \* f5 n( A4 y4 y. y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 e, E% @, a5 F1 H( H: I/ O" l6 B| MCASP_TX_CLKFAIL
% @/ `6 E _8 l- u5 `1 L0 K" e| MCASP_TX_SYNCERROR
- S% i6 @3 D3 h; q& J- J, T| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * u" D8 n1 t, _9 p* y( w
| MCASP_RX_CLKFAIL5 U) P' r, y$ w9 }0 J
| MCASP_RX_SYNCERROR T u% x! Q+ ^$ |
| MCASP_RX_OVERRUN);
! O3 @/ u' t) g9 _& Q* N} static void I2SDataTxRxActivate(void)0 p6 A+ }/ F0 y9 E2 i. @ \
{% k+ x; Q, o4 h! N' m9 ]. k0 J
/* Start the clocks */
/ b6 K c4 _' ~3 Q7 u- `& KMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 M" R: L! T; W, a. }$ `) K5 _9 i. Z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */& L$ e( N; {7 X0 p6 @$ M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' M3 N* K2 s7 W2 V. h
EDMA3_TRIG_MODE_EVENT);
1 q# O& T- ]$ Z5 f& lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: v( e: R7 W7 y5 z GEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
[' c6 y4 J! p! Z3 M$ VMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 Q' Q E/ `: J4 n( E& {* X" b
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
$ w, e# h2 {2 \- |# Q S' Jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& `' L% n( e8 ]! V/ {+ c6 `, {
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 X5 ?* f0 h2 S3 a$ q, R. l, H
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: g- g- ^; A- ]6 G3 e}
( D" s* J! T* L. t0 C请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 A& V5 P/ s6 H# Q" _" [0 u |