嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,) C+ |! _ O: X2 U: d/ y
input mcasp_ahclkx,
/ X1 r; d2 b0 b: Y8 `$ ainput mcasp_aclkx,
1 a) x( C- [- r2 x1 ninput axr0,
! r0 r/ Z6 z+ }9 V
* i7 G( R9 ~- O% ^, ~& houtput mcasp_afsr,; q" `* ~4 o( W
output mcasp_ahclkr,& ]7 J& a- S- u! o" Z. O
output mcasp_aclkr,
3 _: L, |) j5 |% Z! f9 O! \; joutput axr1,
, J# ~% g0 p b8 Z) f% w
assign mcasp_afsr = mcasp_afsx;+ H+ K5 u% C2 f( i7 P& c
assign mcasp_aclkr = mcasp_aclkx;
6 p+ M7 [( e, V/ K; \" Kassign mcasp_ahclkr = mcasp_ahclkx;
! i1 A0 u7 u, H; yassign axr1 = axr0;
' `& s i$ U: H( |
* b0 s* ^' L, ?; m在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' T/ q, g* y5 l/ ?1 ~7 s# w
static void McASPI2SConfigure(void)6 N! K7 h/ D+ J9 o; y' }; |
{
h0 Q2 `- N! g6 t$ [: @. WMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 c; E$ ?3 S9 I" h# [, RMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */ w( h+ b0 V" ?. f+ l' N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- I- e$ W% g! q6 v3 f4 t
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */1 s/ A m6 S0 [1 N, e9 W& j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' A) T2 U7 }+ h
MCASP_RX_MODE_DMA);0 ? n# f+ M4 d+ ?3 M/ G$ {$ A7 b
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& j; Q# a2 j, W* r
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' f& v' L- J3 I8 J$ k. TMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 c" X/ S0 J3 e- s" h
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: }" m$ K/ m7 M( d2 ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ Z" \7 d F( {* g: @MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */, k$ U' r4 |, A9 w; j
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);2 r" ~% z8 C+ X. ]' Q( a8 A& Q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 U! Z+ G8 o7 z7 D
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: V \/ a8 b7 ^0x00, 0xFF);
/* configure the clock for transmitter */7 p0 L* o# Q2 [ Z, y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; q. T% |% p E$ P/ G
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 e& @4 N0 ~+ E' A& l- R
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: c6 X d2 ?5 s2 c6 Z; `/ \3 ^
0x00, 0xFF);
, C0 } ^# Q0 q5 r8 G3 K$ M
# {6 |/ w4 M! j" Z0 m% N2 J: |/* Enable synchronization of RX and TX sections */ * |/ R3 s& q1 ~0 x0 C9 x- N3 D
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 D7 b$ f9 v% N) [3 i8 eMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 B: u0 l4 N/ K2 x3 Y; m* [3 j3 DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*: B4 l; E8 S9 i" A: L# Q0 X
** Set the serializers, Currently only one serializer is set as
9 \5 e, @5 h4 I W** transmitter and one serializer as receiver.
/ `6 z7 [2 ?6 ^* c*/0 u4 m5 c8 d+ ?6 c0 ]0 j
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: R3 N4 o1 {, W @( w0 s
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
6 v: Z m3 s& f& c** Configure the McASP pins - g ~4 X8 T! n: t0 |8 S& C
** Input - Frame Sync, Clock and Serializer Rx5 T' `% p$ e p) d
** Output - Serializer Tx is connected to the input of the codec 1 F5 x m' o) b6 H0 {
*/
- j- Z3 v' J4 W2 JMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: s* J% S1 I: E! p, M
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% e/ r$ \5 v6 m9 m7 w2 o
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 U' E) d# s6 W| MCASP_PIN_ACLKX4 ]5 W( S1 Z3 `, o
| MCASP_PIN_AHCLKX
. g, T3 w6 T) _* k* q| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */. [- q4 L/ I+ |; V9 T# e8 U
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' q @* z9 R* `" ^& x
| MCASP_TX_CLKFAIL 7 R3 d9 a5 D, n; {
| MCASP_TX_SYNCERROR
* j1 e9 G: Z1 k| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: ~' [ _5 k3 @5 w, Z( Y| MCASP_RX_CLKFAIL8 z) }4 A8 M. e; y, |
| MCASP_RX_SYNCERROR
! x9 G3 Z H: |) ]| MCASP_RX_OVERRUN);4 Y/ Q; T& `% }/ [
}
static void I2SDataTxRxActivate(void)% ]- E8 n1 V4 {
{, \. c, ?; k/ Y' E
/* Start the clocks */: a p: B1 x& D
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' M9 q; E$ j4 u) m& J& B4 }$ e
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
9 `3 e2 H! [5 t6 A$ XEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 }) \% P$ P( k2 @
EDMA3_TRIG_MODE_EVENT);
7 @$ A$ Z7 r. f3 t$ z5 @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
8 I0 {1 w* h, J1 ZEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
$ F' e% v3 k0 P" M. D1 nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- |: r- m3 Y2 JMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
0 Q" Q6 f( e; I, _1 l' e6 Twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
/ {* H3 D" O% n/ C* t, z5 l; c1 i( eMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);* i) ^! ?# U6 E0 ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ `* ` I- o3 [8 D/ A/ n6 C; L
}
4 u0 C. I- h$ }' y) b7 A
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# i: m4 h* Q% F. i
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |