嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& d, C) R" D: \% rinput mcasp_ahclkx,. [& X# W5 T" l; L7 u' Z
input mcasp_aclkx,4 r- B2 V! z! L& u
input axr0,
# ?3 u+ [4 F2 S5 E7 L8 V" h; r0 W( y# }( s$ b% @
output mcasp_afsr,& ]! \; H; V ?: E# q! Y1 d3 t
output mcasp_ahclkr,
+ I) I: A5 v- _output mcasp_aclkr,
9 O* ]+ t- u2 u% S9 a5 Ioutput axr1,. o- W( a' k. K2 m: `" g
assign mcasp_afsr = mcasp_afsx;
& p# Q4 N4 ]4 x2 _, e' ^assign mcasp_aclkr = mcasp_aclkx;7 M3 N0 G( t$ W5 a" F
assign mcasp_ahclkr = mcasp_ahclkx; C! O7 j; Z" ` N
assign axr1 = axr0;
+ Q/ M* h* _2 J( j
0 e3 d9 @0 g8 U2 N8 s" \2 |/ A+ A7 A在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
; Q- ?0 n4 q1 A7 K s% d
static void McASPI2SConfigure(void)# f+ o" ?* ]/ S& y
{
( p5 y s6 E: Z' ZMcASPRxReset(SOC_MCASP_0_CTRL_REGS);: s, Z. m. V" u l: I f
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */: y- r: q2 U6 O0 }+ C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
4 g+ [# \( P6 O, I0 F7 sMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */5 j( c0 T9 j t8 s! D) n1 A
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 D8 m, C! _( U9 kMCASP_RX_MODE_DMA);" k. G4 C: V. H1 T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 D$ ^2 n- u: N0 V1 o: _; ?MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */( w& B" v! y) y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) Y( } v& o: P+ s2 U
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ B, d% L$ H- t/ b
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - t6 j6 R/ x8 O, N" X9 y y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */1 Q. N. k2 [: Y* W
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
* J. v- S7 t% C N* cMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + X! G2 G3 @' s& s3 q- A
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
{" ~5 ]# o C0 K0x00, 0xFF);
/* configure the clock for transmitter */
9 {: ~; l R$ C% {( I9 EMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 h- I; W F3 w' p jMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - m" k" J( E/ x) ~9 Z$ _
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 p2 P3 C1 _9 m, Y# b' N+ P
0x00, 0xFF);" |1 m! B. h V/ |2 o( Y2 k
) R5 ]) E0 ]8 ~) ~7 `! n$ M6 r/* Enable synchronization of RX and TX sections */ : c) f3 O8 h' b
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 z* s* s" o/ V5 X, E5 HMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% H0 d: \: H) G1 `5 rMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*: {2 Y. R+ b/ b* D3 }$ m8 @
** Set the serializers, Currently only one serializer is set as
$ `, G: ]. _/ C/ z& g* [- h** transmitter and one serializer as receiver./ k7 b# M4 Z0 e+ v& [, o& p! F- }0 ^
*/
9 O/ Z) D# D6 M9 N) @: BMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% v; t/ T& r8 U
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
1 `9 g! t' T" h1 W/ Z# }** Configure the McASP pins # J6 ]7 V2 z) e, x0 N4 I k" H
** Input - Frame Sync, Clock and Serializer Rx$ {5 t; S% z: u5 R% ^! g
** Output - Serializer Tx is connected to the input of the codec 5 V# P# y1 c$ ]- q: s1 J* o$ E! U9 X
*/
, Y% j1 e+ t2 S4 g. n- ]8 WMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 h) r- T" Q J8 [+ A! ~) c
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- B0 F' x" o+ p3 y% V- `- R+ {
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 b1 R0 X) A0 x( X| MCASP_PIN_ACLKX
4 z5 C% c% I& T9 L| MCASP_PIN_AHCLKX
( x: V( b; a* M( d| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
' D5 E& K3 L }9 v! `McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
* V' M, ?$ X% O9 H6 Z- W) x| MCASP_TX_CLKFAIL
' Y$ v# F8 `& Q. H' I6 K. Q| MCASP_TX_SYNCERROR
) w: u$ c1 Z5 ~$ Y d$ \| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ F+ s5 q9 d8 \: L6 f( Q0 l
| MCASP_RX_CLKFAIL( M4 s( U8 u5 N
| MCASP_RX_SYNCERROR , X9 b4 V3 b" V' q
| MCASP_RX_OVERRUN);
2 C! J0 L$ D% B( s. @3 x0 o}
static void I2SDataTxRxActivate(void)1 f+ n1 ~6 q0 w# H0 I4 Q3 X' u
{0 L. h: k, G. a, Q5 S
/* Start the clocks */
7 l2 o" `6 B. T7 X- M4 i$ s hMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ f! F& N9 N. @( |1 R, U6 \1 {/ s2 kMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */4 K0 @; r! n( |+ f1 O4 h0 ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 Z% g$ u6 W) S7 ?! H( k- l$ G2 bEDMA3_TRIG_MODE_EVENT);
& Z' ~9 v* k7 {3 T8 p; `& QEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' U7 F" Y- ?: u1 y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
/ U6 C0 D5 N+ d4 n& x: \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);: Z* u1 X/ f J% Q1 V, Z- @
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */" \* f1 a0 J' g4 e: E$ U0 W
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
8 j, u0 j. P9 `; s2 {2 y: s( BMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( T, ~/ L9 D' n5 J" C, n, YMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 }3 o, q: i2 T}
" Q* A: a$ W& N$ s% z0 e请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ l" H) ^' J- s4 d m* E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |