嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
. {6 i1 k2 b2 `input mcasp_ahclkx,
& i) g8 c5 |6 q4 h% _( ]input mcasp_aclkx,6 h1 u2 Z7 b0 `
input axr0,5 v4 @( \! _/ `6 P
1 E+ T; Z- ]# i+ h
output mcasp_afsr,
$ D5 w, y, F! o; }; u4 g. O$ j4 `  |output mcasp_ahclkr,9 z( e' u: X* \; p; _
output mcasp_aclkr,4 T( D( }; Q4 K; K
output axr1,
: R1 {1 B& S) T7 R* Z/ M2 F
assign mcasp_afsr = mcasp_afsx;, _: c9 l) T- I: u) r* o3 Y
assign mcasp_aclkr = mcasp_aclkx;
. R8 w6 w' G" W9 l) S1 T. {assign mcasp_ahclkr = mcasp_ahclkx;
8 B3 q( Y3 i1 v& [assign axr1 = axr0;

7 s% s) S; F' v: U- ^( N# H8 K7 ]- i9 D) }
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

6 H& O; J1 L% N9 R# A: q. C
static void McASPI2SConfigure(void)
& s2 u; k. }- q; q* k{" b% E' A# Y$ E3 K, C
McASPRxReset(SOC_MCASP_0_CTRL_REGS);5 C; @1 i' H7 j) v: q9 Y+ R3 v# O
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
8 j( {' E  n* j) QMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ I. c0 k5 T3 m* m9 Z" V8 P# _McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */# N) \9 U8 d8 d! t* H3 g
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: M5 e( z' [3 m8 d8 ~1 CMCASP_RX_MODE_DMA);
7 s+ `  k  ~) X! qMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- `! v. p5 @/ ?
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ D6 z/ i* g; p7 h9 T, }McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; `2 r9 \# G+ V# Q: @. HMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, v9 \1 T% a9 _3 j1 }McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ( C8 v, \4 N3 X9 C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */' q, o( L/ i7 i" _- d
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( |7 R4 `5 c( [
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - Q0 ]  K- [' `
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,1 b& a, k1 X( ]* d: z0 A
0x00, 0xFF);
/* configure the clock for transmitter */, n! |( \2 ^! l" J" l( a  F
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, N* ~# c9 ]7 q( k8 o* H4 g
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' u8 Q) `$ s! [" }1 C; _. {
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,$ M3 Z0 l1 ~, x4 K  g
0x00, 0xFF);
2 M8 y' t1 H  K
" I/ g+ O. m5 O5 R. v/ M' _1 L% e! x/* Enable synchronization of RX and TX sections */
/ V5 ^( S7 F* h% }3 k  m& G3 r' pMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
  r) x, Q2 k* V% c7 h3 GMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. Q4 D: b% R( e, F4 ]
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( c  \( V5 `" C) g% r** Set the serializers, Currently only one serializer is set as
# S0 \4 \- G8 I; a** transmitter and one serializer as receiver.* U. `* Y3 P- d; p2 o9 [( M
*/
9 h. a" t: A0 T% e) e$ nMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 d- u6 Y4 p7 A; ]- q; s6 ?; \7 J
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*) E: F/ M3 s( Z
** Configure the McASP pins
6 ]0 a& b: x& Y; Z% N& W1 ^) Q1 q9 J** Input - Frame Sync, Clock and Serializer Rx
/ }4 z4 {7 \2 b+ a4 y3 w** Output - Serializer Tx is connected to the input of the codec
: }& P0 J  ~' g*/2 p% i- D9 u8 D- a6 W: I' o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: K- j  V" w, N; X  j0 R# w
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- T5 A8 I2 V) V- [' q4 K# `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 A: D% P$ T8 w
| MCASP_PIN_ACLKX
7 A; [: z+ b* E9 z' e! U/ p| MCASP_PIN_AHCLKX( E7 o7 A" r$ v) Y4 n
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
9 P! E# Z; @, L& I6 h$ yMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 W5 ^4 Y. {2 || MCASP_TX_CLKFAIL
4 b- e0 r) n0 C3 _% ?/ M| MCASP_TX_SYNCERROR; b8 D+ \: W) I9 Q
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
; I$ C& O, W1 M+ o, {/ g& y| MCASP_RX_CLKFAIL+ `, |5 g5 X, S) T% E( r* j+ }
| MCASP_RX_SYNCERROR
" S: e1 G& n# B+ n$ j' @| MCASP_RX_OVERRUN);$ ^; V6 _' M) z, n- j: V
}
static void I2SDataTxRxActivate(void)$ J6 G$ }1 J1 l( e9 {
{
, R2 o# m% h: k; y4 M; R9 ]& q/* Start the clocks */. j' t; b3 n+ I9 A6 a
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 M6 A1 d6 {2 x3 S9 |
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
0 G0 w6 Z0 m; a) y# z  g$ b3 _EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ ?1 D# z! i: Q
EDMA3_TRIG_MODE_EVENT);4 e/ p; U, s0 E( n  b2 y( q; w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , @& }; W5 H0 }+ `) o
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */( x. `1 ~! b) p2 y2 g
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# X9 A) ]9 H9 u5 E9 R  {8 u3 |
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" L; f% c- o; Q- r: z, [8 [0 zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */4 h* o* t9 Y; m+ l! B' l& \
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 v& T: Y4 s- i" IMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; o" |, p( E% D( i, k$ b% q}

& Z, J2 X2 O5 R0 U2 a
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

- i$ m3 r! g4 O




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