嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
6 v# |, O8 w: Z/ p, M9 }. \# T, p3 qinput mcasp_ahclkx,
( R' q& f% N& U- q4 oinput mcasp_aclkx,
; S# ~6 }" `+ Linput axr0,8 U2 T9 }5 A+ K2 P6 B0 S V
/ L$ G, |* h8 i. Z# x
output mcasp_afsr,5 F0 E* n" z8 f) x" j
output mcasp_ahclkr,
$ ~" z K) `- y# g+ x! H5 R4 Toutput mcasp_aclkr,$ e* G: u4 A3 [! l# c" C# T
output axr1,
3 X" V, J9 r( a- n
assign mcasp_afsr = mcasp_afsx;
) ^: G+ p: Q/ h7 Cassign mcasp_aclkr = mcasp_aclkx;5 C! L: ~! `) _0 q" C
assign mcasp_ahclkr = mcasp_ahclkx;
1 @/ [0 s( K( S" v' |0 E; z Hassign axr1 = axr0;
! O: U, H. r/ W% O9 a9 m h9 d/ \
6 N1 C! ?, D) ?在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
# \9 F; ^; L6 [/ k
static void McASPI2SConfigure(void)% X" T% C2 z5 B" X
{
, i! f& b3 b9 x: @+ F3 p& R3 TMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
v- G9 n$ S6 y6 ~1 a" yMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
, ]! _6 r- J; w9 R+ X) ZMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ _9 V9 \6 z; K5 B; c
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */& V7 B$ V% a8 _6 K4 S6 Y2 G8 W
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 A6 H: }2 P @% B# M
MCASP_RX_MODE_DMA);
; w% F8 ~; Q1 u" i# g8 F5 u8 B# SMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 ~8 N3 Q5 M9 Y$ d \) @2 n
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */* Y4 a3 V3 Y( L
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( |2 R( j" m+ l) H
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, V: `4 u1 ?) jMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " r% X R4 ~4 W- D* I
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */7 a. [) h" A: z0 g) j
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 n1 y- i7 @3 s: W; l7 j5 gMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
+ Z' o, J# y; SMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 R1 f2 F& ]/ \1 Z5 C0x00, 0xFF);
/* configure the clock for transmitter */
# q5 E3 i0 x0 w G: `6 K8 _McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 e: C8 y' ]8 L" D" bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
8 O4 g' c+ f2 D# L$ S+ z4 AMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' j7 d% B- k9 B3 q$ c0x00, 0xFF);
0 D5 X6 r5 b. q1 ` A/ x% t2 Q3 `8 x8 @: A8 S: L2 Q2 T! u/ g1 Q* A
/* Enable synchronization of RX and TX sections */
7 t& K2 l+ J3 _+ y j* U3 |McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
E$ \: E' l0 S: n# SMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' _- K+ J6 C" U) Z7 u3 B" XMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*- T4 l) o, W$ B" s) {" r: k
** Set the serializers, Currently only one serializer is set as
& y- R- U4 ]+ E, b1 {, s** transmitter and one serializer as receiver.
( }3 X) P2 k1 j ]' U& m*/' ~" j7 C% E% D2 s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ G0 ^2 y* k0 t- \1 V3 b" a; cMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
# q; B# d3 T7 w6 n z** Configure the McASP pins
# T7 L( k0 M4 @/ k& k. u; _) a** Input - Frame Sync, Clock and Serializer Rx' W3 [4 M# {2 e/ f# k5 X
** Output - Serializer Tx is connected to the input of the codec
: [( M# F, U& d+ m# A/ j( G2 G! o6 F*/
/ F a. R1 f7 v7 F1 q7 wMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. r: N7 { R; E @+ h. T: V! UMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));0 N6 F: y3 z- N) X+ Y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 t8 B% M* Y; m, {
| MCASP_PIN_ACLKX
( ]3 e8 R2 Z% w+ D" S| MCASP_PIN_AHCLKX
" X# _7 h& ?% }0 J/ b. M| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
: \9 R7 c; l5 CMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 Q# S t1 ]! }3 H, ?0 f6 R- T
| MCASP_TX_CLKFAIL & m+ m5 a( D y6 B/ I& d
| MCASP_TX_SYNCERROR
1 O5 {% f" D% w$ d) G4 W8 z| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
; }6 L% s1 Z( F/ u# V' g| MCASP_RX_CLKFAIL
: O, n4 n) L& f5 o6 M* v& y+ K. f& l| MCASP_RX_SYNCERROR
& Y3 h! z4 I) B; E% E8 ~) b! f* F| MCASP_RX_OVERRUN);1 K& @6 j4 v( r9 n; C" w: V
}
static void I2SDataTxRxActivate(void)5 b3 a% [! w* n) x7 _
{' V1 q1 p/ ?& l2 N: i9 ^# \
/* Start the clocks */
" P; K1 {2 @9 u7 }( E7 G7 sMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 M# t% O V! g3 i! m1 d, \McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */5 U. f5 r+ @& q8 t. b7 V% w1 @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 L( a3 X9 P8 Z% O3 |; yEDMA3_TRIG_MODE_EVENT);
/ b/ d& k: @$ U- h& N @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + w- G$ ^2 T) R3 {0 U
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
: T5 U; b& r- gMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);, T; ^9 n1 _, n' r" |
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */7 R# \/ c/ Y0 W
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */* @, [7 C' N" w. g5 w% w* g
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 {' _( g) r8 u4 W* r9 J/ ?' N
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( [ ^8 k2 J% g: K$ ~2 n F9 O9 t9 V) {
}
% A" W( w9 E* e: x' u& b& \4 J+ C请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! H% ^9 R4 K! h- C: T9 c! r# N d
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |