嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& ?% M$ J6 d8 \' r# cinput mcasp_ahclkx,
# s8 G) c- P% Z# C; zinput mcasp_aclkx,% T. H+ c6 c% g+ S7 i
input axr0,! {. Y+ o: P5 e) ^1 ]+ S. C- e
* H$ |9 O( _0 g, f
output mcasp_afsr,, z5 q$ A. k* m
output mcasp_ahclkr,
. G' X8 ^. e) ^: {1 Houtput mcasp_aclkr,
r4 {; z! l0 ]output axr1,3 H/ Z- ?6 l8 J+ O) x. k! i. w0 R
assign mcasp_afsr = mcasp_afsx;
2 e( t2 K7 g- q( e1 E6 A1 @assign mcasp_aclkr = mcasp_aclkx;
+ O4 ?. @6 i# Kassign mcasp_ahclkr = mcasp_ahclkx;
$ P4 H4 b9 |# W2 m& l7 N5 b/ k$ } Qassign axr1 = axr0;
) W" ^6 c4 {2 ? x1 [' a
% o) s# b7 S7 s$ k6 c2 f
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( D" v+ W! D1 L+ Gstatic void McASPI2SConfigure(void)6 ]- z% b- W( g k
{( V) Z6 K# Q' u+ Y
McASPRxReset(SOC_MCASP_0_CTRL_REGS);, p; j- p: [* h
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
6 n* h. o1 H8 R. _* B. Y! eMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
$ N/ f& V- T7 j3 Q0 qMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
9 d3 ^2 }, x* a) C6 ZMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, H" B7 }" W/ x) D& L/ w/ F* n9 M
MCASP_RX_MODE_DMA);
' I9 o- s! j1 M' B, @McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. y7 y* Q# G1 L, c i" z/ LMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */: u" N/ E6 S r2 e H6 p
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' ` t6 S6 R3 F' Q
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. v* m# o# b! eMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' d% p l$ F: c5 l* _0 u2 xMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
8 |& E! G3 b8 W$ D/ O( O8 i0 R+ OMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; I/ M$ b6 \& S4 {# cMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
9 M `3 X0 g, G) QMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# b# @, I( R! x$ P1 h2 [
0x00, 0xFF);
/* configure the clock for transmitter */
2 @/ d: D! ? W. JMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 E; ]& n4 Y8 ?- ~. D. ?) u
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
8 E$ j( ]& P9 N) q" _9 S2 Z: KMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 n3 o$ X; Z/ }$ L) E
0x00, 0xFF);2 }6 d0 T- W2 ?7 v" C( e
3 J- b) u1 o8 Y! x& }1 L# d, ]2 c7 x/* Enable synchronization of RX and TX sections */ * F9 }* z) s5 o) G5 a
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ U3 V+ q$ R5 DMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 `7 q8 Y0 l! E2 X
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*- X( P- D3 m' [+ U* K0 i; o
** Set the serializers, Currently only one serializer is set as
- _2 |0 v* y! [7 P; Q** transmitter and one serializer as receiver.# {2 \) y; {) @/ [, M9 C7 D
*/
4 }5 c- [: W+ A# M, A+ w& A1 i: KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. n" q" X$ Q2 y# M/ y8 g3 [3 A! k, j
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 o5 x. C! f- Z$ C8 } }. }
** Configure the McASP pins
- n* M, c6 }- J! _** Input - Frame Sync, Clock and Serializer Rx
4 [) R5 U4 ? t( }( I( R# l7 u3 p** Output - Serializer Tx is connected to the input of the codec - j& ~8 n% Z" I
*/
# ^, t [2 [1 nMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! W. i. ?! E1 R& U5 K! L5 A0 Y. F
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 e9 v% C$ i8 P" oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' h3 i" _/ Z* k# Y# ]% E. w| MCASP_PIN_ACLKX
8 N( V( ?5 x3 C1 }# E| MCASP_PIN_AHCLKX3 L0 T; |( t4 p* G' n1 c4 J
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */( y. Z0 V$ O0 L1 g# O3 ^# E# \% I
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! N. w- k6 B+ ~; E" V7 R| MCASP_TX_CLKFAIL
9 X0 j3 k: b0 l1 ^- C| MCASP_TX_SYNCERROR$ q% y5 S1 z# X0 C) _
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # S/ I; ?% O7 M# S ~7 O4 g
| MCASP_RX_CLKFAIL7 q$ X3 K B& X% R: O1 O
| MCASP_RX_SYNCERROR
G( o- @3 v: ~- C# N% q| MCASP_RX_OVERRUN);
& p/ R* [) b5 o6 o8 z6 m9 \6 F}
static void I2SDataTxRxActivate(void)9 ` z4 S0 I a7 M7 G
{
' T. ~/ Q3 f" I( ~4 H3 y5 V! G* V/* Start the clocks */- L0 K$ [. X. T; i) M# N" W
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 c+ k' p) k4 m: a+ g
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
. F! t7 F3 E9 E0 z6 y7 g$ xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 j) ~0 w( h: e# m" b( [( H4 \EDMA3_TRIG_MODE_EVENT);
2 @2 m# k% I& [8 P% s ]* p# k! }EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # o$ G: i* T& U- }) R8 _
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */8 _, N" _: ^ D4 w
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 ?5 ]1 I" h. T6 S* Q$ Z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */) j, l' y7 V+ `! D4 F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */8 R& k% n9 g6 K5 L
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' R" K" O; }% P- a }+ x+ A
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ H* h3 `9 S% b
}
/ c/ Q/ T+ x. p8 e: U请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 {% w) K4 ~0 D. ~( p
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |