嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,) _& |# R& C: C2 b4 @
input mcasp_ahclkx,1 r) X) L/ m6 h4 [/ R! u! [6 f
input mcasp_aclkx,
' D# K3 T4 F; p; zinput axr0,+ a) I' [( h4 ^5 \: Z8 v% h
9 y, W9 }% W5 [, ?* voutput mcasp_afsr,
' c1 S: L) Z0 e# |/ ?output mcasp_ahclkr,
3 l% @) B. _7 }! ~" F+ a1 I" uoutput mcasp_aclkr,! J# ]/ d2 G# Q3 i! E
output axr1,
: z a3 Z! y, O; p# k0 D' l3 _9 K
assign mcasp_afsr = mcasp_afsx;; L, J' S: c# R* v1 Y
assign mcasp_aclkr = mcasp_aclkx;
8 [8 k6 L" f- ?8 y. G6 [assign mcasp_ahclkr = mcasp_ahclkx;
7 Q- f! s; Y2 P) @assign axr1 = axr0;
6 Q: d' e9 M7 A
3 }* Y, n3 H4 G* E% s1 w& q5 l
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
/ ~3 F: S; S) U( cstatic void McASPI2SConfigure(void)6 U% u/ N% q4 k$ s
{
2 x8 W) c- H4 h* A |McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; q5 c2 o) L; S# T5 a; lMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */2 V! j" j# x1 G6 G. S" w
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 r& a4 p, L1 I- X
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */2 k2 ?6 O8 k! f8 x+ @& W/ g9 X
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' l0 C9 G) Q! K5 _: }
MCASP_RX_MODE_DMA);/ q0 }! r: g" }! ^5 W
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' m/ w6 @3 d; d' r; D5 @MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */" T) _8 k; h$ U7 F
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # @8 l/ M3 C" l
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) _# F5 H! ` D0 b) A! f
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 z |* K( ]0 l: h) uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
+ ?! R% J5 P. x6 Q( H2 n8 w: bMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 x9 w {" c9 Q- qMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 M+ A, ~' F( }% B
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* S7 W E$ F. v
0x00, 0xFF);
/* configure the clock for transmitter */! g2 e7 l) c1 o, H/ c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; r* F4 J5 w' u2 f" z/ v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
* `5 X7 z6 H$ u! l- m" K8 cMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 ~; @1 z9 _' O6 z7 x: t0x00, 0xFF);
" B5 @' F, T8 w5 Y2 }3 ?! K
0 \5 D# ~2 f- z) s: z/* Enable synchronization of RX and TX sections */
: l# N2 e9 k/ h1 N8 c8 [; OMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */* z$ R, @; `! W/ z0 z& _# q
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. P; F1 o s9 y- N% j
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
r3 w3 d* D; A# \; b5 v: H1 }6 U y** Set the serializers, Currently only one serializer is set as
& [8 \' v( C& h+ t# t** transmitter and one serializer as receiver.
, s1 `8 I) T/ J8 v* |+ [*/9 _& }( A8 L* O2 J
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# N, y1 x. F/ M+ w' aMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*1 A( z$ k8 t3 N. z. D) w6 \# d
** Configure the McASP pins
# [* g) A2 {8 V" ~! I** Input - Frame Sync, Clock and Serializer Rx
. ~) b; ^/ r" t' n** Output - Serializer Tx is connected to the input of the codec
2 V* c. n# j9 o$ I*/
^' C, B$ p& w% N' [- V6 e$ \McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 j2 s3 p. N0 h" k. Q1 cMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% R: R/ A2 {9 v; ?
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% L, M# P4 q5 }: B# X
| MCASP_PIN_ACLKX
3 `' @9 Y9 ~- e& |7 g' l$ q3 A& l| MCASP_PIN_AHCLKX
" w% f; F& Q0 f# P) W, M| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */. s% Q/ t( i! U% o" O" L; t
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' ]& K; i- Q) ^9 j" O
| MCASP_TX_CLKFAIL 4 ]0 \! q6 k5 z8 Z
| MCASP_TX_SYNCERROR j# n4 W9 ]+ H I
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: ~( n0 ^' }9 A, D| MCASP_RX_CLKFAIL7 X, G$ x( F5 q& d5 i
| MCASP_RX_SYNCERROR I# O! I9 Q3 B6 n* M5 }5 |
| MCASP_RX_OVERRUN);, w3 t3 u9 I0 H' [8 _" W
}
static void I2SDataTxRxActivate(void)
0 i8 z$ ?$ z1 V8 V# T{
. z5 b J0 N" i. v/* Start the clocks */+ Q5 C0 p+ h" m* g+ x! {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' f$ f+ _/ U7 R/ uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */7 E: T- z# y5 _" s6 L9 S% b7 x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: @# V. }6 Q- V# F+ ZEDMA3_TRIG_MODE_EVENT);
3 q" i2 P! B7 B6 DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
8 R9 p4 h1 j+ GEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
6 i& E7 N) V- \" u: w. WMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% s) f0 c; Q: a( g4 b
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
+ n8 I6 p) W6 V- \& T+ ?( [while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */5 J8 P5 B. H; S1 ?* J5 ^
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 d& A4 z- G4 P4 s4 H3 a9 A
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ z. m6 z$ M4 k& g6 q, P% G/ r
}
7 c r3 q3 E! e+ m8 k$ n, I1 H请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) ?4 ?/ c4 m8 C, q- [
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |