嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
: K, A9 A' |% p' L3 f! Cinput mcasp_ahclkx,1 p8 S0 ~6 t" c+ a9 [$ l
input mcasp_aclkx,
1 \% Y9 |5 D% u% C# Y% Binput axr0,
* S D: n% k0 q- Y6 _) |- }& o: O) n- m! K" c( I& G
output mcasp_afsr,+ h( a( ~0 k" P) i
output mcasp_ahclkr,
# L0 i$ E7 u- ?9 _6 a7 [output mcasp_aclkr,
( Q& l: h8 ~( I @/ Ooutput axr1,4 f6 _& K+ V) t% O$ _+ |/ s0 X
assign mcasp_afsr = mcasp_afsx;& g P$ A# g* |% I
assign mcasp_aclkr = mcasp_aclkx;2 O. w; Y( a9 i! s/ d3 {6 j6 i
assign mcasp_ahclkr = mcasp_ahclkx;4 Q" ?, ^; X) e7 s2 x2 w5 j+ p
assign axr1 = axr0;
1 P# G. O* s5 W" y
$ x. [: i$ y6 l }
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
* z: Y/ H/ |) m% t2 `. q _
static void McASPI2SConfigure(void)2 W i/ d% y: Y' p/ |2 o
{
v8 P, P' \" X: f: Y6 bMcASPRxReset(SOC_MCASP_0_CTRL_REGS);0 r* W+ H! L9 S! T! \4 e
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */+ ?# Z; T; Z5 [
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; J" \7 F) u- v* t7 ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
- D. \8 d! x2 QMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( p, O [( f+ N
MCASP_RX_MODE_DMA);3 X" Z/ ]# U4 `1 Y L9 s7 H
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 L" j; Z; F! u* x3 |$ Q$ hMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. N% q% ]5 o; hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 m+ D2 d+ O8 N' H" I Q/ \
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% D- `% G0 Z' Q8 m3 f
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # v) Q) E. r8 k9 x( P
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver *// A& F# O4 K! G$ [! g. I
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 V8 \# S' G+ V1 B* J
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); / R) ~* w. Z. z/ J( M2 c
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 c s; e0 Q& f& F
0x00, 0xFF);
/* configure the clock for transmitter */0 h+ E( p; N" |' N; g: |
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ E$ I+ U: t9 h! d1 _McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
4 Q0 p9 E. t+ u0 @+ m6 S- SMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 \0 Z( c% y* x- ~& @$ g' r* e) l
0x00, 0xFF);( I+ k& f8 F( T* Y% l
; |( v7 \+ L0 n1 g. t
/* Enable synchronization of RX and TX sections */ # G$ V9 D/ a1 y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ y* v" ^. C7 }2 k, YMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 i: s* v+ W5 _1 t& UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
z0 J' H" K# T& n- P** Set the serializers, Currently only one serializer is set as
# ^8 @$ I/ ]8 p! Y% a+ \* x9 ~. `** transmitter and one serializer as receiver.4 h; Z- {8 ]' l! V8 Y4 R
*/
6 M( T" r0 K6 k2 C7 X9 gMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% [; j- @7 ~9 ~2 K# PMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*5 \- d) L4 e( z9 s5 d u+ p; t# q
** Configure the McASP pins
; `3 B) i! R5 F** Input - Frame Sync, Clock and Serializer Rx
, }1 g+ l1 z/ N p1 S/ y** Output - Serializer Tx is connected to the input of the codec , H1 ~3 j+ z4 b: s! [' P1 E+ I7 w
*/6 o5 G* I* y) t4 H: W
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 Z. q c V5 u8 tMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' T- v5 L5 z, q5 h3 |! {2 X
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 i O+ n' s' [ F$ V2 v
| MCASP_PIN_ACLKX$ i) R9 B' q( P8 r) P
| MCASP_PIN_AHCLKX5 F' P6 ]. ]% [3 e* N4 N% f
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */2 L* A! l3 m5 T u T2 Y1 d
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) e, k% k: B3 h1 I% Q7 ]| MCASP_TX_CLKFAIL ; C. S' Q1 T; z
| MCASP_TX_SYNCERROR
/ R5 q$ `/ X+ C6 \+ b| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * D, E3 t3 l A
| MCASP_RX_CLKFAIL4 d2 I- v& g. w! @$ v1 V" k
| MCASP_RX_SYNCERROR 2 i. I B& L9 c ^
| MCASP_RX_OVERRUN);
* y/ X* W R* `* G" P! K' e- T) p}
static void I2SDataTxRxActivate(void)
0 I+ b- v2 C: L6 V8 Z{. S1 g! |: O/ }* w o( X6 d5 \) a
/* Start the clocks */
}3 s5 {/ _$ f$ B- N% i) u5 oMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 O/ p0 v, D- N
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
5 s: n" A5 g1 a" y& }EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX," @" }- R) B7 I7 S" _5 i
EDMA3_TRIG_MODE_EVENT);; P, T' B2 O2 ]6 s+ u l I8 d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 S8 b. Q, t4 {. ]
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */8 m9 c3 F" X/ R, @
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# m5 F# Q1 M5 ~$ F' G, [& T- a
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
* ^5 S0 S) H& O2 s" h' l- Z" dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */# l) p* E& v0 y$ e) Z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
& W0 F5 O0 Y0 aMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( E0 |% A- p; b4 y% k; U0 w- r6 J {}
' o: Q# I8 M5 i/ ^( i; m. f请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% U- f0 m! i! c0 k2 C# D
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |