嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
: u3 U$ Q7 H% W, _' Zinput mcasp_ahclkx,
2 b- D' E1 k2 P0 H( W, @# }9 _input mcasp_aclkx,6 s1 m: }# _2 q G' x3 V* s& Q
input axr0,2 z! G" V. ^* K9 M* i
4 z) @6 r# u4 G" z) a, m6 loutput mcasp_afsr,
& X. R0 l6 k) Z0 i8 M* woutput mcasp_ahclkr,
U/ b5 v o/ T0 y$ t: u8 y, toutput mcasp_aclkr,3 D8 y G' A% J9 e
output axr1,4 h% G4 l: i G" [8 T! Y# q s0 m1 x
assign mcasp_afsr = mcasp_afsx;# W p2 C2 {" G1 S0 X
assign mcasp_aclkr = mcasp_aclkx;
; _$ \! A: g; `; X) C+ passign mcasp_ahclkr = mcasp_ahclkx;
. A* x: N. |% L# A: D5 |, L/ N! q# vassign axr1 = axr0;
' L& D' y6 N! K& Q) @0 ~5 E/ T8 m5 G6 z. R0 H% R# H( q% a2 G
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
\: ?$ Z1 q7 r% c& _
static void McASPI2SConfigure(void)$ u/ u, j7 G( X: V% \6 x" h
{
: N6 O& {- O3 K9 ~McASPRxReset(SOC_MCASP_0_CTRL_REGS);% j3 k: S+ U/ S6 t
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
; _3 S# M% K: y ~( u# nMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# Y w% Q# Z( t0 m& e/ G. A5 D GMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */# W: u0 n% X" Y. t, _
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 |0 S6 u! Z& F8 ^- U( F6 G% c/ M
MCASP_RX_MODE_DMA);. R1 r2 g+ d( d5 c( l1 ]
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 ]4 I* `: |4 a4 ~: w" i* o; zMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ ]8 v: r/ t) {" i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ ^! P3 P y) iMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: x6 x$ o$ ?+ `3 U
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 S# d0 Z0 p! N
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
. i( U" U: c4 c/ d" kMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ ]6 T3 } x$ J5 s. d$ X, \6 J
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + X E+ Q: B. s' G }
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ @: y. n8 @5 m. W6 o+ a( F
0x00, 0xFF);
/* configure the clock for transmitter */4 h1 }2 I* W) t. l, `0 N2 y8 }8 E
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 O! M1 f+ y1 ]) \* w, m6 K
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 i5 d9 _7 P. {7 m. z7 W! @McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, T* _- w$ X$ l* [4 Y5 q* r
0x00, 0xFF);
' X( a) M' R9 k
9 n2 V& c# F/ @, p+ K/* Enable synchronization of RX and TX sections */
$ c: Y* Q! d/ |) n E3 g; {& B! S6 h/ hMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ f6 f0 m' Y: g; u" S& cMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) ^2 s9 g% Y8 m' D+ UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' }* W" D5 K# U* M9 Z* S
** Set the serializers, Currently only one serializer is set as; _; |. f4 z2 A$ x# @ c
** transmitter and one serializer as receiver.$ g! y1 d1 V9 o- O, q7 _
*/
: A- q' V3 Y# ~0 S. f/ N" fMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! z1 b5 ?8 _& y; W( u0 XMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
, ]1 P7 m4 @: H" |- [** Configure the McASP pins 1 s" O+ n' J9 {& c d- [( b
** Input - Frame Sync, Clock and Serializer Rx
/ u/ U$ D+ C9 X5 X** Output - Serializer Tx is connected to the input of the codec # K9 h9 }7 V8 `8 a
*/
, n4 u* B9 [5 K$ J3 HMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# ~8 @, }" X6 Q+ |8 m- UMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
# h) E7 ~' f. X% E. J9 A% e! WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ R0 R9 S: m6 {
| MCASP_PIN_ACLKX! ?/ O ?# _9 d9 S( M( D
| MCASP_PIN_AHCLKX, A8 r! T' T, z
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
; l* g$ x6 O2 U" hMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, D- D, v" a) i L| MCASP_TX_CLKFAIL
" w9 @1 r0 P3 S5 S$ u| MCASP_TX_SYNCERROR3 |# e( ]0 d% s4 `8 ?; d- y
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ j- F6 j% i& @: Z3 m2 a- Y( N| MCASP_RX_CLKFAIL
/ s, L8 x2 \+ _| MCASP_RX_SYNCERROR 8 I- n+ r P* P* {
| MCASP_RX_OVERRUN);. X; q* y. o* ~1 c, ?5 `, Q
}
static void I2SDataTxRxActivate(void)$ X4 C" Q `, @. V3 L0 Y
{% R" O3 t: j5 W, `1 K* |, f
/* Start the clocks */
6 T' V$ J6 b9 d4 BMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 K4 G* W3 s, R) w3 t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */# J# t- W* l) C" z. h/ v4 G x6 [- W- d& P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& ]# v9 s5 Y( T! ~EDMA3_TRIG_MODE_EVENT);
; K6 r6 j+ {+ D+ G1 lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 Y0 i$ L9 \8 [
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */+ p# i- P6 F$ |" r1 k/ D
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
P- R* o8 K& UMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */- j+ t& i$ I0 f: l+ O- P
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */; R8 f4 G/ E }
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
l+ \+ V( ~* A/ hMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);- @1 s- c$ E1 f( s
}
7 _ u7 I8 v* i8 s1 q5 t G
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, V6 M; ~# ^& r& _3 b% j& [
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |