嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
) B, _# Z' b3 u, \; {& R$ cinput mcasp_ahclkx,9 _# D: |# K$ X* H1 A' P
input mcasp_aclkx,
. O4 L4 B% a) c% E/ r$ |input axr0,3 N1 r( z1 R% T" q0 g* ]! a

  j5 d0 ~( `% Ioutput mcasp_afsr,
4 E1 B5 X  Y: t. T; Joutput mcasp_ahclkr,
" ^) W4 g& V" I, ]/ z  toutput mcasp_aclkr,0 h0 z5 e0 b5 v6 v1 F
output axr1,( I$ E0 h5 |; R% d' h6 I
assign mcasp_afsr = mcasp_afsx;
9 T' A0 o; [+ e& k8 W% F* s" l# iassign mcasp_aclkr = mcasp_aclkx;
; _3 o# D- }1 V' s1 lassign mcasp_ahclkr = mcasp_ahclkx;. H$ b( Z. }& Q$ k  H0 O" G
assign axr1 = axr0;

( @1 d# G* j1 r7 a( L3 o
8 `2 ?" G# S' W  B0 U- d5 f  b) {
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

; R8 J5 `6 x1 t
static void McASPI2SConfigure(void)- ~/ E" y! ~* T1 H3 |8 p- A& k+ E
{% h8 g9 r2 G1 o8 O
McASPRxReset(SOC_MCASP_0_CTRL_REGS);$ N7 s+ d" [! Z% r
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */0 j- g' D! q7 T( Q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
$ u, U2 j9 d5 v/ X' DMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
1 k9 D/ q$ h4 kMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 D2 G6 V5 c5 {MCASP_RX_MODE_DMA);: ?, L% U$ _0 X9 B9 w# y8 {6 r
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' u; o) y! A1 K* \: h
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */, [# P4 I2 a9 H
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 i  d8 |! g9 \- X  q7 L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ j) a2 ]0 @* O
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! {, m: O9 U6 i4 Y; M
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
/ j5 w; h6 {# E5 k1 j+ A/ mMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);  V9 Q3 G$ a7 n8 ]8 H/ U
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
- B8 ?/ }1 c2 W; H5 K+ _& {McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! k/ N0 J) [" g) M
0x00, 0xFF);
/* configure the clock for transmitter */
) D* C5 y% Y& ?5 w  d& q/ IMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ Z5 h+ U9 b8 e- i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" q! Y( T; ^# y- [6 \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! a5 I/ {- j$ \/ l7 p2 Y5 h* r0x00, 0xFF);+ m! N$ i# `% ?  Z# V8 ?. @5 M( ~# ]

+ T9 b9 J% M" I$ `/* Enable synchronization of RX and TX sections */
+ X2 ^' k' e: o  u; h, BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ E1 L- Q7 V: I" ?. O! q- O+ cMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
8 n7 p# ?" r$ [3 p  L( T3 j. XMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*& q" T- c/ E$ E7 `
** Set the serializers, Currently only one serializer is set as# |8 K' c2 O' w! V
** transmitter and one serializer as receiver./ A: I3 A7 A3 J  p
*/3 D6 f2 y: d+ P  P7 m  g( i& I
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" Q# c0 ~# _, |0 H5 o! xMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 P5 x" B9 `. Z' J6 n9 `
** Configure the McASP pins
7 H8 E  l, j" K; p5 T: Z" j2 M** Input - Frame Sync, Clock and Serializer Rx8 d8 _* o5 F& k- \8 n
** Output - Serializer Tx is connected to the input of the codec ) _0 I) t* V' ~2 ~7 z7 w
*/
  V: ]# l9 R: e, Z( VMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" b4 G) y" t- z' B. J: S8 G# W& [
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 P* T! a2 F/ tMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" `. s1 Z# V" S; c5 i8 q4 J& x3 J| MCASP_PIN_ACLKX/ |' m* Z' M- _" p. @6 ?: y! B
| MCASP_PIN_AHCLKX
+ h4 e+ ?7 a! H2 t$ U# O  o| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
, f2 o% w( G' a1 W5 ~( _McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) e$ _9 q+ b% @% D" U2 P7 Q! I
| MCASP_TX_CLKFAIL
, L- c3 u9 J- R( I1 q# A! y; W| MCASP_TX_SYNCERROR/ D  J* ?/ ~% \
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 _# G6 ^% v" p8 `" J, J
| MCASP_RX_CLKFAIL( y! x# W! i9 u) h3 V6 X
| MCASP_RX_SYNCERROR ) L6 m7 @5 ]# \- E
| MCASP_RX_OVERRUN);
2 w( n0 C0 A# ]! O9 ^2 T2 e1 w( {6 ~}
static void I2SDataTxRxActivate(void)
7 L& s" a0 t: X  O{; `7 Z/ W  W7 D/ Z6 p7 Y, G" Q
/* Start the clocks */
6 d0 ~, _1 y: S+ I% f2 S+ W0 XMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 z# o0 M0 b. |/ d" j$ DMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
( A) D: f' T  [5 f8 s: J) ]% k) ]2 x0 yEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% E6 I8 T% X1 t# }9 kEDMA3_TRIG_MODE_EVENT);8 C( H% Q$ G% o. e+ g5 q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 d& R) `' m/ A3 ]& x% Q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) |% M' v1 D& Z& m7 ~+ p# k, F
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' w6 N) r6 k9 T$ G& i- Z  Z& z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
0 h2 T* E; k, @- e& [; o% E, Iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
4 l, n, A$ w; M8 UMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);' A2 H6 C. m6 C3 t$ y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% S8 Y3 ^) S0 }" \}
+ I( I( u! N0 x* @+ C
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

& M/ p7 ~  h1 |2 E




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