嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
7 [; F9 B1 D3 f: Q, s& h0 S4 ~) P: o2 tinput mcasp_ahclkx,( \8 [9 Q$ J" M( P! _7 C% C- s1 U
input mcasp_aclkx,
2 q1 [# X# C' ^input axr0,
$ L* |5 N, I9 \
0 r J j$ Y' c B7 V- N- poutput mcasp_afsr,
6 J4 U# J! [9 f7 houtput mcasp_ahclkr,8 b- M) K% ?1 ^3 V# q) E
output mcasp_aclkr,( j( Y& [* k" a- x
output axr1,3 P" o) K" U( Y
assign mcasp_afsr = mcasp_afsx;+ r) K# L$ \8 ~" J9 ]" i$ U8 K
assign mcasp_aclkr = mcasp_aclkx;" M) g- {" }3 N+ R3 d6 a; ]+ r
assign mcasp_ahclkr = mcasp_ahclkx;" G8 D+ w- J/ R' Z
assign axr1 = axr0;
! c; D$ y( y" Q$ V) g, V4 l7 o9 o" B2 M7 _4 P, s; m6 [
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" N5 j. R; e& I" h0 G" p4 _
static void McASPI2SConfigure(void)& B' i# r& J. h% |0 S
{5 m0 R: |/ I: i( V
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( ~5 r \! a+ Q3 H$ k& W) W3 {9 WMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
+ @& V( F$ z; u+ o( ]4 L3 aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
4 r9 X5 r; n1 G1 ?% ^McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
8 O0 M5 G3 [0 `$ d0 W. P* X' rMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 z' e* u3 y5 y, Q
MCASP_RX_MODE_DMA);
% F: y8 U! ]2 o+ kMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 Q* k$ M; G$ _' |2 v3 {$ ]
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ r [' M7 H, G9 s
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- }- Q9 {' A/ N1 |( r& [: sMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
z" @ N$ m$ |& j2 ]McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) V: Y3 H. i' F
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */" D6 j; h5 ^5 S) p
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 Q1 b( f7 @6 AMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 p9 n: P- _) m# S6 o4 cMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% u- `, V* A) A3 @; `* V* c$ a0x00, 0xFF);
/* configure the clock for transmitter */
' n6 _& G0 f! t: H* }McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ h3 `: N5 c- S) @7 Q1 c% `
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + A o8 {# f" B7 t4 V6 Z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# P! _1 X, P& M% {1 A$ z4 x0 M
0x00, 0xFF);
( K# y B) a! W
+ P% R0 b+ P0 t r5 u/* Enable synchronization of RX and TX sections */
( B/ M$ `9 Y1 t( W- w8 DMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, J+ p ~* `1 H+ r/ F
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! b& B3 M# r; C) K& }McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*& \( Y! s, a) l, |$ @
** Set the serializers, Currently only one serializer is set as1 K0 P: c: A& ]
** transmitter and one serializer as receiver.
$ b* A- ?& t! a9 ^& J$ K*// O) t% B7 J3 y; w7 x( k3 h
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) q' |& ~ [8 u9 p0 R( e3 |8 P: B
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*! P* F4 B. b, A# n7 a4 P
** Configure the McASP pins ! Y: m: R! P) B6 s4 _- H
** Input - Frame Sync, Clock and Serializer Rx/ H R2 S3 d& B% \/ n5 ~2 x8 A
** Output - Serializer Tx is connected to the input of the codec
' B4 i3 i( T) r2 I*/
! m' ?2 h% F& U. A6 vMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ g( F% M) b1 |3 c3 R- R* FMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ B8 |/ T4 J' |) b; X
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 j! o% ]- i5 R9 ]
| MCASP_PIN_ACLKX
% n, T# V% q0 j `9 B# ?/ `: j6 W2 n| MCASP_PIN_AHCLKX$ O; Z8 ~: [, p
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 P/ H6 C5 @. UMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
1 a8 H, j( F5 y. n$ Y! H| MCASP_TX_CLKFAIL # `2 u/ u) l0 J! {: I% L+ w% S
| MCASP_TX_SYNCERROR7 A$ i$ P- p" M6 N! I) y
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; \1 z7 f1 X- H' ^6 k
| MCASP_RX_CLKFAIL
; \' m% q! }4 D+ _3 ^| MCASP_RX_SYNCERROR # h& Q1 s x0 p
| MCASP_RX_OVERRUN);& Y) W* l2 n' l( Y3 y- W' b
}
static void I2SDataTxRxActivate(void)
" e6 r) f% d8 c6 _: S! v{3 z' i5 ^& J; x$ J3 U2 {/ ]: m
/* Start the clocks */
; W8 |& ~: ]1 r3 Z5 E3 w& m8 PMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* Z" _1 F. ^" S- X7 c5 Q0 _3 w
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */& x- b9 U! M- H- z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ P0 u" _1 `( L0 M2 j
EDMA3_TRIG_MODE_EVENT);
" n& X; y) d3 b- t/ `) xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 K/ x2 b( u8 ~$ _- j* ^/ G
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
8 Q: n+ c- A7 H- y( M5 ]% aMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 b/ w# i0 \- g: z% AMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */! j) z; N- b. b5 H; c: r3 Z: s, a
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */' h$ p5 \4 A" a9 x8 Q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% ^4 P; ~$ z7 z4 E+ x" |6 BMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 q g" c- e' Z, F' s. g
}
' n5 O7 B7 O2 G: _& b
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& ?1 Q/ X7 L% v1 J* _$ o T& c
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |