嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,6 z/ j/ \5 T0 b- B( a" f
input mcasp_ahclkx,
& v e7 l! ]8 d4 ninput mcasp_aclkx,1 _7 u) v8 Y9 Y$ p
input axr0,+ n* v# m4 G0 ~# k! k. P
9 {/ Q$ g* @* boutput mcasp_afsr,
+ l' x3 t4 y. C N8 _output mcasp_ahclkr,9 J) ^* e# |1 o' M: }- `( b& E
output mcasp_aclkr,
" s n+ u5 j2 |: `* G1 k( i" qoutput axr1,1 o- t, r" T% L# w, O+ A
assign mcasp_afsr = mcasp_afsx;
; |4 @" `- z6 oassign mcasp_aclkr = mcasp_aclkx;
1 R9 o% @. s. c- Xassign mcasp_ahclkr = mcasp_ahclkx;; s8 U1 M- X# B8 @5 g/ I; ]
assign axr1 = axr0;
$ V' D6 @" d ?
/ ^1 j3 c& _" u8 d9 @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
M: L* s. j+ T3 e* C
static void McASPI2SConfigure(void)
) q+ M: r8 w6 M. o$ I3 F! D{
1 @$ [9 [ ~' b' sMcASPRxReset(SOC_MCASP_0_CTRL_REGS);8 P7 |! O' v3 P1 E
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
6 _" I; Q I. R2 n; {+ J% sMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* f- K0 N r7 K5 vMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */+ @/ @ q' O+ |% I) N+ E$ ~
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' N5 r7 a5 D( z7 ]& [, c9 C8 A% O
MCASP_RX_MODE_DMA);
; v! ?/ E6 p/ `+ SMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ ~$ U0 A9 q" {$ o. q# YMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. o0 l8 P$ u- I# BMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 Y+ _! ]& w+ r7 gMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, ^" ^- W- x& s# n1 G2 [
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 _# h+ p; ]2 l6 J0 K# A) QMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */2 v) t, t- h: Z: C
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
$ s/ g" [ S1 k! e; i1 S7 F7 ZMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ }* d0 V, y+ l; _
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 r" d( p% U6 D) ~/ w0x00, 0xFF);
/* configure the clock for transmitter */
( H" W# L y; ~1 W, m, w/ y9 cMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 J1 l; p0 d+ z# Y5 I7 V' R6 lMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ R0 e& i) s* X |# B; N$ WMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, V9 R% a/ u7 m2 F. m. C
0x00, 0xFF);
+ ]8 a' s1 v. }7 R8 q
. Z' a' O) R1 u9 W/* Enable synchronization of RX and TX sections */
. I. D; J% _- c, IMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */9 Z1 I: g- M$ z2 `, w) g4 r- |
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) n) K, ~( y5 E* V6 V
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*" P: m# S+ e/ l5 x
** Set the serializers, Currently only one serializer is set as' O% [9 _: [" L( I3 E) T( ?5 K
** transmitter and one serializer as receiver.
; ^ H8 @. I0 \$ e! a*/" Q8 m$ [ {& H: q6 y! C+ V) ]
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. `$ i. n9 J7 [9 [( i4 u
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*- D. G' S% u# q4 {
** Configure the McASP pins
6 ~5 O, t8 @2 V/ m9 x) [) R** Input - Frame Sync, Clock and Serializer Rx
6 K" _1 Y- B+ ^# M( L W** Output - Serializer Tx is connected to the input of the codec # ^( {+ j5 B6 {9 |
*/. m& Y# u! N- i% }( w: o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); B4 h8 k6 Q3 Q9 J4 U% [1 R& i
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# P$ k% S. o( T8 l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX! x8 D- r+ }8 Y4 n8 E% a
| MCASP_PIN_ACLKX
- c- a0 H( Z# H# e: x0 I% z1 p) Y| MCASP_PIN_AHCLKX# Z% ~7 k5 r/ p* m2 r
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
( {4 Y) `' e) i/ ^4 ~' wMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 H6 @6 X* P) k
| MCASP_TX_CLKFAIL
7 { c4 \7 j t- P3 {( J, i3 Y: @| MCASP_TX_SYNCERROR, k, C0 {) r$ s# @: ]! Q
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 g" a& Y) x: Y9 ]9 {0 g7 }: C| MCASP_RX_CLKFAIL
* a h- w/ J+ k2 }4 ]6 @% z| MCASP_RX_SYNCERROR 7 E# _$ y8 I- s( n2 x1 R
| MCASP_RX_OVERRUN);8 `9 G' F; G2 o# M: r3 ?
}
static void I2SDataTxRxActivate(void), }% T- L. `$ e3 \: v
{* P$ ]- \3 q6 V% Z4 R/ g
/* Start the clocks */
% B. T9 i' L7 x& JMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: V9 ~9 f. [( r, ~$ y2 K
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 V0 l) b1 w ~: g' F# N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& |" ?; A Y- a6 ]2 S. eEDMA3_TRIG_MODE_EVENT);
. G* ?. @; ^. S' F1 g" N- c) sEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# M# j B9 W, HEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */; E1 M& q3 V* j. ?7 i7 |: ]
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 E. S2 ]' S% }8 g. tMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */! q! N/ b4 Y( O, Q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */- _8 G+ c) o4 v9 E. L7 F
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
# ]2 @" |% a# O& y5 J: MMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
Z0 H: _( E& d" p0 {1 c}
' O/ f3 L+ S0 H* r
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 i& f6 b' U! I& j3 y R
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |