嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,4 T6 Q3 y8 w' A( y
input mcasp_ahclkx,
, `7 A2 h9 ~2 J) ?input mcasp_aclkx,
; L1 E% Q# S. k& {# Q% r9 @input axr0,
: h- j2 n" `) W( Z* x
% o- b; i) ]% _! ?; j3 s$ ioutput mcasp_afsr,
V d! S) i+ i/ @1 ]output mcasp_ahclkr,
' z1 f* h+ V8 R; Youtput mcasp_aclkr,' G0 B7 f5 u: R! m1 x/ \
output axr1,* B* q% B; Y( v" @" `
assign mcasp_afsr = mcasp_afsx;! n; e9 Y5 W5 H8 D* L N
assign mcasp_aclkr = mcasp_aclkx;
, f2 g9 E6 s7 R& @; O( n0 oassign mcasp_ahclkr = mcasp_ahclkx;
& {6 C$ W0 y* w; V+ y, Oassign axr1 = axr0;
. _1 P9 ~( [# D* c0 H2 [; q$ A
) p r p% [' J( U在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( ~! a1 s# p) y W m1 Istatic void McASPI2SConfigure(void)
( r3 {! A; B$ B- n# B8 @- r{
: E0 r6 [0 q a/ F, q) DMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
o6 l- B, l3 a* U P! X, YMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
: N8 `4 u" D( J; m, p* nMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# u/ j. ^: H7 J9 `/ _. [$ SMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
' H1 \6 w X$ e# @9 C$ ]2 w7 WMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( ]$ B9 g* {# I$ s- K1 h% d- ~
MCASP_RX_MODE_DMA);& ?1 @" e4 V- g* v) W/ c1 U' Y2 n0 b
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 i! g: e1 j7 q; MMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
# p' f @/ @# \McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! Q: k: J% f6 g xMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);0 Z* a6 F% W: q. u
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 [3 p/ V" k1 W t
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
: }6 f P( G6 g( ~# IMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( }, [$ W* H" y* N7 G+ Q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * F6 K. n1 H2 j
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ _/ @' b9 X5 F0x00, 0xFF);
/* configure the clock for transmitter */% ~# Y7 l9 _! k+ n3 S. T# t; F
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. N4 J* f! F1 o$ p
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' q; [+ [4 q7 F4 W! A5 a9 `McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% _' Z) ~8 G5 u2 T
0x00, 0xFF);4 k {, y# a- M/ d( z |7 S
2 U& x! ~" {) Q* r/* Enable synchronization of RX and TX sections */
; K; S% U& k+ U; @McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */+ t/ u+ b. c7 y9 `- k0 R
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, f& v4 n5 k6 m2 M' J# D3 x
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
; S2 n8 X* S0 A( V% }** Set the serializers, Currently only one serializer is set as1 H% n0 e, u6 e& ]/ d: R
** transmitter and one serializer as receiver.3 M( G m: e2 n1 @) ~( ~& s
*/
3 {$ P6 }7 B% a! [8 d. s2 VMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: ?* }7 J+ P5 i. A/ z5 V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
0 g, N7 D1 y2 ~% H** Configure the McASP pins
7 V. C! T- X; W! v- S2 K** Input - Frame Sync, Clock and Serializer Rx
/ R1 _) B- E0 i# t+ u1 X4 g0 K** Output - Serializer Tx is connected to the input of the codec # R$ ^3 p. Y1 n s* ?
*/6 e$ r. q) [ K! d1 h: V
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);$ Z* U8 l" S& I6 [: w! v/ j6 j
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 R; Q- n/ g: d0 Z' MMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 |3 A- c: E& g| MCASP_PIN_ACLKX
* h$ o; C* r1 C/ t) j, {& h| MCASP_PIN_AHCLKX
" ` Z% G5 a+ @3 F) \' ?| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
6 J! j O. n% J* `$ F$ @McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 q+ W' r) S, x) @0 E$ A- x| MCASP_TX_CLKFAIL
# z N% v% d$ _/ x5 W; X+ F| MCASP_TX_SYNCERROR) o3 J. ^9 b* ^$ a, o
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 \$ Y- Z" w+ w+ M5 |
| MCASP_RX_CLKFAIL( z" K( {2 ~; y8 k
| MCASP_RX_SYNCERROR 9 o8 {; [( D0 z0 b
| MCASP_RX_OVERRUN);" m8 H, s- v5 `: `; M
}
static void I2SDataTxRxActivate(void)0 `. y0 @% F- w: s7 M0 v
{- T: _5 v6 t9 H6 k* Z
/* Start the clocks */% B6 V* K5 L, m9 _1 M
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: d/ m" n; X. A% D) n0 cMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */! o: v7 U, t: _2 L
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; f# [1 P9 V6 {. Z6 D0 T/ o
EDMA3_TRIG_MODE_EVENT);8 Y; D& m$ T2 m) ]0 n; \0 c7 k
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' p! E$ r# `1 c8 S8 f" JEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */! x$ X9 l1 e l. @
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 U2 ~7 T# s5 a/ w& N3 O% h& KMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
. \0 P9 o* @; \while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */, I. V2 n- V" ?/ r* y
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);& b# ]3 Y# N! ^( I
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);7 K& ^6 S6 m. }) `
}
9 B; m0 @5 M, y5 N4 Q+ n. `请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. u: a9 Q& Y0 y1 w# X* o
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |