嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,$ w% j: a7 h$ l. I
input mcasp_ahclkx,
- i5 s$ O5 F9 l+ ~! R1 ?9 Ginput mcasp_aclkx,; c$ v. G ?& m l4 p; _
input axr0,
. g% ^; h7 R& _' x
$ R$ `( C9 }+ _( `/ X7 |1 E8 m" soutput mcasp_afsr,5 Q, [6 H% q: m* f5 \
output mcasp_ahclkr,
* D( M2 u' C% K' r$ L9 E9 youtput mcasp_aclkr,
! j! ~+ }" M# }output axr1,
0 q* p2 v# l& o2 I, y# D% n
assign mcasp_afsr = mcasp_afsx;
' R% L; W9 m- @3 A1 W# |) jassign mcasp_aclkr = mcasp_aclkx;$ r& z! Z, c5 |# C" T# K7 J
assign mcasp_ahclkr = mcasp_ahclkx;
$ q) B" W! L6 b! v5 r. T! bassign axr1 = axr0;
" z" j q! p" e2 v" R' u# W/ @1 |/ k: x! Q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" B' y1 [% X% m) ~4 D) q t
static void McASPI2SConfigure(void)
; x2 o: {( l" d* j/ ]{
Q7 _" C8 L. z! \McASPRxReset(SOC_MCASP_0_CTRL_REGS);- j% o& i8 j& I$ E2 g' @* a3 H2 v5 U$ D
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */6 S) n6 N8 A; h$ Q/ D6 R1 y1 p! u
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
. w: L* U Y% b6 M) o eMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */- M. R) j7 J; V( U/ l
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. W7 V# L: ~6 q- }! I. x; {* e1 b
MCASP_RX_MODE_DMA);
0 E) \1 T) p3 d u$ yMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 g0 a' Q4 C% s3 lMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */% N; J) q/ S) i% \! S: F5 t9 K5 i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" f# }8 s( E: f; ^MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
9 m' E T' w" L1 @+ \McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 ?4 j0 H0 G7 H% W0 L
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
0 ]1 j' O3 B2 w0 r' CMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 _3 Z; V4 [1 W/ D
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & N3 F2 e! {) ^1 A
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) v; Z$ h; r1 e3 N. i- ~
0x00, 0xFF);
/* configure the clock for transmitter */
3 p+ j' D" G# i4 c; I, F/ RMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
O1 D* q# q" _! ? bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; T& B `3 O5 y' m! E
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, u4 F' j) A8 |/ o+ G$ Q! ^8 L0x00, 0xFF);7 p( W F; |. ~* L% h( A( |
# F" }) z+ V* p/* Enable synchronization of RX and TX sections */
: m& C4 j" U, ?" }7 iMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */% E9 O$ a$ y3 D8 i3 P# W) m
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 b" R# @( n) A* `+ L
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*3 ?& @" T$ F( h# I- R4 O& l& c
** Set the serializers, Currently only one serializer is set as6 T1 l H3 Z a& D. q
** transmitter and one serializer as receiver.
1 {* |! Y8 L' o# n/ z*/- X9 S3 p4 C2 h: J: t
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: R- m! `0 k) NMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*- P: h0 ?0 o* R
** Configure the McASP pins
, L/ N o% ~3 V0 s8 m8 i** Input - Frame Sync, Clock and Serializer Rx
7 o9 l( l9 j `** Output - Serializer Tx is connected to the input of the codec
& _5 X! J- U& v: N1 f*/
+ g0 B. D, r: q" J+ hMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ `1 |; x+ L1 p0 j
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, p* m) Q& i0 B9 c. _$ JMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" c: r) `4 _, y* L8 ^( T| MCASP_PIN_ACLKX
7 V9 f. Y1 u% q: z. |- r| MCASP_PIN_AHCLKX4 P' K& A5 `& X/ R! T9 T
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
9 a( z4 U8 ?" wMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 a% H; g& X9 T; |: {$ Y" t
| MCASP_TX_CLKFAIL . w/ |9 _, U4 z+ X' ~, y7 `
| MCASP_TX_SYNCERROR& d5 X$ r5 W& N* C! y) U( V
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. I" [/ Q8 x( P. s, ^| MCASP_RX_CLKFAIL) H# ~7 S. i4 ~
| MCASP_RX_SYNCERROR
% d( P0 I1 d+ `9 H5 U4 b* K| MCASP_RX_OVERRUN);
# f% C) q4 e. u! ?6 t6 y' a; f}
static void I2SDataTxRxActivate(void)* z* S/ B- ]5 B3 Y* p" }( N7 n
{
@) z3 v' [4 U/* Start the clocks */- e% _( f7 p+ z
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' y" l& ~8 j3 e. h: bMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */' v2 y$ L+ `/ s' D' p. N" X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, t; t ]5 T( f( @EDMA3_TRIG_MODE_EVENT);; O( U0 @, q) v8 u/ J
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / E- e; g' o3 m+ h! j
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */8 l- R- h* o4 j: h# Z
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# G/ _0 L+ T- d' r2 x' b9 p6 I
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" G$ X) _6 w; ywhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
: K( i) H4 ]- [( IMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- h6 _. s' {+ vMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% e$ u7 N+ n: O# y' s/ l}
- E" G& O6 Y) s& D t请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 ~; ^3 S" }" X( ], ? w' G
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |