嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
% ?5 r) Z1 L; Q( N/ c9 o! kinput mcasp_ahclkx,
2 Z; ^ d0 X( f' Cinput mcasp_aclkx,
9 Y9 c4 C- x! `/ G9 R+ J6 Dinput axr0,1 X( Q+ b" W1 [2 X! A9 r" z
1 k( n/ [6 x( J* b- [; ~
output mcasp_afsr,& e5 ^3 N: e/ E8 w9 g% n$ C; X, L
output mcasp_ahclkr,$ a/ H b* V, Q3 r7 [" P) E
output mcasp_aclkr,
4 m0 g. _6 _6 K" Q% woutput axr1,
3 Z! n/ N' q4 u1 Y1 X$ U
assign mcasp_afsr = mcasp_afsx; ?, a1 F$ o7 T4 V$ f6 V0 l
assign mcasp_aclkr = mcasp_aclkx;
8 ^2 D4 Z0 i8 f T4 k, \7 iassign mcasp_ahclkr = mcasp_ahclkx;
9 k, s( h5 V: Cassign axr1 = axr0;
+ }* x. X. ~8 W3 h, n1 T6 c# N
5 i" _/ L- w7 u! G* U在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: o2 _" G0 R4 A) e9 |static void McASPI2SConfigure(void)
( w+ _* S) G: p+ i7 P{
; h g7 l0 ^2 R+ {5 Y0 S; YMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
! c9 w; ?9 ~: I1 o- xMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
% ]6 |$ h- y8 Y. l/ k1 yMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" l5 a9 S# w2 B3 w
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
! M/ [2 _5 ~, w' M6 YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 P! C8 r2 N* ^; c2 W& n3 |& tMCASP_RX_MODE_DMA);- g+ g" y5 L: x4 y h: t' h: D
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ M2 K: K: ]. ~7 S5 E% [7 l
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */- P# U9 m Z! k9 @( S" N6 N" X
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* l( g& G; M5 ?, l6 o4 j0 IMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& ^/ M" k! U3 G: V0 D
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 B8 y, B' W, k+ @; K6 PMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */% o3 ?, N+ X" V
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 `2 p2 }$ J2 e) l) O" g& I
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' H% t& k8 {' gMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: I5 ?- r- i+ H4 k
0x00, 0xFF);
/* configure the clock for transmitter */
6 f( i0 J2 O, F! a( G/ jMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 ?) y0 J# N9 A. n# C7 W" U1 _. ?McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 ~2 V. Q5 g; K# I; K0 d6 nMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, d# Q9 j: n# S8 ~9 a4 U: p
0x00, 0xFF);
4 B5 u% b1 L, C0 ]. ?( a7 B. ^9 G+ `+ ?7 C: Z0 B1 Z
/* Enable synchronization of RX and TX sections */
0 a; M7 u& A6 b" x/ VMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */4 Z4 q5 s( c3 ~6 P- m
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 }3 J5 a/ x5 y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*$ z8 W, g) u: W6 ]4 Y2 H% W
** Set the serializers, Currently only one serializer is set as
% J4 w: o! D, _8 u4 P, A** transmitter and one serializer as receiver.
) |+ }# \8 s% o: s5 A# l*/
" R' _! ?1 Y- z8 t" h- W4 n4 F1 OMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ t: z; X, L* A' Y# kMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
$ P; c9 A+ Q3 L: K+ W. S** Configure the McASP pins $ c$ }. E' N! e
** Input - Frame Sync, Clock and Serializer Rx
8 l( o6 m) l% O3 X) k2 G** Output - Serializer Tx is connected to the input of the codec
# C: D2 ?2 Z5 R4 u" }*/
0 M4 q7 ?) a% v# h! g5 xMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! r! X5 n8 w2 I V
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
) s8 N# |6 r+ H" aMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' e1 D; R5 A8 w" u, A2 V* J| MCASP_PIN_ACLKX3 U. _* ?1 [6 R5 }1 w9 S& i
| MCASP_PIN_AHCLKX) g3 G: L6 s: r. [
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */. O4 |+ T, {) x2 l
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: Z, a$ m J. l7 s8 s. l! B| MCASP_TX_CLKFAIL 8 c w% f0 f: ~
| MCASP_TX_SYNCERROR2 B& x+ S. |8 p% H
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " e/ D* L9 o8 w. u
| MCASP_RX_CLKFAIL
4 m3 j6 Q* s2 k5 ? Q| MCASP_RX_SYNCERROR
; S8 x7 P% ]* I9 [, @7 b" t/ J| MCASP_RX_OVERRUN);! U' ~; |2 N1 O
}
static void I2SDataTxRxActivate(void)( I2 i. B" S+ }) l" v7 L1 L! I
{
8 r) P, |4 _2 Y+ V/ x/* Start the clocks *// I" G; s) o, a4 F8 Q# [( y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 I' D: F# S& a8 |McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
+ |& P0 R3 A& J: y" E0 {EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 k( w1 i" e/ r) S7 I. ~EDMA3_TRIG_MODE_EVENT);
- y; d4 _0 o7 r" J+ l- rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 j3 `% j, O$ M3 I, R b5 O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */% I) S/ |& K, {" G. P1 y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 d) R. h! J' Y0 v, fMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */9 C+ a8 B# Q; |+ C
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */9 r! u8 N# u4 i2 V
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 W3 ~8 h6 S- Z9 i4 g
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 y+ e8 q3 Z# N* G/ L) B! @
}
) T# U9 _0 K6 v( B& I+ C请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 e# V, S @& m8 \. |* P% Y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |