嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,4 F3 M3 c) l7 h% g
input mcasp_ahclkx,
) O. Q+ O9 n0 P" ~7 qinput mcasp_aclkx,
5 K5 S+ H5 g {/ b( p3 l3 g7 F) Winput axr0,7 }6 q9 `3 p. n- X; ~" ]
+ H4 M& G7 g) x1 _! p; Uoutput mcasp_afsr,
$ q! \. F3 S8 L0 P% Boutput mcasp_ahclkr,4 ^ I9 d7 r0 k
output mcasp_aclkr,7 w1 @1 i8 Y- z3 S& c
output axr1,
" N) ` q* D# n2 r5 G3 Z" j5 R
assign mcasp_afsr = mcasp_afsx;$ W/ e4 a9 N3 E- |7 J
assign mcasp_aclkr = mcasp_aclkx;4 r1 S4 s) I! N: f, O+ q9 }6 E
assign mcasp_ahclkr = mcasp_ahclkx;2 r0 u' M8 Q8 ?) E) N
assign axr1 = axr0;
4 _' r& m4 ?( R8 p6 ?
8 A# S+ k4 Q. x6 J: ^; S
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
- r8 _ }2 d! |5 E
static void McASPI2SConfigure(void)4 D3 _$ i/ @/ k( E! q4 J
{1 ]1 Q% V" d! U& m
McASPRxReset(SOC_MCASP_0_CTRL_REGS);- w7 e. o, J8 C1 t/ R5 \
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
`- X0 |: v( H) x+ wMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
4 f/ I- f) c" W$ y0 E) L8 a' D% ^2 wMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
+ _7 A H$ [$ t: R) mMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ u( F g, n: |, ]4 x2 K4 r, v7 t
MCASP_RX_MODE_DMA);% L: W [* v8 K6 I7 X
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 |) Q F1 E2 rMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 F% J% e1 H9 b6 c& J0 g, yMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* G8 ^# O8 x* D# \! [MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; p/ B. U) V: V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ w: U1 e8 {. E# K/ CMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */9 L1 q# D9 J+ U1 E- X( t# h5 F$ H
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; ~0 N$ ^1 Z- u0 @& `5 I; @ YMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 U5 U& S: V* X+ d0 \; VMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 A; n) h" K& S
0x00, 0xFF);
/* configure the clock for transmitter */- `# H% D. F, X2 L9 k# e1 d% X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, W' X9 [; R; g5 z0 G, ?
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, @0 I# C4 K5 x$ u# CMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 V" y5 N; ?/ g$ d# A
0x00, 0xFF);
/ ?+ K" U" u0 ^3 f, _3 y# y1 C
1 d* d5 ^6 B! u; R9 a) C" i, q/* Enable synchronization of RX and TX sections */ . d, a/ D* g: `1 o$ l0 G8 c: K( j
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ `& f: j" f; E* d6 b! w; {0 pMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 i7 S' A* i' L
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
' k( E! a7 x5 o ~6 \** Set the serializers, Currently only one serializer is set as
3 W# e, c. f/ m/ j/ k. l** transmitter and one serializer as receiver.
5 d/ ^1 m. Q: z% m" ]*/
! k" T. d' @) c7 o; ~# Q# _! cMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 {; `" y, i, _5 AMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
3 H4 m: G# y+ F" g( _# ]** Configure the McASP pins + m8 L$ y. e- u% N
** Input - Frame Sync, Clock and Serializer Rx& i3 x# R$ l0 u
** Output - Serializer Tx is connected to the input of the codec
D& L0 y, ]# i/ |$ n*/
" P7 v2 V( P3 t5 l" s. yMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 D n5 ~* t/ b1 d
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));6 [! F2 C/ k* v' ~
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 _( y6 ~0 b1 P4 l| MCASP_PIN_ACLKX5 p! p3 x; o3 a5 x, i* `/ ~2 t1 [
| MCASP_PIN_AHCLKX# m9 S8 D. p* G$ C# D
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */. q- {0 h! Z7 P& ^. Z0 p
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# j' z0 f; Z% i2 g| MCASP_TX_CLKFAIL
0 Q/ ]5 m" W5 q8 `* U+ a* ~/ D6 i| MCASP_TX_SYNCERROR
; k; T0 {. p5 x. D| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * w% K( J8 A' U" _
| MCASP_RX_CLKFAIL
; g9 u6 q, }/ w7 e2 H8 r' [| MCASP_RX_SYNCERROR ; n' }) l: ?5 G( I
| MCASP_RX_OVERRUN);
" ?) O& \# K/ A0 d- N}
static void I2SDataTxRxActivate(void)8 o8 ]* @2 \* v1 ^ g+ ?- J
{! V8 A$ q# b( O1 M& ^8 H
/* Start the clocks */ u3 _) o+ y' R
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" u8 Y( d& |' `$ P' JMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */& U# G1 x- o/ [, X9 X+ O
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 v) R) x9 {5 \+ z% qEDMA3_TRIG_MODE_EVENT);
/ ?, d+ B7 ^. W9 f- _5 k1 VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, @6 Z; F9 @- u* M ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
# l% e% q, A, M, s m0 ?McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 I' F2 ]' y% e2 k8 z: |; N
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# I5 a8 U0 ~0 _' ~+ G6 x4 c# L) [
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */. ?7 Y9 r9 b1 n# ^' M) i
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ R. X7 v4 ^# J# X6 x# UMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 P# w9 l$ h" t5 }8 `) }" I2 R4 M, d- J7 C
}
2 A6 U: @' V9 m/ w# R8 s: l3 e请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* c5 B. [; ]! Z5 @4 A: w% ~* k
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |