嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx," F4 k1 Q2 M0 o0 m, s5 D
input mcasp_ahclkx,
5 w: y; C& [$ oinput mcasp_aclkx,* D k3 a# A' B [' N
input axr0,' F+ A1 ]" g! X! X# u
, W6 o& Y& L4 f( A( ^output mcasp_afsr,
F4 C7 u1 G0 k! doutput mcasp_ahclkr,, y2 D) k; @9 y: j- b
output mcasp_aclkr,
3 k. K8 c4 z+ [9 ?output axr1,/ L2 h* D4 S$ d4 D, E% j3 p
assign mcasp_afsr = mcasp_afsx;, E+ K3 O- N; l6 R( s. P* L
assign mcasp_aclkr = mcasp_aclkx;* m! l7 q" z6 ?9 e; B( K5 X
assign mcasp_ahclkr = mcasp_ahclkx;
" q& v) |: O5 l/ Eassign axr1 = axr0;
, M; V" V5 w! S4 d! K7 K! U, u4 E) [5 b7 _! K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 L# \5 a# A }) V, I
static void McASPI2SConfigure(void)& J. a- i9 n7 L
{2 b* J0 j# t! m
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
' N7 f4 h3 o7 A. v4 LMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */' h4 ?% g% H! Y m9 x
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
" H' V: \1 T5 W4 ?McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
6 Y+ B9 n8 j8 Z! N( b' TMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( v# Z; F+ F, v* J9 W% g% d7 \MCASP_RX_MODE_DMA);! L3 G- E) F' E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 O0 M1 m8 Y* e5 H: x
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 Z5 [( ^; e; ]0 h+ Q& \3 ^5 s7 nMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% o( o2 x% n( @: I$ s8 xMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 ]$ F0 E g: y$ V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 z2 L+ L) r* T' g) p( i
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */) h* t8 Q' R, ^+ L$ c* v8 T6 D
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; K) G. Y$ B( u6 Q0 t5 J( R
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' y! a8 e1 O7 c* e+ @9 `McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% s, m& t0 ^! D7 g0 X- T* J7 u( F0x00, 0xFF);
/* configure the clock for transmitter */( q+ t: m0 j: Q2 V! Q, t/ T3 T
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 I6 c, i9 P) p. e5 ?3 cMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
; i6 n$ T* w1 _$ O% k2 a% IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% Q5 l; B' P- J
0x00, 0xFF);) X/ J: n( S0 ?9 U I b
3 g" K) }/ f3 _1 R9 F+ F
/* Enable synchronization of RX and TX sections */
8 \7 j. N, ^, Z/ P! jMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ F( H) a- c n# }/ `3 ^, IMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 M" X, l- T5 J& pMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
& L+ t# Y' y# b9 E! f, o7 D** Set the serializers, Currently only one serializer is set as9 S" }6 y8 p" U& m* |: {5 j1 Z
** transmitter and one serializer as receiver.2 S- @ _1 m( E* W
*/
3 N8 L6 E) U: X; p5 EMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 [, E" e: q. `1 f* ~# FMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
7 {# C5 Q) o: R; N2 \** Configure the McASP pins
" n+ \* j* f3 E* ]; P9 W: g** Input - Frame Sync, Clock and Serializer Rx' a; G$ P8 Z$ O6 ]2 p! L0 ~
** Output - Serializer Tx is connected to the input of the codec 4 T9 I c+ }* H: E' R1 W
*/- [8 V9 {% N9 C/ j$ k
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 a. _* G; a" [$ F% H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ F2 b( s4 p) F3 U5 @McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" m+ D6 ?: b+ H
| MCASP_PIN_ACLKX
( d3 b: m2 s6 D2 ^| MCASP_PIN_AHCLKX* D! V' _6 y% i2 K; a* ]7 |6 |) k
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */4 y, q/ R9 B5 L: u( Z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / ^3 I7 x* S# ~$ |/ G2 X U) k a+ ^
| MCASP_TX_CLKFAIL # J; x) n" G. s6 S( \/ O* T
| MCASP_TX_SYNCERROR9 r7 _/ Z7 U* U- X/ {5 v
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 H8 A; R. B8 O, \$ A4 f' [% ^| MCASP_RX_CLKFAIL
5 `8 Q8 F7 [/ H) @8 _7 O8 B4 l| MCASP_RX_SYNCERROR C" [8 s+ a8 z0 O. m& ~
| MCASP_RX_OVERRUN);5 M; [& C$ |) j. G" G A
}
static void I2SDataTxRxActivate(void)% ?) Y" I8 I: f O
{
% O' C; ]2 f0 e* ^' L/* Start the clocks */
& p1 H# @2 B4 B5 yMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ D/ \8 e% t/ Z/ ~0 v8 m9 K/ rMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */6 P) L+ p3 ^7 I% {4 M# d$ z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 z& e" W. i- J" G
EDMA3_TRIG_MODE_EVENT);
0 I6 T! n" N0 a) `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ w7 a! V0 e1 [$ {; [EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */# d8 g) D# A, R$ L& K }9 T
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" \; |" S5 O7 y( uMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
. R3 [7 G8 |# y$ X0 v$ X* }while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
# ~1 V& K1 u/ h( c& D2 D: M) L3 ^McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 f1 s8 f b3 u0 k) y1 [7 D; U3 G) YMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);" p, u2 M+ B" _; f8 o2 P
}
$ R, z& m) l$ {* [+ T" K; y/ q请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
C i/ K% l1 {, _8 D) N4 O
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |