嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
a+ V; P( m( X; C/ Pinput mcasp_ahclkx,0 q: P( u0 F+ r" T; \0 S/ B0 p
input mcasp_aclkx,& P7 @8 k* j f" i" D2 z
input axr0,) c7 ]# A& v. C0 n8 @. B
& |6 v1 ^/ s e$ X6 s
output mcasp_afsr,% z9 P0 d8 O: x" g) y
output mcasp_ahclkr,- s! S1 J7 F9 v9 a7 s$ c3 A
output mcasp_aclkr,
. K0 [1 z! B# i) soutput axr1,
2 U, o! `+ i! j3 L7 f
assign mcasp_afsr = mcasp_afsx;
# q& V9 Z& H! j# | fassign mcasp_aclkr = mcasp_aclkx;
$ O+ o& ]) v. I2 F; R( h' Kassign mcasp_ahclkr = mcasp_ahclkx;& J/ v! R4 T" f5 c, W, o" p! ~
assign axr1 = axr0;
( V* N* Y" X1 _) N# l7 H/ p# {; m
: o) P: r: k/ z+ f+ @2 h
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ i% P9 m3 m/ k/ y! {
static void McASPI2SConfigure(void)& F5 w: V l2 R( X% b
{
$ a. d) K8 z! iMcASPRxReset(SOC_MCASP_0_CTRL_REGS);1 A: T$ e B; e" A1 m$ p
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
. B9 }4 T5 C' T# y9 ^: |3 E6 aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 N0 j( u) O, \" g0 VMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
8 ~1 ^& s0 M0 Y- J. k: o) cMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ X* S. Q$ Z- d3 GMCASP_RX_MODE_DMA);* E/ u9 b- e/ @% N* V" ^% V& m
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ w" Z- u! i3 I
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
# O' e2 m& D! U0 ? JMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # {! o8 Y/ p X$ t6 h2 s
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! E; ]7 M: x% J8 q/ pMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 E1 u6 v- j, s( `* tMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
# i! n3 Q% M$ ]- q; r: J4 NMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, J- V4 o( Z& \3 E5 j0 D8 BMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( ]& r+ M$ f1 l( U) H, a
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
Q) H U t3 i( e- \% ^: A0x00, 0xFF);
/* configure the clock for transmitter */
. a6 I* ^. u3 l/ VMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& u' G5 J. K- D4 I$ x0 X/ Q0 OMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 u% ]$ b) K7 L& V' sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# Q! X+ S6 @# V7 W8 l2 `
0x00, 0xFF);
" n7 ^: E6 Y# u( [# ~: C( t. y+ B6 m p- p' P5 ?
/* Enable synchronization of RX and TX sections */
% K9 M4 {8 H1 l' dMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */8 K/ C' c" I1 Q. R$ w
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 e& C" v' S: l
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*6 p; z) V9 @$ `* U& L3 I
** Set the serializers, Currently only one serializer is set as
9 z, K U; N$ [5 E' d- e** transmitter and one serializer as receiver.- O% Z2 i5 H% h, J0 K$ |4 q) J) j
*/
; ?* Z. s) A1 f" S/ J! N3 {( `$ g3 gMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 \2 [3 ^& G. i6 v4 ~
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
1 v3 j+ d6 O* |** Configure the McASP pins % W* v: p! o+ v
** Input - Frame Sync, Clock and Serializer Rx
+ t, \! i& y* E** Output - Serializer Tx is connected to the input of the codec 1 Q/ Y% ?% n9 ]. e8 ?1 a; {! O/ {
*/- [$ I" a; \ h& g% Y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( y" M' S' Z; Q' @6 sMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( }5 [4 B6 `& Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 d5 b+ j& T: A- L) y4 j) `| MCASP_PIN_ACLKX! u# K( }+ R( h( Z; d
| MCASP_PIN_AHCLKX1 n! X# ~/ L5 M( J& M' I% ?
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */0 u# o* i3 _6 P( g
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& m& _9 N+ e, v6 C# G| MCASP_TX_CLKFAIL 2 y r- K8 J7 ^" W7 o7 C
| MCASP_TX_SYNCERROR k. S3 q* h7 T4 S3 Z
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * {4 ^# X6 s' [6 I( g2 r1 ?8 K. T8 a
| MCASP_RX_CLKFAIL
6 L+ {' Y' R* M% a9 q& C| MCASP_RX_SYNCERROR
3 b/ V) G: l% g, J q9 y8 u8 a| MCASP_RX_OVERRUN);7 U% Z; y) _; R
}
static void I2SDataTxRxActivate(void)2 F9 d- J+ J1 U( J6 ]' _
{
: {2 b1 C p, z4 l! h, u, t& d& k/* Start the clocks */
0 B# \6 G& X4 h" [4 h0 WMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 z: }: g; @9 y9 V" }0 AMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */4 v* E( _" M7 r$ Y; N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. l, R, T* l" p% a" g! _
EDMA3_TRIG_MODE_EVENT);
/ O% Q4 q+ Q# v8 [EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
8 s7 h+ ]. \5 kEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
( \8 x; ?/ R' x: A1 c# pMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ ~- j L5 r" X) V6 yMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
# P) x4 E* b9 M; G! N. \while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */" u5 Q. m9 n8 J3 F! D. |. ]
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 m; @1 m' U1 I# c) J# RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 h- f9 l- A$ j}
: I n# A; u! c" i! F2 l- }( m0 A
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 l) K; V! E% S
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |