嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,4 D5 |" ]: e1 U6 Y
input mcasp_ahclkx,
9 r% }* K. q' x$ B. V+ k/ Zinput mcasp_aclkx,
m/ Z/ Y0 ^9 A3 h4 ^% vinput axr0,+ {7 M( C9 H+ j( k
" m5 G" d; K7 W; @. m7 X6 L. H' G
output mcasp_afsr,
) y* p3 `9 B( [% L. |& G/ houtput mcasp_ahclkr,
+ R$ M( b$ g' X& w7 ?output mcasp_aclkr,2 E p- f# n) o6 c: ^" T' L+ m. M
output axr1,* J, W9 \( _: F
assign mcasp_afsr = mcasp_afsx;5 d1 P2 k, L: K! `1 a [$ y3 ^) M
assign mcasp_aclkr = mcasp_aclkx;
. b6 F7 c* O3 _assign mcasp_ahclkr = mcasp_ahclkx;6 h$ H0 O' v+ M7 R, ~+ K& u
assign axr1 = axr0;
+ U6 Z5 T. D+ A( S( D
6 i; s: ?# d' a1 f1 X7 |2 r1 T/ O
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" o* F! B5 e3 C9 Z! \static void McASPI2SConfigure(void): F+ x8 h* h, v) U8 ?
{- k! n% N8 ^! ]) J# x( y; }
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- c, ?7 v6 Y- N/ i: s1 \- h' hMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */* |8 q! {" b( P$ q3 ]" J% T+ J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 Q$ W3 v/ K/ G5 V8 ^0 FMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */) E. E/ J4 r& R4 i1 n* |% J4 Y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 n* b; w# a) \/ ]# c% S
MCASP_RX_MODE_DMA);
8 V1 Z1 y5 X8 N+ w5 G/ g4 |2 i0 a$ WMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% i# I# @. u2 }# ~( W1 ]$ h4 }) ` U# \
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 q( @2 \1 ]- A9 ]1 x9 @& {McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 l, k. S- o$ M9 g+ t
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 W! Z k) } H6 C6 P
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ' I5 v$ I( l2 z' @3 h3 `
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
# E: M8 s( c: I. ] J9 O3 @2 I wMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( U1 D' c/ V$ m2 y; o# D
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% o6 f s4 {$ \# t5 ~, JMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 ~0 M2 f+ z, d b' e& c. ?6 O
0x00, 0xFF);
/* configure the clock for transmitter */! x+ Y$ P3 Q( k p n X' K+ }% z9 D
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. i$ u. _4 S8 c; m: {' A1 n. q" O* c
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ i+ p# _- f" I6 eMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) J1 i/ Y3 `* C$ l- D" n
0x00, 0xFF);: b$ t: j" F* v! g" ?
/ a$ X8 x/ I2 F) Y; o. {- i
/* Enable synchronization of RX and TX sections */
$ Q% \ J# ?, h! AMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ H& |3 s* G- o$ i2 y6 {6 y% A1 UMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; j# P( j* t4 [0 [, V4 R
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
: A; S. V8 k! S9 Q a# \# p8 o** Set the serializers, Currently only one serializer is set as
/ `, ]; ^1 f# x** transmitter and one serializer as receiver.8 ?3 h% `7 \9 P. y7 R
*/
9 L3 s0 Q8 b$ EMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, d2 b# t# e8 q1 Q3 X4 |/ z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
+ C/ y* h3 h/ Q; x8 y" I! _# d1 r** Configure the McASP pins
8 A6 P% \3 f4 c4 ?" s; `- p** Input - Frame Sync, Clock and Serializer Rx5 S) _$ h7 i3 g+ a2 {/ u; W8 Q9 ^! u
** Output - Serializer Tx is connected to the input of the codec 9 F6 d, x4 v |
*/9 L Q: r5 G: a3 u; H, E
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 _0 p4 o( M! d" T/ J) f. CMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
" p$ Y$ q0 Q. P }McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& W: L4 ?) B, F' z0 {| MCASP_PIN_ACLKX( G' @$ B7 ^ h: M1 X8 n
| MCASP_PIN_AHCLKX
# R* I2 {9 i0 ~! }$ o" A| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% ]9 S2 F$ ^) r5 t8 m
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 p) S( s+ o {/ ]. y! I
| MCASP_TX_CLKFAIL $ {/ m# g! y1 z: u! X0 t' E
| MCASP_TX_SYNCERROR) x9 ?% O- A# ?4 U# c
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, w% p4 p0 ? |; Z+ m| MCASP_RX_CLKFAIL
3 }- e0 A* T5 h, }, A| MCASP_RX_SYNCERROR 0 N" T5 s; h! C% S( `1 q- J V& o
| MCASP_RX_OVERRUN);
9 I- o' T0 }+ ?4 B& e$ u}
static void I2SDataTxRxActivate(void)
+ e5 M3 ^+ R. D0 h8 [+ Q4 R' D{
- B ]! v; `: Z/* Start the clocks */
* |$ m9 o7 T0 N" \McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: }6 s% [) j+ {7 G) D& P5 |
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
) ?, f" ~* H) N+ n1 l% cEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 J- { ~" m, k, l) ^EDMA3_TRIG_MODE_EVENT);) R, `4 A+ j7 l$ A1 S
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % `0 K* ^/ u: A4 Q) ]& f) V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */$ R, m7 F# ^ T* q, x A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. _' w( O/ K6 J0 u. K% u3 H) H
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */. G8 C; p2 x% Q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. s- S5 g" Z. O# V' XMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- A! p- f) z2 s1 y3 C( qMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% [( a, e8 E8 z; |3 W}
6 @5 y& f% v' U" W) U' a# e请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 f' D q; N0 h3 {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |