嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
$ y- i& f9 A/ P1 L* m, t/ kinput mcasp_ahclkx," u4 q. q+ j* t# S( j
input mcasp_aclkx,
6 I9 q+ s. H( T r& rinput axr0,
& h6 j* \+ y4 D4 d* T' J2 f" X) z9 Y, H/ Q6 T/ ?0 N/ a
output mcasp_afsr,* N& u. ^5 q8 f* Q
output mcasp_ahclkr,
/ z. | d a! F8 Y8 l+ r' woutput mcasp_aclkr,
7 {, Y0 _; ?' n; G8 b! koutput axr1,
0 O! ^$ u" z8 B
assign mcasp_afsr = mcasp_afsx;( Z' d! o- H2 X. f) F7 {6 F1 ?
assign mcasp_aclkr = mcasp_aclkx;
5 U! A! W6 l' D) l! Y m, @( Qassign mcasp_ahclkr = mcasp_ahclkx;8 ]6 R: l: [% F3 ]$ ^
assign axr1 = axr0;
" \ i+ K3 M( ]2 Z' m
5 _0 ~+ g; K% ?9 F; H+ S在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
4 @. [, P+ g1 T+ {# Pstatic void McASPI2SConfigure(void): S5 e! s$ b. T, E0 s/ z
{2 ^) O3 W, r: g8 Y% H
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ Q3 W7 M5 g& y( ^7 S& rMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */) o, l" \9 |" e/ M3 i" s
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- @/ t4 K: Z* i/ o; A+ o, s) S, p
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
- S; d# `/ F' G5 Y7 t9 \9 x1 AMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 ?1 F' U$ H/ f$ a7 o+ M
MCASP_RX_MODE_DMA);' Q4 E; \+ {! A7 l, @
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. g" m- F7 p& i
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ Z9 v$ j* J% G8 z/ R* u4 X! [" v7 jMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % ^, A, ^) g/ G* G
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);# d) I5 I4 z1 d) t6 C! c- H! y6 V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % n5 O& u/ ^" N7 \2 C6 X& {0 a0 f
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */' o- Z# Q2 r+ X# m
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: Z1 Z/ H" _/ r: G0 e1 m2 z* u' B
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 C6 m& V$ a% j' I
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
`& `2 l4 ?1 t5 d0x00, 0xFF);
/* configure the clock for transmitter */7 x+ s+ D& o! h* o. n1 c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! ^% P$ w5 h6 {
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. U6 U1 `* K0 FMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, W) k/ V. y1 ^/ o/ P( G7 |
0x00, 0xFF);
0 q) k8 w/ @0 ~7 F2 @. }0 @ R5 e, J) z) G
/* Enable synchronization of RX and TX sections */ ! g ^; F& W' A/ D! k0 U5 D
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 `, T l$ `/ p4 B9 a
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, E% ]' l" A/ N0 m
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
2 X) d3 X* j! ?** Set the serializers, Currently only one serializer is set as
7 t# I$ v5 D5 D, D2 n0 [7 [+ k** transmitter and one serializer as receiver.- v% Z+ |5 N& t, E5 B( A
*/) {/ @; ?6 P( ?
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ j+ Y, K, I5 L. @9 X' BMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*& U) i$ a" M' t" [! E! A6 }
** Configure the McASP pins + V, {" L' e: B: |0 `4 Z! ^) c! z* o
** Input - Frame Sync, Clock and Serializer Rx
! x# `- m' G8 n) f** Output - Serializer Tx is connected to the input of the codec
$ m1 _9 |( u2 D' F5 X*/
: z; y. i3 k% nMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. i" a; [ D$ T
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 J8 k. Q9 O3 v" t0 s6 F6 t
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
/ G! u/ t. Q( u+ V7 d7 f, B8 Z| MCASP_PIN_ACLKX/ H7 w' Q% x5 @( I, Y
| MCASP_PIN_AHCLKX
4 o- R% m) }, v) M( S6 B/ z| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 K6 _7 @3 y& \6 v( ]- LMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# P: {/ n5 g/ \3 v7 z2 {3 |0 L7 v" }2 S| MCASP_TX_CLKFAIL ; i$ g3 W* _" E
| MCASP_TX_SYNCERROR
- f8 e) t4 j+ e" j- D) ^| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
{( d' K* t2 Q8 q$ D| MCASP_RX_CLKFAIL
4 [# Q+ A1 q& @$ ~" s| MCASP_RX_SYNCERROR
1 x, K- |" Q3 y4 A% }0 H| MCASP_RX_OVERRUN);1 e, s# @; K' P0 a% @+ ]
}
static void I2SDataTxRxActivate(void)& O2 b# O; v1 B4 m) [- z
{
) G$ C) y2 O5 X/* Start the clocks */
" |" M2 a3 [* O* ?; w% @: gMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; F% O; t) Y/ l f" R) hMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
7 q8 y1 v9 T. B* }EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 r" E! e8 v* B4 T
EDMA3_TRIG_MODE_EVENT);
- T2 D8 a7 x* k5 w) UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 N/ q# F- }) K1 l- m4 f5 `
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */; O) D1 Y* E% K) ~$ E
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! a2 N9 D! u5 ?9 G- ]
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" v4 H. T1 ?8 a4 h2 ?( Kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */, f- C5 b8 R2 D8 p" @$ G. J1 ?! x
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 m7 Q s. A+ C6 v7 r: B$ |* G6 k
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
+ W6 g5 ?' N6 f0 r; @" J}
: ~& R/ |- p9 O# W- p6 X请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 T8 w# `. C1 @" ]5 Q
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |