嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,7 l8 i; Z) {1 v
input mcasp_ahclkx,9 g# w( i( _ i; {# t
input mcasp_aclkx,
+ {0 A9 ]7 V3 a) f+ f- ^input axr0,) u4 l0 H0 N+ O3 c" ^+ h
# x% C2 o3 i }4 c$ k& c
output mcasp_afsr,+ d3 I1 j- z. s
output mcasp_ahclkr,# E, |3 G) R% l/ n4 A; G
output mcasp_aclkr,3 r) B8 Q& ~# `$ s7 H; A
output axr1,
& G3 H, x* b/ Q. x) R1 X8 z1 g2 A1 v
assign mcasp_afsr = mcasp_afsx;# _4 C8 K6 d% G4 t% k: J, G
assign mcasp_aclkr = mcasp_aclkx;$ Y. }, f- k( g! `
assign mcasp_ahclkr = mcasp_ahclkx;
$ G: ^/ W9 k, b- z/ Z- Y7 d4 yassign axr1 = axr0;
% k9 s5 t+ b* Q. ?2 r4 o4 m' y" d5 |' @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
, `0 z% S% Y: W4 [3 R' V
static void McASPI2SConfigure(void)
# R6 U; a6 k) O0 @{% v7 W6 [) R; O( j* f1 g/ q. R
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
! U. w9 ~/ t: g' c4 }- D9 JMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
% Y* ~7 a3 V" x; P1 Q4 }McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) m* m* U# W6 K! f
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */2 S" R* ^! k" j# x X8 j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 o A* G( ^9 C. O+ G- b% J
MCASP_RX_MODE_DMA);
) F* @9 q+ Y) v' ^% fMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) _- g6 k9 ?8 p8 |' P6 \
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 p* }2 j4 y) d; ^7 T2 e7 vMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , S" v2 B+ C; T9 c( L, V. Y) k
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ q: ~4 z3 O L7 k9 g) G1 g/ i) V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
C5 P. [8 l( N; w0 {8 H$ U8 G; Z! i dMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */$ ?. @; p& ], P9 }
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
B& e" p1 k2 ?, FMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# K4 k2 ~1 |% N/ z; M6 J" jMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
V2 \* U) ]7 a# z6 g2 k( @- b0x00, 0xFF);
/* configure the clock for transmitter */6 L" \7 ?) e. X9 _+ R4 y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' [* n. D% b3 ~, Z
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 v/ J& }- X8 ]3 G
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: a, u! Y: c# h7 l1 n/ f8 e0x00, 0xFF);
' C6 ~/ x4 f! h
; _% P) r7 w3 g i3 c$ K/* Enable synchronization of RX and TX sections */ * E. }* t( M% X9 W8 X; L# H
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */! Z" k) ~7 \9 [ a6 ?
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ E4 J4 u D: FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
+ O3 _) }! |. r( O% T** Set the serializers, Currently only one serializer is set as
4 l2 R* u; \4 T3 w1 q# S** transmitter and one serializer as receiver.
, n0 e) l2 s4 N8 K4 \*/
8 O" h* X; J8 ? Y- xMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# r1 f8 p: N& k4 l
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
+ Q( d& h8 F' R N2 @9 [** Configure the McASP pins ; P4 ]5 K0 E A) D0 R
** Input - Frame Sync, Clock and Serializer Rx
, j7 ^# y& |" @) E3 \: |, D& T** Output - Serializer Tx is connected to the input of the codec
% I3 R3 O. o8 r* W, N6 ~*/2 f; k) ^" {) f) B8 x4 y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: E" z( i5 @5 D2 Y' l$ |( Y- p& F
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ T. w0 S' S9 U+ kMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 y" P2 I9 Q0 p% k3 M C
| MCASP_PIN_ACLKX
9 ~" a+ ]. Y' ~/ P B% N. N| MCASP_PIN_AHCLKX
H, a9 ^5 @; F9 p5 x3 W| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% y& A0 y, H$ L# T
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , @( h7 L- p- y( b p9 M
| MCASP_TX_CLKFAIL
8 a, u0 E( u$ D7 q( N, r| MCASP_TX_SYNCERROR3 @% z, W" n6 O6 V1 A
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - m, W' y% r; _9 t/ a3 t
| MCASP_RX_CLKFAIL
, B* P& E* Q8 h1 i$ B| MCASP_RX_SYNCERROR , S4 O! I4 c. b* M% O- }! e; @
| MCASP_RX_OVERRUN);/ e: F& z! F1 t6 s
}
static void I2SDataTxRxActivate(void)3 U% R$ t5 w9 H9 k. e. e( `
{% o2 I" I/ Z5 [, x7 L
/* Start the clocks */
1 m- F' {! k; ?+ e0 f9 fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 h; n$ Q; X1 P9 S( x% LMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
# k$ w$ b9 ^4 w+ pEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 v6 ? c# n+ A. `0 C& f
EDMA3_TRIG_MODE_EVENT);
: V1 X; N z6 f1 a" Z- E# D; y0 lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% }& k3 I4 v/ G6 |, ZEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
8 P* j7 \; F3 y1 a0 B: \9 s+ PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 ]5 Z% P# d- o6 n9 L
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, a5 X7 H4 A' Z5 x7 _ | p3 awhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
( j# n F/ c0 J1 c. O$ l# {; aMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);! l; T. [, L" s% F- c0 Z
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 ]$ f: | T7 N& Q S, T}
8 r* W p" n- m/ z1 k. }请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 _; w- D+ f) f# ~6 _$ g5 O
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |