嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
; a/ @( G' F: R K7 Linput mcasp_ahclkx,
, B, k6 d1 v5 K& \: `input mcasp_aclkx,4 d; A) D9 x) `! K# h
input axr0,
$ R1 ?2 ?% T+ k# `) y: G
. j+ D4 c9 R6 Uoutput mcasp_afsr,& u% S/ Q2 z( `4 B* o" I- y2 U
output mcasp_ahclkr,
& F$ K; X8 x! ? G) P" r: t& u/ uoutput mcasp_aclkr,2 n. k) n1 y& T/ a8 Y, A
output axr1,! k/ B- _; o$ O% }
assign mcasp_afsr = mcasp_afsx;
0 S+ Z' z) V# n& oassign mcasp_aclkr = mcasp_aclkx;
( A- w9 N& P' g/ G' Aassign mcasp_ahclkr = mcasp_ahclkx;. P( W3 S$ ~ {- c1 t
assign axr1 = axr0;
7 B! Q5 L7 _# A2 P/ L' ]7 z: ]3 I5 l. L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. R* [8 k6 `1 l; N i( I
static void McASPI2SConfigure(void) P0 _# D2 F: c J
{1 X# _8 k% j- G. r% Y4 K
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( [+ S y9 h! T) m& A3 cMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// X' B+ ?. F+ ^ @
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 b" b% k2 S/ P% t+ O( _
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
& h7 k) C9 b; T' c" JMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* J9 t. L9 f) k" Z& w
MCASP_RX_MODE_DMA);
( h5 N/ P+ H! r7 I! YMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 j1 @8 i/ m$ \( X9 `3 NMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
# H6 c: K5 e0 v, S$ c5 w/ dMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
& R: I$ |: K6 \MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);1 G. n" x" q, D3 K
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 K& L# c6 U3 I: A0 e
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */; {* _. G/ f& F+ n }' O
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 ^# g2 R: z/ W( s' X, M6 o4 M
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % D- M) a q" N _$ C8 ~
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* h0 a- p# L" j+ u0 h/ |9 s4 q! [0x00, 0xFF);
/* configure the clock for transmitter */
$ l+ c: L- f' y+ XMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& \2 A6 w* O9 q- S8 Y0 k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + n, }7 G& Q7 Z. C# @ z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
5 V! K, S9 E0 V2 `) l+ P0x00, 0xFF);
, m+ Y1 U$ `* t6 R7 E1 y# B1 T5 Z) r& a
/* Enable synchronization of RX and TX sections */
7 W/ \7 u2 i/ m& i' k! [McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */1 E+ Z; d" k& y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( h' m" ~0 r: T0 KMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
/ [$ P4 n7 J H8 Q w* E% F$ n4 ~** Set the serializers, Currently only one serializer is set as5 w7 q6 V- F* Z$ m' T: g; U
** transmitter and one serializer as receiver.3 ~. k" R3 `( h1 ^9 X
*/
5 S h0 Q2 s. ?7 b" t2 aMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 I- s4 C# [" L( |3 m% Z% K7 {! C0 r; b
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
* N8 L2 R3 i5 M4 V7 x$ }** Configure the McASP pins
7 G( i0 j' x# O7 ^/ s$ s** Input - Frame Sync, Clock and Serializer Rx1 O! e6 i% Q& C
** Output - Serializer Tx is connected to the input of the codec ! }, J. z3 g- F$ H* w7 Z
*/
/ H O- ]8 x* q% h2 b( ZMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 B: u6 @1 h$ y7 \9 j( n" }& }
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 M3 b7 [( z( ]1 n- P1 T0 K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 l" n) J# S" L0 v| MCASP_PIN_ACLKX0 @5 w- k7 @; T+ b2 y5 a4 ?$ W! d8 d
| MCASP_PIN_AHCLKX
" X& c# |+ U2 m# M$ z| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */6 s r: g6 n; ]
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # Z3 v# l5 c- r4 U: h; P! c
| MCASP_TX_CLKFAIL
f& D) x1 v3 \ H| MCASP_TX_SYNCERROR6 O: d, K% Y8 ]/ @7 n: s7 F
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
$ h6 L1 ^9 Y$ n; ^9 b5 O| MCASP_RX_CLKFAIL# `) M% U- H2 |; o
| MCASP_RX_SYNCERROR 7 z6 {0 [; ] H+ v8 V# ~
| MCASP_RX_OVERRUN);' j3 u* M/ w. b0 ^: N _
}
static void I2SDataTxRxActivate(void)
$ N, M5 l% r0 T* k) d% K{9 u$ p: P3 Z8 K/ w9 n. m
/* Start the clocks */0 W5 |3 o9 r' @* I/ ?+ m7 ?
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
7 P: H/ m2 s- n6 y! e: mMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */1 X% i) [; `& V( p2 P) `4 j5 D
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; \7 J- h8 c+ y* ^2 Q: {1 H6 TEDMA3_TRIG_MODE_EVENT);& y+ ^$ Q, i& Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# y) l$ p, x/ `, F5 EEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) P; t: ~* E2 u3 P' Q2 i2 G* ^
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ ^' K! t5 P2 | j+ V- L4 X# U
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
% @! v8 c: E5 h9 g) {6 Ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
0 f& `- v) U" t, f$ d1 g1 H1 G3 rMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- ?$ s8 m# U- `) P1 QMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( m6 n' L3 a8 ]}
" e* H; Y+ V& O ~
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% ]" v% Y b- D* b# m$ D; u
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |