嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
% ]3 y+ L7 q& J% s9 O/ sinput mcasp_ahclkx,9 L2 M6 K3 }+ W: H' r4 `0 c
input mcasp_aclkx,
: }( {8 l, s" }. d$ X( {input axr0,: m$ N9 ]. @) P3 J$ Z( u6 c
- j O0 A1 M' U% J' X* v
output mcasp_afsr,
8 Z5 J9 e) [( ]6 `) Voutput mcasp_ahclkr,! @1 Y7 Y3 F+ [) i" E( Q/ }
output mcasp_aclkr,1 ?% `: U1 D2 `. ^( j3 U( G9 a' m
output axr1,2 |# f0 Z, C4 x* y1 D3 E2 O8 Z
assign mcasp_afsr = mcasp_afsx;
! @; F- Q: N; k# v9 iassign mcasp_aclkr = mcasp_aclkx; t* r# ~8 G' d ^
assign mcasp_ahclkr = mcasp_ahclkx;
{4 E3 N- W hassign axr1 = axr0;
, l% R' S) I& P1 y! F" A
4 F4 {5 ^& j6 \在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
4 @7 p/ Y9 {* D; Z5 i& D$ \static void McASPI2SConfigure(void), i* Y/ O% M1 U' m4 r" \; Q; [. |' T
{7 u! I2 \3 \. l1 k
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
& ]1 K3 H9 }* h, AMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */& Z" z9 I) n. W" [# r
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; ]; A2 Y& m& l' r6 u [
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */! b6 W% D, S$ G1 P
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: ?7 Y6 Z9 P) P) q! c8 DMCASP_RX_MODE_DMA);0 j/ M+ B) P3 s9 J; J
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 x M. a. j8 d# [) N- xMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots *// r: I% @! E( b: x5 u2 f/ X
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) ~7 g0 M6 W) yMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ {5 O$ u& Q1 ^1 H$ u8 i
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ( D' K% n1 k+ Z! [0 G. n
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */! o- A& o5 b' @( F# t/ ?( \
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);' g( n2 `' p7 u0 K i1 u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# T( Q! z/ m1 e' `! U5 cMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, l( ]( l y1 X
0x00, 0xFF);
/* configure the clock for transmitter */
0 F0 D8 Y1 F& z9 N: H- lMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' `* a* ]; R. ]# S
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); & x' p7 y, o7 l9 F' F. i
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( S+ V# u0 `1 y0x00, 0xFF);
% S: }1 L3 U2 V2 u9 W* C- N3 \1 |+ @
/* Enable synchronization of RX and TX sections */
Z2 a3 h$ ]" CMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
# T7 }0 i& Q! Z( @McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; Z; p5 {, U" h3 j, @McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*7 l: c0 [" l+ x- B8 Y
** Set the serializers, Currently only one serializer is set as! ~1 E5 N) x1 `
** transmitter and one serializer as receiver.' Z1 ~/ E# }+ P, Z
*/
9 q- B2 X) F2 Y% A1 \ |& ?; C$ F7 @5 ZMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 h+ G) @9 `+ }4 P" Y0 H% ^' HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
( c# k. p F! g: a5 d2 i** Configure the McASP pins
# J Y: b- @6 y** Input - Frame Sync, Clock and Serializer Rx- i$ H+ a, ?% M, P" m" V. v
** Output - Serializer Tx is connected to the input of the codec
: i% d6 h# g4 M/ t+ v* Q [*/
0 i) j z5 Z1 b! v3 [; @McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ S5 ~* p! N* L
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 r. a5 W, \6 |: I% n- h# i M
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 j# J+ ^' y2 O| MCASP_PIN_ACLKX9 v/ }- U* h; w! m, I0 @" |& _: ~
| MCASP_PIN_AHCLKX+ m. W( Z S" L {0 g. z
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
# P; R# _% _. @McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & a; O1 J- M. p6 b1 U
| MCASP_TX_CLKFAIL ( T; H( i$ x2 x5 i4 a0 z( N; U
| MCASP_TX_SYNCERROR9 `4 y1 i5 h; X7 k
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' s, k8 {9 g9 f5 ~| MCASP_RX_CLKFAIL
3 O ~7 a9 p: P2 L| MCASP_RX_SYNCERROR 2 c: E' o* I3 A9 p$ t% i9 @
| MCASP_RX_OVERRUN);* i# y/ v7 B- L6 I
}
static void I2SDataTxRxActivate(void)3 T6 y% r& w2 M9 B6 _. d. a& m
{
6 z5 r) p" M" ^$ A5 {/* Start the clocks */$ X( I, z2 R5 H1 b' p
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- s; `7 E* j7 i7 r7 o. O
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
- f. X t8 {- X. v$ }' \: J$ y7 ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
/ }& p- B: f3 [0 b* o$ o5 f& eEDMA3_TRIG_MODE_EVENT);
" `3 s: I r( N7 y5 @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: H" E+ k0 D! f; J3 t& I9 `EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
8 ?5 F! A$ [2 @* f5 K0 w. nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* r: g! p. K3 a% H/ [# A6 `/ D$ c
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
/ P" p% r2 f5 uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */# q* f7 I( m4 f: ]8 N$ }
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 V6 n! ]; \/ ^' G; f* pMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);- H: j, X) d' l3 `* K
}
2 G0 [/ w7 {+ A( ?4 f& J- G
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. Z9 E# i: ^: P0 B1 R
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |