嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
$ A4 P' N X( Q8 |; {% @0 {2 Kinput mcasp_ahclkx,3 c8 X% r7 t$ I1 _' C
input mcasp_aclkx,
& K7 ?, V2 u3 K7 j( Einput axr0,3 A! l. l0 j( T; X/ R
% b z$ _8 D% K' L$ n3 ~. N6 @output mcasp_afsr,
2 g& ~- e6 t+ Z Ioutput mcasp_ahclkr,3 C3 z8 `2 O3 O
output mcasp_aclkr,
$ F0 D" z7 ^ ]0 W3 aoutput axr1,; r: h T! q) M4 |& {, x% G
assign mcasp_afsr = mcasp_afsx;$ e9 l0 s7 C& w K; B
assign mcasp_aclkr = mcasp_aclkx;! F; n- G, e) \- e- l) ~$ R
assign mcasp_ahclkr = mcasp_ahclkx;. j* r) v7 v' p8 o0 ]# F3 ^: y6 d( g
assign axr1 = axr0;
8 Y: D6 M' W1 }2 j7 N
: k& O' s! i5 |, l$ S! `7 f
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ \! |: E' U4 B
static void McASPI2SConfigure(void)+ e( X) G/ h, N+ Q' N
{
6 R9 @, R8 Y I0 n- u, yMcASPRxReset(SOC_MCASP_0_CTRL_REGS);) J) S, A& y6 C/ G, w5 {8 F
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* o! d: S2 a$ u) EMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
4 ^( S* q7 {+ ]% {; r; }) m BMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */. ^6 z2 X0 q: w0 ?3 F, r
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 y3 o, [* j. k% s$ cMCASP_RX_MODE_DMA);
% D/ t" M% X" F2 g G5 T% GMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: _# M0 k3 n& M: l
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; h8 a8 K) g% wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, . {4 h! b5 { m
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; ?- _4 O' ~: m8 W, L- H1 ]; i/ HMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 R: u; m& }/ g3 m* v$ \MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
( l0 D: i% j c( tMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 {( k' m; c4 ~1 d- c& X
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 r. k. m& Y# UMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 m% M) B% q# {0 P( P
0x00, 0xFF);
/* configure the clock for transmitter */
4 y. k5 y$ N" A4 O+ \McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 C: O# u; f9 `! E) ?McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% h3 ?4 t) U0 r9 q' a& uMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. [- j2 q5 ^0 ~8 A9 C
0x00, 0xFF);: y1 i7 S& \2 z H# E" s) A
0 P- c9 b( R/ g: f: f
/* Enable synchronization of RX and TX sections */ z: o" }9 B, O2 O( `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 k7 }/ t+ x+ X. H3 z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& ^# ^: }' M3 ^McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*+ H9 Y! f( ~( q- O: ]& r8 Z
** Set the serializers, Currently only one serializer is set as7 S: i0 ` Y9 P1 s2 B
** transmitter and one serializer as receiver.
6 r8 }& j- [5 d8 k5 Z*/
6 ^4 z5 S4 y. f4 l% P* LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);3 b6 s: h' h) X7 R6 ]
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
2 F4 ?( V, g: E' d- [) N* l+ U** Configure the McASP pins
) a o( O- U W1 p' U! u9 w8 Z** Input - Frame Sync, Clock and Serializer Rx
: H G( z7 A1 y3 W** Output - Serializer Tx is connected to the input of the codec
9 l9 G X* S0 F: b1 i$ N+ B*/" m# ? S) e, F! c( e2 Q2 u
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- w2 M% c9 R4 h& s' u) [8 gMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
/ M0 H( w/ G/ N0 T: U) OMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ H/ [* }* |% C- m5 K) J* y/ K" f$ R| MCASP_PIN_ACLKX/ Y9 t+ O& n0 R1 W
| MCASP_PIN_AHCLKX; S t2 m) X' Q7 Y% F
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
. d. p% k" M* `4 A, I, [# IMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + X# d& B [, Z C) i, Z
| MCASP_TX_CLKFAIL
. g- B$ R0 T( l7 ]| MCASP_TX_SYNCERROR' U2 x$ m9 f5 ]3 v
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR E: y2 @! G) X) n# q8 v0 W" u/ q
| MCASP_RX_CLKFAIL4 q6 z N! f# ?# a1 Y; E; Y
| MCASP_RX_SYNCERROR + j" s" e; u/ j
| MCASP_RX_OVERRUN);+ T" I, Q8 \# k p- K; |
}
static void I2SDataTxRxActivate(void)7 O( j% Y' {( Q1 N% a
{
& Q" A5 i/ }+ C! q; S/* Start the clocks */
2 v, [0 e5 K) p r9 \3 bMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# O! x% b* Y6 A: B' Y- P6 S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */+ p+ y* n M& f& B/ |% L- M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 P9 m/ H; R& h/ K* s7 ]EDMA3_TRIG_MODE_EVENT);- X9 V* T; H/ d* C: ~
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 _# Q* E( ^3 A2 ^2 P& Y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
2 K E. d+ M2 t1 IMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);( P) F0 [( \! }
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */& h) b6 ^8 Q9 `3 `, T9 V/ R3 \
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */8 ]) F! e# d$ Q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, p: f- {) [# X" i: w- G: P5 SMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% a" N; J, O) S. _# [1 Q! _, i% `
}
, p/ ~( S6 k- O# J! R F请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% g( q, ]* t; o2 R) e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |