嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,' A! Q/ q0 N( H. j- N) {
input mcasp_ahclkx,
- n6 W$ G8 b8 Cinput mcasp_aclkx,
" E Z( ]6 ^* l8 s/ ^9 zinput axr0,! [- Y& A0 k: ^
6 G" \9 I7 j0 N' p( P% P0 Y
output mcasp_afsr,
- g5 E* g5 R2 L" t( |2 M: T8 Toutput mcasp_ahclkr,
e5 P3 `. p$ X# X6 v4 i! voutput mcasp_aclkr,
: Q; }2 b5 v+ C/ i: r7 a' Houtput axr1,
9 T8 i2 _* L6 p3 i% _
assign mcasp_afsr = mcasp_afsx;8 o8 W( W) @3 a9 H8 |
assign mcasp_aclkr = mcasp_aclkx;
- O+ E* p) V$ D& u- Q& M7 zassign mcasp_ahclkr = mcasp_ahclkx;: I2 |+ A8 G, Z, t0 O
assign axr1 = axr0;
s7 y0 E2 L: m4 v5 Q7 V4 s
) R5 i5 z$ S) H在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) E$ b6 E- E( F9 a) | W8 p
static void McASPI2SConfigure(void)
: J# F+ z% w7 a& ~{# u' G j. h4 l1 a) i( z. A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);* d" H$ P4 ~, w4 ?( G& h
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* g9 ]1 l$ j$ o3 Z# R u. F3 _McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; U% ~# b- s6 O# \: w
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */4 l1 B% P# ]0 U) J0 U
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" S' T) Z. V' ?9 M$ JMCASP_RX_MODE_DMA);
: w2 _. F3 b3 k3 x. CMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 r: N' H3 n! C8 @1 F
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ Y' c8 ?: B& S7 Y3 CMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) R- O" t- Z4 A7 I& S# M, |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 u% o* Q2 s9 @3 X* g+ r
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ L9 `' E( z) Z) t. c# Z+ HMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */" b- A$ ]$ v1 [- X$ v
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! H; A* l1 g: k. T3 Q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 y2 c) @ q3 h8 @
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& S. u4 i" P$ t( m' J7 \
0x00, 0xFF);
/* configure the clock for transmitter */
( }! r$ W, D4 |6 `. n4 oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 Q$ O; x6 U' e5 v9 F% f% KMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( Z) c; h( [# i7 P9 L$ c) MMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 `+ {" Y+ w' C* W
0x00, 0xFF);
" M: A* J3 _( @' S
C# f, E* G, V2 J9 n2 Y/* Enable synchronization of RX and TX sections */
D, u- q# o4 C, iMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
# K6 y# h/ {' P8 w) @0 R" {McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: i' b$ h" q, z: P0 @( ]/ {$ X& E5 ~# hMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( U& I, w! X" D! i( H# F3 o7 B** Set the serializers, Currently only one serializer is set as
0 E+ V2 Z% ] D5 A* v** transmitter and one serializer as receiver.2 {) Z+ S7 q! I7 w6 d2 V! V
*/
1 `* A6 j0 v2 i* |$ T* iMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ D7 j) T1 K0 \/ Y% rMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
9 E) ]# d5 b3 {1 o& i+ S. E! g$ s** Configure the McASP pins / z ^4 ^4 i% t0 F3 O% U
** Input - Frame Sync, Clock and Serializer Rx% }) r _' B8 c5 Z* ^" [
** Output - Serializer Tx is connected to the input of the codec ) V& P! b9 x. U e5 [0 e
*/) }8 {! `* D9 R8 L1 e8 m
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" ?7 H7 l* q, q9 ^McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& }/ U7 {- w$ i {3 u. v7 V
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: t, C8 D4 L6 G! ?+ b
| MCASP_PIN_ACLKX) o; D: \5 W1 _0 K2 m
| MCASP_PIN_AHCLKX
. ~8 p- U v- H4 N2 s( R* T4 m| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */3 {' T7 x* R8 X+ \ h: h8 q% Q7 r* T1 D
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) t# g7 E2 E% R
| MCASP_TX_CLKFAIL
' v& |$ G, Z& U. F| MCASP_TX_SYNCERROR1 H( l- Z5 m9 I# m
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& {) ?+ U6 w4 h0 [1 }+ E6 o| MCASP_RX_CLKFAIL" o5 c2 |" t7 {9 a9 P4 X# {
| MCASP_RX_SYNCERROR & _$ O* p8 \' E) b
| MCASP_RX_OVERRUN);
5 _6 T e4 o0 j' y+ R}
static void I2SDataTxRxActivate(void)* {2 ~: ?4 t% U5 j
{
7 \; Q7 S A0 D0 Z' I5 r' s/* Start the clocks */
; i/ X6 \, L h5 E2 X! _3 HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 t( R2 I) z' q9 o( m( U; JMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
- x( O% x) E4 R; MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" j5 k0 G) m8 s9 iEDMA3_TRIG_MODE_EVENT);! K3 l# m, b8 P$ W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
1 ?$ W+ f' h5 I. L& ^- T% iEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */! `& I$ F3 _* k, `- N
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 p- @+ N0 m# A
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
: P3 K9 e. [! \; J# wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */5 Q7 h% o+ |6 D7 {! p
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 p w4 }+ m! s! k
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" i0 L4 P }; j* i( W) V* z}
& t& m" Y- c8 l; j请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 `- C& b! ^8 A: p$ c3 B
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |