嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,' C& z) A7 f9 `$ E& s, t
input mcasp_ahclkx,
1 \! [- n% t5 U* Yinput mcasp_aclkx,0 s$ W( v, |- n5 l
input axr0,
5 c; e R: C7 e( a) W
. H) m) R$ B- p- L2 K( coutput mcasp_afsr,
" d1 _# l& q% p* Y, Qoutput mcasp_ahclkr,7 _, B' c6 t, P# g0 d
output mcasp_aclkr,
& a4 y' f0 V: o6 t& b/ Ooutput axr1, b& P( n Z% ?- D7 G5 x) A
assign mcasp_afsr = mcasp_afsx;
+ P. |% C% u2 sassign mcasp_aclkr = mcasp_aclkx;
4 h0 T n: U( n" I( Massign mcasp_ahclkr = mcasp_ahclkx;
. H+ c3 b: _- i& G- _* eassign axr1 = axr0;
8 B7 ?0 Y6 e9 L, y" X' E% O" o' v" k7 J* Q: Z& l {7 V
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 J5 J( v Z% N" g6 y5 ?
static void McASPI2SConfigure(void)
/ `1 b R3 r9 z: s' H) B{& L! \( Y: _; a9 ]. V1 A: M7 N
McASPRxReset(SOC_MCASP_0_CTRL_REGS);% c4 v/ R" ^) v( D4 O& n
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
6 j# a( J, o5 D% u* c% b- K6 Z, pMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
) O' C+ q- p0 |: v$ _2 T' TMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
9 T K- A6 s2 s, m4 xMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 z4 I* F6 N7 _ V8 CMCASP_RX_MODE_DMA); Y/ j5 t$ s5 {2 T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 Z& a& K5 A9 _9 i) ^5 gMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% I- F6 C" u5 I. n' }; [McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 N: ^0 N1 g. f( i+ F* W1 n. V) M ^
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) v) N) _0 n& Y2 L2 _: x
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . j$ A6 H0 A' W' v6 a" {$ j
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
1 S" W4 O* S% { Z; p+ {+ DMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
5 u% C! {& w8 c1 g/ jMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! Q+ X6 k0 q6 `, t/ r3 uMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ [8 |# q, U. D' ?& `2 p0x00, 0xFF);
/* configure the clock for transmitter */
9 I7 `% u6 L- r8 _/ W2 tMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* Q, W7 ~) h" s' j g- }, ] |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ t& d, O0 d! n, tMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ |1 F8 y& A( X0 g0x00, 0xFF);$ a% t0 i/ K% Z
0 |/ F7 A) y+ t' `2 h# u
/* Enable synchronization of RX and TX sections */
) g }' g1 p) qMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
) D8 q( H: \9 Y& BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 @7 x, P- T. o+ \. A
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
! u l7 q! M7 X. z** Set the serializers, Currently only one serializer is set as
: H! i$ n: j9 u! b7 A** transmitter and one serializer as receiver.2 ]' U+ P. l& D8 _, q. C2 q: U# [! U
*/( g4 q9 M/ K6 ~- h' G7 I
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 g' g: D& \9 m3 S
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*! P& a8 ^: G0 m; X# \: N
** Configure the McASP pins : A3 S* @- s6 v, _& ` m4 c, d
** Input - Frame Sync, Clock and Serializer Rx* J' P/ M* h! J
** Output - Serializer Tx is connected to the input of the codec - A( L$ b: A- r, `5 j: [# S& p
*/
0 M0 I# d, @* T& w7 eMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, y: j' C' F' f: Q* G" h+ f$ |
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 m+ r# J7 ]6 d! j0 [" s+ z' o
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" p6 G% |8 ^& y$ S( Z| MCASP_PIN_ACLKX4 ~( ?) k$ z( `) M" v! X }) g
| MCASP_PIN_AHCLKX
c! q* H8 f6 [3 x1 O| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
5 _, f, q$ v; ?( u9 JMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 f/ R% m, b+ I; r7 W! N' L
| MCASP_TX_CLKFAIL % t. w u3 \) }$ b4 e# d ]
| MCASP_TX_SYNCERROR+ h0 U) O7 C2 c
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: d+ R, a6 W! A& Y' }| MCASP_RX_CLKFAIL
4 E0 l; J2 v! G# h# t| MCASP_RX_SYNCERROR
. f" ]. _2 Y" j| MCASP_RX_OVERRUN);
0 g3 A; X$ I5 }* D/ i, F2 }}
static void I2SDataTxRxActivate(void)
) N, i" I3 q. n! w2 s, ]{8 D" ~5 C/ E/ L5 M3 ]
/* Start the clocks */
7 ~4 M! f7 n" N, b, E: v6 @McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! `6 k! K1 K7 [) q1 s6 Q; PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
c5 T# j$ Z& ^: r/ `+ a7 K2 ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 p' V) V8 W2 _; T2 ^ p
EDMA3_TRIG_MODE_EVENT);
/ R( x0 s- c6 h3 z0 K) Z$ pEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 @, f2 w& o+ n, BEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) N+ o- T9 v! \* F
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 d9 K0 }9 t, ^McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */0 [- X$ P/ w; S' C. t7 F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
0 `* J! B4 ?4 o: R# C# NMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 d e" q- b6 F+ ^; s6 y4 \, XMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" Y# b) c0 R7 Z' z& ?}
6 D) }% W+ L' c/ A2 \7 r/ }- W
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" G' x0 k6 ^% l) m* D) X
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |