嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,$ S$ G( O0 c. i: G2 ]
input mcasp_ahclkx,
! a- n  R. B* Q7 n6 I4 i* _input mcasp_aclkx,. Q# N1 L6 j' u2 Y+ p) q
input axr0,+ Z. D9 _  J/ ?
1 S- a: b  b' l7 }6 w7 K: M$ h; T
output mcasp_afsr,3 n3 c2 r! f% a& f% T2 ~- p. P5 e
output mcasp_ahclkr,
( q( ~  }* E6 B& B) e- L' N" x- Koutput mcasp_aclkr,
7 s. Q2 d0 I) l3 Y7 Q# v) f- w7 toutput axr1,, s. o4 ~& d, ^$ u
assign mcasp_afsr = mcasp_afsx;
2 L: C( T2 h; E' v4 s9 ^/ ~1 I3 Eassign mcasp_aclkr = mcasp_aclkx;- `$ h+ S7 n" t- e# B
assign mcasp_ahclkr = mcasp_ahclkx;9 x1 w6 _, E# \. k) F
assign axr1 = axr0;

0 e2 o" d: B* C; ]3 N9 f" g' e5 ?- z6 n! L3 N! f1 l# E7 G! L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 G" I$ x. `9 U3 Q0 N$ g
static void McASPI2SConfigure(void)
  c) a1 _( \! a/ ]4 I{
# h! q' U+ i) o- f$ ^McASPRxReset(SOC_MCASP_0_CTRL_REGS);, a7 }# r9 z6 |: E1 T# b
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */$ t1 j. z1 k  E4 @3 h9 [* S3 T
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 \9 h: l" b6 ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
3 r' @6 r& F" t; ]McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 h- H5 P5 a2 j" d( P' v2 j. j
MCASP_RX_MODE_DMA);
: M/ A+ X( b! r7 l! i! J! i4 r9 FMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( y8 _- @8 j, d/ m2 q5 u5 BMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */" e7 |8 ]5 z- d; ~& B
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 b& N1 B- m( y( b4 I% V$ yMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 {) s; ?  l5 y7 ~9 {& N/ o& ^
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / l1 n2 J! s6 @0 E/ K4 v. G, g+ h; e
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
" a) @* q; V# g) D- W! l% qMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 V. V; I( a9 V5 K6 dMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' H! t6 [+ `8 J
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,  ~, W" G3 l6 L! ^6 i4 E
0x00, 0xFF);
/* configure the clock for transmitter */
2 r; F7 {) e# pMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: q* _+ E* Q3 L
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
7 c+ A( v! j0 s, X% U$ VMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 ?3 \# H! A( L; Y8 C9 Q, M
0x00, 0xFF);" @( V7 M, K2 b; \+ @* V
1 i1 B9 d/ N; d  c
/* Enable synchronization of RX and TX sections */ ) O, J+ r( c' }6 O$ k! [
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
; ]. w' z* `: F0 f! K1 sMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ [2 _7 `$ U6 ~6 ?/ N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*2 h% `. F; c0 |
** Set the serializers, Currently only one serializer is set as* q- X: i. s1 O9 K9 O
** transmitter and one serializer as receiver.
& T: Q+ F4 K) u*/
) U& D& {$ [3 m1 i1 N: l6 F; u1 Y' n3 QMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 S# f% S% j- [% G' rMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
4 k9 F" F- p1 e) B* i3 c** Configure the McASP pins 0 `6 ]. S4 \5 P4 f" `6 Q
** Input - Frame Sync, Clock and Serializer Rx
6 }! h3 t, L. x0 |** Output - Serializer Tx is connected to the input of the codec
& L9 @4 J& x2 Q- r+ x4 }*/, S# K  j! V$ R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ w6 J7 C. s/ ZMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% x! Z2 w( B) V( sMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# m) e8 G9 l% k5 [- z
| MCASP_PIN_ACLKX3 ]1 i8 E3 v. o% A  c, b
| MCASP_PIN_AHCLKX
, W( N: z% Q/ f9 D; h| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */" P4 C7 l6 w9 D! O" F
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + \/ z6 a1 L7 d2 \! x# [
| MCASP_TX_CLKFAIL
7 O/ C$ ^* X! R' \. T| MCASP_TX_SYNCERROR
* C# z8 [: ?/ @8 s  f! ~2 p| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' y. S' P+ w7 m/ `* f| MCASP_RX_CLKFAIL& p* P& e+ k, L, T. Z
| MCASP_RX_SYNCERROR + Z% p. `7 x* X: o) e
| MCASP_RX_OVERRUN);
& w( P  b9 X% c  E$ ?$ P4 \}
static void I2SDataTxRxActivate(void)- k, v: A0 t  D- u( H2 c
{2 j+ H# y' F8 m! s1 c
/* Start the clocks */
: ^" ~* I1 V8 g+ g  FMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
& [( B+ A% v7 d* t3 n  j) {McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */# C6 d( \' F* S" u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 y+ H7 Q- s) Y# |1 r3 o( iEDMA3_TRIG_MODE_EVENT);7 l- z& }' |  U1 ~
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & Z+ Q' l. x' H  K" b0 Z6 `
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */( D2 S* |2 [/ r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ m" T) |1 N5 eMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */' {8 d4 T) T, A" P
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
# [" f3 z% _! x. u6 ]" UMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);( h  t/ X& e! r: f6 D/ N. `
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% _6 k8 U0 c  y# P2 _! b
}
: u& \: u8 J: a! k: |1 k% j3 T
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

7 P' b6 a+ j7 T! x* i8 R( ~0 x& W




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4