嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
( f) W% h" X9 {( C4 _9 [input mcasp_ahclkx,
4 Z x6 [5 P! Z U9 ^( W9 O1 pinput mcasp_aclkx,; `2 q2 d6 h, v' J
input axr0,
4 k8 L3 e# V) B" d! J: {) U! f$ x3 t0 ]8 a) k8 R. z
output mcasp_afsr,+ | H7 H, r8 W5 I1 u* A% [% Q
output mcasp_ahclkr,0 L/ G- _( u3 N" K8 q
output mcasp_aclkr,
n( o2 \1 H, @9 B( u. woutput axr1,& m8 ]' e i0 ]' r
assign mcasp_afsr = mcasp_afsx;6 a' u/ \$ r: @! Q. Z# b
assign mcasp_aclkr = mcasp_aclkx;9 z+ g; z# |, _' v& ^9 B( p8 B
assign mcasp_ahclkr = mcasp_ahclkx;
( C/ t9 ?: L: d# f4 r. eassign axr1 = axr0;
- Z' c7 x4 z1 r- H4 q1 m# |4 @! O U; f5 _6 b' O9 |
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
4 M% @1 f" k. z$ r8 ?& V# I( P' a/ j
static void McASPI2SConfigure(void)2 D5 w" B2 n' j9 K) ^2 C0 ^ A
{7 g: k8 {( C1 S4 d* i
McASPRxReset(SOC_MCASP_0_CTRL_REGS);# L% S+ |, ?, [) M/ V
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */, o+ F/ `, r: \" c6 {, [
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
+ M" h: u. z2 c- \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
( H. r" r2 \2 a, dMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: B @7 l3 Z: O# ?
MCASP_RX_MODE_DMA);9 B/ [1 M: N1 j9 {2 V+ P
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 f t% x3 l) q: D
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& C: D3 Q3 {( C# b7 }McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
m6 ^, C" ~+ G3 \" QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ H7 I; A6 B" G j9 o/ {2 V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 d1 W/ q) h; t4 kMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
0 S B" b( b" V3 p* o* l, b+ l! N; K- TMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, c/ _% X& c: a Y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " |. l" d' l M8 v9 I* n/ I7 O
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 g. S' z1 @+ e0x00, 0xFF);
/* configure the clock for transmitter */
7 g" @" T( Q7 A n8 yMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); S! D) D: g. [7 T8 V& G
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: ^( D7 q4 ], OMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, ^1 a0 p5 N( I) l0x00, 0xFF);5 q: d" `# H; f& u% s4 j! A
6 F! M) ?* k6 ^. _3 P, ~2 N, N
/* Enable synchronization of RX and TX sections */ % n3 N1 ]* X2 L2 B6 @" P
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */. w, T; C: L: s& v& D% K* }7 I& [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; K$ c2 w" b% O. |# zMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( @1 e5 S3 C" X. z
** Set the serializers, Currently only one serializer is set as
3 ~5 E) U$ j3 a# m0 b' y** transmitter and one serializer as receiver.
$ Q! l3 h* r% ]% p- d7 M*/+ F% q1 g' B) u$ `2 ]0 i
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 z/ \8 S+ `, B' X1 `% f
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*4 \. f$ M& D9 Z5 o
** Configure the McASP pins
! D# p# N0 _% m5 \0 A** Input - Frame Sync, Clock and Serializer Rx
/ B. O1 n1 m# @* V** Output - Serializer Tx is connected to the input of the codec & s: G( O8 N) C. _1 f0 a5 z$ B
*/
2 u/ R7 j" @; }/ c: _9 dMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 _. n) K( }+ g! w5 j, k' VMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' U! R/ C) C8 y- B8 t8 H
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- H; ]$ O: m! Y: T2 G
| MCASP_PIN_ACLKX$ K8 U& p) G. F9 l% w1 |
| MCASP_PIN_AHCLKX
; ^3 o& g8 v! B9 c* N5 \| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */" M% ]! C9 ^. E0 e& G+ x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
8 H: x+ Q6 f- m' o- D| MCASP_TX_CLKFAIL " [0 b0 D7 _6 W! G' x
| MCASP_TX_SYNCERROR/ y" I1 H; Y. R7 I# b
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; d, i7 o- N) I
| MCASP_RX_CLKFAIL
: ~9 F4 t+ _ G# C7 d# S| MCASP_RX_SYNCERROR 6 g& _- d$ @: ^' Z8 [) A
| MCASP_RX_OVERRUN);
3 `" K& k" w4 S$ i! A}
static void I2SDataTxRxActivate(void)' X6 z7 b, N" O2 }; F" e
{8 z$ N3 S8 ]8 s2 ~/ R: ~3 z7 H. ^
/* Start the clocks */" t- g% b& I5 j$ G! c
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- W, |6 {) Q' F2 ~7 cMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
" `/ y0 Y; y2 b: `. n! z B0 JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( i: b" z( p' I& rEDMA3_TRIG_MODE_EVENT);
; S5 v# _% T3 J, p6 A0 EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* M8 g8 g5 F& D( ^EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
3 C% V* o& E4 C, ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ o4 n; U$ z8 P& t0 F+ Q3 BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */8 S; o) L; T$ t; J5 C
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
, v, f, P) f9 ^# A! YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ _$ K @ r" w' p- J" d
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 c8 \0 c F' G& R, W5 g" b}
5 L/ [5 j0 t, ~6 ~8 v" o& K/ g请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 w, Y) {% h) [- p# J) S
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |