嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,# `) I1 P' m5 q; R/ m+ L, C
input mcasp_ahclkx,
; W5 ~' `- e; R8 M# H8 K0 f' Winput mcasp_aclkx,$ L; ^$ o* G' d
input axr0,
# Y/ a0 v) C% F+ m( Y( b
& W9 J( k7 x: @output mcasp_afsr,' ? f# {. `9 P; Q* x5 f1 W0 O
output mcasp_ahclkr,
3 `: |) Q3 g. p$ |output mcasp_aclkr,
6 _4 T5 X/ l: ^( ?1 }output axr1,
. Q0 w9 |; H& K& C3 k
assign mcasp_afsr = mcasp_afsx;
# W7 g0 n% `! C: _( y- d- |assign mcasp_aclkr = mcasp_aclkx;2 T0 b6 p; Y5 O
assign mcasp_ahclkr = mcasp_ahclkx;
% u/ F! b9 _2 O4 I7 d' }9 zassign axr1 = axr0;
V, @. {6 z, ^: ?# r4 t! g
e! [6 o# D3 y' E
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
1 _8 _; W! J2 a7 _' c7 w! E& p
static void McASPI2SConfigure(void)3 i; P. I. j3 C( {9 S
{" e" A! a- T+ L/ l X, g, O! j6 \
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* }" f" t+ r4 AMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
9 N3 n8 H# s5 o, m* vMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) t4 R3 V* z( g# d: z% ], `5 q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */# Y+ U$ A; W5 ?- Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) Y$ \& g3 n7 C! _! ~; f- p* w8 g+ V
MCASP_RX_MODE_DMA);4 @% S0 ~( B! d. Q x# e
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& u) W5 J2 s. q: m6 M% A/ Q6 i$ k' TMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */* I! D9 p' B: k8 ~0 I
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 X1 t4 M; W. v4 r) lMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);# A4 \/ V! W- E: m# E* z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! Z' E* c& ]0 q! x8 _
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
+ w1 V4 R) ^( ]8 o6 ?' WMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, ~+ d+ s/ l+ }' wMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, U1 o0 \ j+ f- d! x' j: M2 }McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ K' M; k5 `; p: U$ f8 [: w7 C$ {
0x00, 0xFF);
/* configure the clock for transmitter */
/ G+ V# `" p4 G! j: T2 U& \! GMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( L1 D4 U6 w# v1 A
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : j# l @+ [+ Z' `! }0 o1 u) N; v
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 K5 D! p1 N1 ^6 {5 i" j" v% s0x00, 0xFF);% y5 l' ?! n$ \# n9 w! ]2 w
* Z+ ]3 x6 F5 n+ b
/* Enable synchronization of RX and TX sections */ + g! a; M% K4 s" ?3 O
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 F, C, u6 ^! o5 b+ g* c$ k* RMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 u+ d) g% h$ |; y6 F8 Y; w5 {
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
2 D+ Y. ?) ~( o e! I% k( I** Set the serializers, Currently only one serializer is set as
2 r) \# l8 I/ G5 S) _$ R** transmitter and one serializer as receiver.5 ^- |6 f. f, l1 c7 `; v: u& U9 C
*/; C. x4 k. V' ^3 q7 v; W
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 }% w) C* x& X4 I* I; Z' R6 pMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*1 Y/ B; p% x) K6 Y2 K4 W6 n+ ]" z
** Configure the McASP pins / D) l9 ]% S; d/ @1 ` J$ i
** Input - Frame Sync, Clock and Serializer Rx4 ~- k. F# Y- i
** Output - Serializer Tx is connected to the input of the codec
4 u- L( F# q& i8 F8 o* o*/
+ C+ b, L! t/ t# k7 B. f1 gMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, B, @+ X' U( T, n
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ _, |6 P+ U; X7 c! j
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 I6 d: w4 ?$ V* P" C* Y5 y| MCASP_PIN_ACLKX1 |! N0 d: B: L* e' ~1 @/ p
| MCASP_PIN_AHCLKX
K D5 c B- a| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
2 e" H% \) b$ _+ a5 b- MMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 y+ l6 d$ P8 E; r| MCASP_TX_CLKFAIL
6 w) Y G/ j: h; v| MCASP_TX_SYNCERROR1 c t2 P- d% y
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ c3 I% V! d0 n' C) ~/ j7 f| MCASP_RX_CLKFAIL
3 D2 j5 x1 l0 @2 K* \! N| MCASP_RX_SYNCERROR . [+ @7 t7 N: \+ d4 v
| MCASP_RX_OVERRUN);9 {& |" v7 Z, d* {1 D
}
static void I2SDataTxRxActivate(void)
$ d3 ?: V# e$ e8 e j% l/ P/ y1 q" R{
& F# T* }3 x0 n' h/* Start the clocks */
@% p4 q: T* S" p6 K3 y6 S6 RMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; J% P& T9 |& l: r; y! j
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
& W' h }* w( D1 y* r* Z" ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
3 X8 S) y; s0 fEDMA3_TRIG_MODE_EVENT);
2 _! ?# a e6 E+ q1 U# S+ WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 Q( z* W5 Z9 [) j! E
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
; b3 s, p/ f5 s, ]$ uMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" {; { B- e r7 _/ y( O
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */6 x, O. i% F2 a3 i
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */9 O" s! O0 i9 p( f2 S
McASPRxEnable(SOC_MCASP_0_CTRL_REGS); a8 I4 _2 T9 d
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 ]3 V3 w) D# R2 _
}
: d$ D( \5 C6 X; p" S% K& k
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ F4 a! D; r x: Z8 {
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |