嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
5 i. X' f! A* O3 |$ Kinput mcasp_ahclkx,
3 G) E- w0 S0 r8 m5 g" finput mcasp_aclkx,) H# {( D3 r0 V. L* S. V
input axr0,
3 l; l% u+ _# m; r7 {# u7 N8 [& F9 d2 g6 s6 S' G5 Z
output mcasp_afsr,
2 y' f: u: [# v6 Y$ A) R' t$ Foutput mcasp_ahclkr,
6 w! d3 j& E# g+ g* `5 S, i0 `output mcasp_aclkr,! `0 e$ W6 S) i% l
output axr1,
) O+ u0 J1 p4 O) n- Q8 u
assign mcasp_afsr = mcasp_afsx;& h9 H+ W2 a' u( m& e1 g3 }" l% O/ g
assign mcasp_aclkr = mcasp_aclkx;' M. I, F2 S+ S0 j
assign mcasp_ahclkr = mcasp_ahclkx;" }3 r2 u' }0 g+ b5 t
assign axr1 = axr0;
! `# Q9 b8 F& t6 z% F
% {1 Y4 { ] \, Z: {# {9 W) G7 F* R6 l
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! v D( T6 v) k6 S6 rstatic void McASPI2SConfigure(void)0 L2 F6 K' P0 F1 g
{8 ?/ t. D( X6 \$ \
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
% ^3 t- p; u% s4 @( UMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
5 j& y/ m! K WMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, E2 E8 L$ d4 X. _5 F1 A- c% x
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */* n- U* K4 f& Y9 c
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% L) s7 Z3 w: s* U
MCASP_RX_MODE_DMA);
& D' t+ e3 A% JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 ]6 d( V) D+ t* Y. Q. D& b* SMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 N, Z8 ^9 i' S" M* G! `McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
d3 [, ?8 n' b# K+ YMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, ~; x: n+ }" Y8 I5 p7 y: N. a
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * p: n/ D; i2 c& G
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
* V% ^9 D& y* \7 O: {McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: p/ p1 s2 d q/ I( f& K- T( Q% F0 \McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& I" \" r: \- }: JMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 {* f% a# j# a8 M! `; H0x00, 0xFF);
/* configure the clock for transmitter */
, n' \0 N9 {# I0 I5 @+ FMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: t9 |: L: s _0 B: X: AMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) {2 b! F- Z: g# g# x; U0 m$ XMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 t' @3 ~. l) p8 t0x00, 0xFF);/ H( N/ F, Z; A3 W0 ?! K3 }% m
% |2 v0 M0 g! M4 |/* Enable synchronization of RX and TX sections */
9 k2 }2 ^2 \& GMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ C/ M H- A% S2 Q5 Z2 y0 EMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. H/ V% I( ]8 s* n) Z2 HMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
M; s5 U0 {1 n y' h0 w** Set the serializers, Currently only one serializer is set as
( l# N+ x4 \* N, K$ x" p** transmitter and one serializer as receiver.
$ g5 H' e l5 G# ~*/
4 I6 r: N0 W0 x& GMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ c! H, A! |# n mMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
- ^; }! e8 P! i. [( j' m** Configure the McASP pins
, V! t) `; x, i7 {** Input - Frame Sync, Clock and Serializer Rx! `% w9 h+ y5 c7 @9 G
** Output - Serializer Tx is connected to the input of the codec 0 o) t3 K6 a' L6 Y- P+ G; s
*/$ z3 B) I# k" U# y/ d3 K1 P. v
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! B8 a( R& ?2 r4 y/ k0 SMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ d) P# s* g( ]
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 Q. I! Q; h2 X+ ?) `| MCASP_PIN_ACLKX4 Z B7 G0 {+ p
| MCASP_PIN_AHCLKX
1 B n, e$ s1 O$ m) ] U+ L| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */# F& F& a9 b- S* t N
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 1 }7 I m6 \1 u
| MCASP_TX_CLKFAIL
* P8 r. O# \/ I4 ?| MCASP_TX_SYNCERROR
y, j9 i0 R- T| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 7 j/ O/ v0 Z% i5 d8 X- F
| MCASP_RX_CLKFAIL D8 D" ]- p, S( O- L- Z7 A
| MCASP_RX_SYNCERROR
- w3 a# f! M) T4 z" ?5 u9 q/ J3 m| MCASP_RX_OVERRUN);
) s [+ e$ K! ?6 v}
static void I2SDataTxRxActivate(void)
" B$ d# I9 G" m& F F/ I/ u{
* d" F& [& `! R; f5 {1 W4 p/* Start the clocks */3 y1 t0 i8 R" t s: Y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);/ o4 E" \8 v- r( }8 I# k
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
/ S7 m1 R$ w4 c0 e$ YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 g) o5 {% ?: s6 j% Z
EDMA3_TRIG_MODE_EVENT);! l" Z$ X8 o. L% q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- E& {, F5 u5 u R* \! T7 rEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */6 x" b, z+ Q/ C/ T4 W
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 x2 I3 R) a$ M; U
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */$ y3 n# E) z6 ]
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
% K* R# y' K0 S' l- X6 OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 Z. F% Z% F/ V% S! nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& y9 l* X# n" V) ~" O6 v}
5 O; A4 l7 B/ @; Y% c3 X- j* L请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 d) i+ P. z% u! K7 }( E( l
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |