嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
7 B+ m2 L0 z o9 vinput mcasp_ahclkx,
( ^: [4 j* V9 w% T( t$ X# rinput mcasp_aclkx,
, e/ |$ }; p$ o) w8 n7 dinput axr0,
1 V7 G. F, {" A; {, t" P4 B& y" p/ W/ w+ {) [
output mcasp_afsr,
# r J+ O9 o9 x0 f2 x0 Ioutput mcasp_ahclkr,
- M+ h! h8 X7 F- c1 O. g2 ~output mcasp_aclkr,
& ]4 U1 v+ U) C1 Woutput axr1,
3 r+ T, E; X3 m0 E- F
assign mcasp_afsr = mcasp_afsx;7 X* o: V; J- B0 N% a+ t
assign mcasp_aclkr = mcasp_aclkx;
# M4 b* V( O G$ Z) Bassign mcasp_ahclkr = mcasp_ahclkx;
: A' O* \& R/ Fassign axr1 = axr0;
% R" c. l0 @5 r% P+ F( b2 N
$ a9 p$ D) ^4 i! q$ I4 L在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) M0 z- w! e. q0 A5 z) k9 D2 _; ^
static void McASPI2SConfigure(void)
$ G9 f1 G9 E" R+ ?. G* K# r' w' `{ Q! |) h4 b- D1 a" S
McASPRxReset(SOC_MCASP_0_CTRL_REGS); N4 {7 \3 L. f" u4 `5 _
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */* W2 C" d& H5 n( Z1 D0 a
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 K) b2 b; T. [$ _! a C9 A% JMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */$ d4 a4 S/ W5 L% m
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: U2 T( [& R+ t- E$ ^
MCASP_RX_MODE_DMA);, p* v# p: m8 u1 ^, I, ^( G
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% u& M* e% G9 e5 c& aMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ _- Q0 ~* Z! Y0 D6 n4 n
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ r0 v" ]0 L% BMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 _' e4 H5 ~0 w3 n% qMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . `0 j: z) K2 l
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */$ C- e' z1 e7 ?9 [1 i& t G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 h* g# I9 `( p8 n4 s
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
7 N' e; T$ i \5 e, e2 y4 j0 H+ RMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: x: r3 O- v" e9 x, C' P' I0x00, 0xFF);
/* configure the clock for transmitter */) t# C- I( T) T$ c+ A# p
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ b. I0 q! W0 H( L* {& u3 h: w. ^+ LMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, @# p4 X w' q3 _McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 [; j; a4 ?7 w, M0x00, 0xFF);# L! a B0 x; T# W; I, o! v; n
5 x; d, K( o1 f/* Enable synchronization of RX and TX sections */ 8 K3 }& c v! T- r, T, W `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
, y# x V/ B( R) S# w1 l: f% XMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, |& i: B& {+ u; x
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/** f9 g& h7 z* \
** Set the serializers, Currently only one serializer is set as1 i/ \: y4 t# L- h6 ?# D4 `6 G
** transmitter and one serializer as receiver.
4 @* z/ M* y' d/ S3 F*/
4 ]/ O) S! H& Z1 OMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ F) `- s# H" d+ P- p
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*+ s/ s7 j m) V3 [" L& w2 z
** Configure the McASP pins
/ K5 B! K' r+ m% l** Input - Frame Sync, Clock and Serializer Rx
! _& B5 W5 t1 M** Output - Serializer Tx is connected to the input of the codec
: b! M$ L: M0 I- _& D: D& O*/
/ t+ e6 Z. I6 F1 d5 ]& P$ C" J0 f. nMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( R! u1 C1 I0 a- Y% X: ~6 i
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- |! X3 u: t% n4 F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 ` E/ R1 I; @2 K6 d' v! Q* ?6 G
| MCASP_PIN_ACLKX* t3 n' L# F( F9 ~$ L6 w+ A
| MCASP_PIN_AHCLKX) I3 j% T. t" d8 t1 e+ v4 _( w
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */) ^! o7 H1 E$ ^8 t( g7 `# Y$ c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ n9 C) W# E$ t4 y* x, ^9 X, r
| MCASP_TX_CLKFAIL
6 H) b3 D. f: E2 l3 T| MCASP_TX_SYNCERROR, U6 C; {" z% w+ y8 W6 B
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
# u8 Y- Y0 d9 S( K" u+ P| MCASP_RX_CLKFAIL+ d9 c8 w m5 p( f/ s$ i
| MCASP_RX_SYNCERROR
/ [7 A( H% [2 O! b5 M8 ]' E| MCASP_RX_OVERRUN);
3 ]2 u/ j$ p0 T% _0 N% F! q% X}
static void I2SDataTxRxActivate(void)( T4 T5 L3 P' K
{% X5 ~6 [$ O# r, _. W+ [
/* Start the clocks */
5 h5 A3 v7 U; \) M" [* Z$ e& ^4 ?McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);1 [9 k# x0 T- P$ E( y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */( A& _3 _" ^1 l0 K$ F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 ^' O# r2 O4 z, O/ h
EDMA3_TRIG_MODE_EVENT);) K6 \9 X) c4 O4 J! s3 c
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 W9 ^; }' T8 k' A# }7 ~EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
& Y: E& p8 |7 yMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 M0 k4 j: ^- Y& k+ z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */2 W& Y+ R1 X9 G$ y- A: s J
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
! Q: c: O* L: w: K5 p3 vMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 I0 A% \9 Z- N' @; RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 t; j( g V7 a; E5 { H7 A/ P
}
; g; r' K3 ~6 |
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 q% k5 _0 I4 e$ p
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |