嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& H  b# b  D4 S8 Qinput mcasp_ahclkx,1 }3 G; c4 m7 [7 ?6 N
input mcasp_aclkx,
; `$ p. Q8 h. g5 x# {" ]& |input axr0,
( V) U! r& a, L1 m: a
2 L  `9 A# l, k; J( Joutput mcasp_afsr,
9 F6 e% r) d% s+ ^& W& x) youtput mcasp_ahclkr,' e- ?4 i6 W6 R) v6 Y, G/ H7 e
output mcasp_aclkr,
" x) S- K% C5 @3 J( \4 routput axr1,' D0 ?/ w; I7 a- I* W! i% }) v" K
assign mcasp_afsr = mcasp_afsx;# B# K7 z# ?- p+ {. }
assign mcasp_aclkr = mcasp_aclkx;6 o- K, a  }7 u$ W: g+ m
assign mcasp_ahclkr = mcasp_ahclkx;2 g& s7 _4 o4 H4 m
assign axr1 = axr0;
+ T, a! R7 p% `% M
- J% d' N2 b2 _8 W
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

, F/ C4 I, q/ D( N( @8 N3 @/ [, B
static void McASPI2SConfigure(void)2 F/ p1 |6 n+ s( E
{
- d5 C9 R2 B0 W( q; H& A, |1 [McASPRxReset(SOC_MCASP_0_CTRL_REGS);
% B% z3 J  P/ w; W8 zMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */5 E: O2 O# m3 _0 f
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* R( C- M, C6 s" y) ^& v9 {2 z/ B
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */, }2 [  H  J0 L1 [
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 l( Y  y1 A9 M2 v7 NMCASP_RX_MODE_DMA);
& @  m+ {  B# W2 R2 q; c+ HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% v% ]. ^. j# g, j, N& RMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ ]( J, Y, D- aMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - a' q$ c1 m. t0 V1 f
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ a! o6 z2 t7 OMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + e& b0 K/ J, m" T! `* h$ q! b
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */$ K2 X6 }; I% C' @5 G) R# F
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- Z2 @6 j7 ^0 q$ H- g, y4 G! O) d
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 w; ~0 ]. @# A  ^/ u  n& LMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' ~* n" t5 n$ D$ |& Y; ~/ v# b0x00, 0xFF);
/* configure the clock for transmitter */! f) X- A  l' v7 r# E# P9 F: c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 B! T9 _8 ]$ D* YMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) u5 n7 ~$ V+ H; LMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, M/ H! x3 d' B, c2 v  ?0x00, 0xFF);0 d: c, q3 }* r7 D# ]" s- s7 V

, _' }# n+ K  M  M, ^4 s+ c$ h/* Enable synchronization of RX and TX sections */ - I, t/ p- F8 v
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */. [9 O8 z+ c1 P1 J
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 c5 x5 ^( _4 b0 R3 _McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
' R. s0 I/ p- F" w$ p* T** Set the serializers, Currently only one serializer is set as
5 E- z; U5 `* c$ L7 X' u$ j# t% \/ |** transmitter and one serializer as receiver.# m) e( ^9 {& ~% s( K' x9 y, x
*/( S; m$ [) d, S0 K" Q' _
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ i& [/ }0 `* }0 D) [- ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*$ W. t" H; I) a7 q
** Configure the McASP pins
1 @0 e1 D4 Z7 M( z** Input - Frame Sync, Clock and Serializer Rx
! C2 B$ O" m( x5 e# H** Output - Serializer Tx is connected to the input of the codec 1 ?% y. E( _. M
*/% P. q3 m- j( }+ U" z, B) g8 P
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ ?" ^1 \7 ?$ x# V# x6 C  ~McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% k& ^9 v8 M$ a- b3 l# B4 {McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 G# M  K# S1 X7 M| MCASP_PIN_ACLKX4 \4 B9 g4 M. @  M
| MCASP_PIN_AHCLKX
, z' M3 l8 m# \' w& b$ g1 N  o. r| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% i0 F" H7 b4 E) H% ~3 `1 {
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 e" U: i2 x' E/ d| MCASP_TX_CLKFAIL - l0 r# g) C- _; c4 W# L
| MCASP_TX_SYNCERROR, {9 J5 k8 I/ B0 `( j% ^6 e- F8 f
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ n, p+ I4 n) _& i% B; K4 _| MCASP_RX_CLKFAIL$ ^+ s* A  C3 [/ v  C' I
| MCASP_RX_SYNCERROR
" C+ c4 W7 H* f% g| MCASP_RX_OVERRUN);% h! h. j( K* c# l. q; w
}
static void I2SDataTxRxActivate(void)
' a+ f, J, J) B4 F{: b+ v4 d) l( h- j/ l
/* Start the clocks */
) T7 |% J& j% t" G8 iMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 ?' J1 v3 U6 c- GMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */* ]' O/ U, [0 i! A1 k7 G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
. W( {* }/ A  H0 ZEDMA3_TRIG_MODE_EVENT);
9 T9 K* R  C) S9 d9 tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 |3 @2 ~# _* Z  tEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */0 J; N$ s8 v! }" C2 e$ ?: `- j' v# \
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 Y. d  E# U# h$ s( v( q$ n- {# AMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
$ w% I' w5 W+ l* [/ M3 zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
  z# d% J: l2 o+ ?9 vMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 H6 a" L: \' h
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* G* W* P, s/ n' e3 p8 h}

7 E' [0 n  Q; Y& R
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ I- P6 t6 H9 K! b4 e5 \





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