嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,) V/ g# M" p" S1 x+ Y6 l5 ]( T+ j
input mcasp_ahclkx,
3 n& J* Z( z* w. Cinput mcasp_aclkx,
1 z* b' m4 N5 ?9 T$ V7 ninput axr0,1 @0 {2 p3 J- v; `) v% A4 p2 T2 h D; {
7 K* N# w3 H! B5 V
output mcasp_afsr,3 g9 L! O2 y4 {! u3 K
output mcasp_ahclkr,% m' u v1 ]% {0 T" E7 m
output mcasp_aclkr,$ o0 g/ D* U8 u4 }9 r4 T# Q
output axr1,
1 }, b+ j0 d% e: a" e- p( o; q, e
assign mcasp_afsr = mcasp_afsx; v$ E [3 X+ e& _. }. j2 x0 o
assign mcasp_aclkr = mcasp_aclkx;" y" l2 l" G4 }1 n% [: G
assign mcasp_ahclkr = mcasp_ahclkx;9 e0 p8 A6 L r
assign axr1 = axr0;
2 C Z5 h! v9 ?; c- k! R7 o! o' o
2 f3 G) L6 N$ d: I# `9 \在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 u) O$ u8 ?6 m3 B- V2 Astatic void McASPI2SConfigure(void)7 R5 L3 u' L3 m. e2 {; ]0 ]
{4 S5 u1 r! X. o5 S" Z2 t0 S ~# S
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) ?% P( y8 L6 I) \. X" i% `5 pMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */+ p6 m( h. J8 Y! Z' v" t
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! J, U( T8 \ l" \" xMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
: P5 u2 i6 f e4 H) i5 x; L3 T; J7 cMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 C' x' R$ }4 l S) G, K1 e* H
MCASP_RX_MODE_DMA);2 @: v: A; y5 a
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: E- b# Y8 H3 q' OMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */( { [) j- Q6 e0 V: J
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 T! Y8 n0 r4 N8 ?% {
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
o* X- Y# h8 ?3 W: Y! e0 a# W; \McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
) _* [! i6 r2 e( g% t+ s; W% TMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */! F; c7 Q# h4 V) b% e+ p1 t
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);' }- }, M7 ^4 |
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 f( }) q0 T5 K* U
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
, n7 T, E3 K" a/ ?/ k0x00, 0xFF);
/* configure the clock for transmitter */" ~' Z( {0 u: V
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ b6 @! h r1 ?9 t4 ~7 }1 s( T+ EMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: Y7 r; F) I0 a- @: P7 ^* K' K6 TMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% `/ z) g. e5 {0x00, 0xFF);
" L# k# j1 D& z3 L' h3 f. l* V! ?" F0 l, G4 j5 H R+ D
/* Enable synchronization of RX and TX sections */
& W- G/ V& K% J. P! i- rMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ p* v$ S' p* U% l: m0 BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 I& C Z* u# B0 X7 j0 u7 jMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*; ~( N% G' |. s- z
** Set the serializers, Currently only one serializer is set as
2 ^2 o* D: q3 Z** transmitter and one serializer as receiver.4 T, O% ?( |- i/ A- F- h) k5 Z
*/
/ G8 F ^6 w) DMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) {% L2 l/ h8 b5 N4 Y" x! A
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
$ R& ?- A! G4 W7 \0 n& z& t3 I** Configure the McASP pins
9 `* y5 m' M2 \( J5 q9 Z, `8 S** Input - Frame Sync, Clock and Serializer Rx1 g; `2 }1 u9 }* C6 y/ v7 X y; s
** Output - Serializer Tx is connected to the input of the codec 3 @2 U7 J. M0 D5 U1 e; H* r5 o
*/
. g' J& `0 I, G9 e& e4 @McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- ~2 D% ` e0 @7 V1 O! `, [* G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* l" x% I0 R V ~0 {0 q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" R: X; [2 c0 x5 @
| MCASP_PIN_ACLKX
# B8 [9 e4 D2 Q% {| MCASP_PIN_AHCLKX. x$ {" I0 b# Y G# u4 e/ L+ W
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */8 h' b$ ~8 D: w
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: e. } c ?9 w6 B1 X" S| MCASP_TX_CLKFAIL
3 V- c+ E7 t# D) d) ^4 F| MCASP_TX_SYNCERROR: d2 a' Z# b3 y( N0 m2 b
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 l2 a) Y( i2 L; h; v0 v
| MCASP_RX_CLKFAIL; a# _: o/ j K8 q- S
| MCASP_RX_SYNCERROR : X5 m6 K7 h5 u; w
| MCASP_RX_OVERRUN);
) L$ x6 l( p$ n}
static void I2SDataTxRxActivate(void)
7 Q! x1 q3 ~ H{
" r6 q4 {! C! |+ h" L' k( s/* Start the clocks */" u4 y- G2 I/ P0 a# n' J( R/ c
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, P& s" f! W- I$ K7 R
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer *// ]! n2 m$ ~6 L) j" a/ p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 P' B1 D) W9 z7 p5 l, f4 R+ |8 g5 _2 MEDMA3_TRIG_MODE_EVENT);
e4 W4 ?( z# G% D* k" d6 ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ l3 a' [" t C& ~# @
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */4 J9 O4 E2 M- K$ J! e7 ` S4 n
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 W" v) F# [6 B/ DMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
7 S5 |) N9 C3 t5 f. g) w5 Hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
% u* `# z. f' m5 N' L7 n: F% zMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 w n' X% a. X3 s! B; o8 N# s3 [& b
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 R) l4 q0 D4 _3 r% P6 d7 }. Y
}
9 u. ~- d6 e) X/ P) o( S% a9 Q请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 o) y4 y/ y* [! S! z9 R
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |