嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& t0 J4 N* @1 ?* ^9 u7 Pinput mcasp_ahclkx,! b; R8 e" N7 f3 g0 K7 m$ j& x
input mcasp_aclkx,4 y* R* [$ \8 ]! N& v/ ~
input axr0,
7 F2 k& y" |/ }% `. A, H$ e& q' j R" N4 r. X
output mcasp_afsr,, ?6 u2 _$ t$ Y; b
output mcasp_ahclkr,5 N4 z: H+ X( p+ t
output mcasp_aclkr,
' b P C% t4 U8 C3 p* z {+ [output axr1,
- \" ?1 R, Q( ^
assign mcasp_afsr = mcasp_afsx;
1 p5 K D1 c _& ?. passign mcasp_aclkr = mcasp_aclkx;( Y% V+ Y3 N. e% Z0 ~
assign mcasp_ahclkr = mcasp_ahclkx;% q1 l8 i2 d5 i$ m& [8 w v& n
assign axr1 = axr0;
# W' e4 S2 h" h G. r, P
" Q5 T `& y' H3 Y6 b: C" k在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
- i P0 w' G3 S' d
static void McASPI2SConfigure(void)
x+ X& X; D( J{
% A4 v+ T, k- w# L9 \/ |% [McASPRxReset(SOC_MCASP_0_CTRL_REGS);$ E! U7 w4 n6 o/ r
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
6 B6 Q8 |5 H$ I5 I( U7 p, zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: s' |# L \% d- uMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
3 N' p/ V% b7 x, [3 t! i5 D# SMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 x- _* e% w6 K/ N. l& _& x
MCASP_RX_MODE_DMA);/ I' O7 H1 n# B @! M6 F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 T+ D$ Q, Q% P- p) k) X1 d$ j! G1 NMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ d' ^6 h+ e$ WMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* }2 U/ U* _( H/ r" N* Y5 ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
Z# H1 D: o4 A! q" N( F1 hMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + S( k7 v& Z; F; m& `7 r
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */0 [7 c r. j: {, l5 g3 W
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);2 @% J5 e; Y- V* o7 K3 j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + w. i9 e+ ~$ z& {3 b Z- t
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ f, n; g: R2 E+ u0 `7 Y: z$ @
0x00, 0xFF);
/* configure the clock for transmitter */) n. W9 ]2 u$ `: X, @
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% h5 }; `9 W# {0 C- j. }4 IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 W/ z7 S. K2 Z. m+ `McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 m7 V5 b' J$ h, X' ^2 i3 L
0x00, 0xFF);
9 i5 x/ g- i. s3 O* I/ c/ l& B. z; g4 ^% s
/* Enable synchronization of RX and TX sections */ " N8 |9 y" Q0 J9 r
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */) A$ m5 O5 }5 L( g
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! ?# s# w+ h" Y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
/ _8 P; E7 K# g* f$ E+ d ]8 J% u** Set the serializers, Currently only one serializer is set as
& |" i1 X, B' A5 Q8 y0 i** transmitter and one serializer as receiver.
' w6 k+ X+ b6 `* N" }*/
$ N. Z# w: T* d8 Z# Y' VMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ W2 H4 @+ i( }6 L4 @: s% z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*9 P' y, }- D* K3 c( o
** Configure the McASP pins
1 ^; }9 y9 V' n$ c+ P** Input - Frame Sync, Clock and Serializer Rx* l, R; b! L4 e H$ d9 H# L7 Z0 r
** Output - Serializer Tx is connected to the input of the codec 7 z/ M. ?, g5 \
*/& F. D7 b% {) N" ~8 L8 e( H2 p
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- e" X! S( V/ Q1 u3 B# U4 _) R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ T1 X1 l# m: a3 b$ o6 y. p/ C6 z6 d
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
e6 G, E: L7 F| MCASP_PIN_ACLKX. O, k8 R+ w! N7 a# l3 a
| MCASP_PIN_AHCLKX
( g c: t6 X- ?2 m| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
1 y4 B# r( V; `% d' [0 jMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ L* U" i9 c, A
| MCASP_TX_CLKFAIL
( v I6 @# {3 G1 Z& k/ Z" ?+ X& ?4 p| MCASP_TX_SYNCERROR
7 m( L5 E# L9 }7 y| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 a# \# F) g8 ?2 {
| MCASP_RX_CLKFAIL
a; P2 u6 Q$ M0 v9 F8 W| MCASP_RX_SYNCERROR
4 H$ `8 h# P. {$ Z: J) Q| MCASP_RX_OVERRUN);! Y/ H& s0 \4 [$ n: u8 r
}
static void I2SDataTxRxActivate(void) n5 e, P8 Z8 j! o. F* B5 o: T' m
{9 r& `5 u! u8 o* W9 z- `2 F0 H
/* Start the clocks */
2 O3 w- ?8 ~7 B% JMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
7 X# t3 d* G; Z, ^- I8 }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
! b( E7 V: w% J! l: i8 S6 `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 B( H4 S+ C) n1 e# @EDMA3_TRIG_MODE_EVENT);* a! C) P( S$ F9 H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " k& Q J0 ]/ o" L+ n+ C9 E' {0 |: {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */& I5 a7 s! b0 J+ X9 `# x. P: a! J) i
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 s% ?2 U3 A2 g; X3 xMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */- o4 m" l4 K$ U( g* x2 \8 u) {
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
( F `3 }. c+ ]% K& YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) ~7 t* r5 x( k% o% ?6 R( bMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
+ h4 m6 N; F! Z- k0 f& h}
' N8 c3 G6 V/ E* T$ \- w
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 h- v8 L3 \" d# t
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |