嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
* Q" Q; M+ Q& Y8 G7 Yinput mcasp_ahclkx,
/ t% b2 P* u! t% w* P" V/ X0 winput mcasp_aclkx,' y: @8 E ?6 G$ n
input axr0,2 ^/ X1 \3 k' e$ H4 D8 D- x
+ }# Y* B' S' e* M, b# qoutput mcasp_afsr, n2 A3 S* V6 t8 [% m F) |# ?
output mcasp_ahclkr,4 C- y9 \7 D0 |
output mcasp_aclkr,& l% }& }# M+ m; S2 @+ f& z I
output axr1,
+ B" ]' Y2 E' z# q9 R
assign mcasp_afsr = mcasp_afsx;+ g; |7 `, A$ \) ?) z: N
assign mcasp_aclkr = mcasp_aclkx;
1 Z% {5 _6 q: D5 rassign mcasp_ahclkr = mcasp_ahclkx;* x: h6 M6 ^9 K5 D/ S# I
assign axr1 = axr0;
$ K, e; F; [1 d# @8 C8 a
& F" s6 V8 O6 }* w9 z2 u# Y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 C$ z& P0 @7 D
static void McASPI2SConfigure(void)- D" W* I( j) Q# B( \2 g! w7 g* Q8 G
{8 |" {3 ?8 k9 G/ Q
McASPRxReset(SOC_MCASP_0_CTRL_REGS);4 W- G' p% A( m& I
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */: g$ Y J4 @- v6 X4 i9 H
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 s7 W; T3 R! S# V9 c3 d: `
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
* f5 }1 s. k# N" x0 s& h$ m# |McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 O8 s- Y. D) v3 P q# D& BMCASP_RX_MODE_DMA);5 R; [8 b! p+ N! }! t m
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) X, \7 l, h+ [MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ y" t# M1 k/ s/ u, U0 r& T
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, z7 E2 W% d3 W, v+ ^MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, \" U. L3 m4 n6 @( s4 L7 HMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : R- r3 B% V# F# o9 a! m H
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
' q, o* d d; c& {McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( i4 G* l! j+ }4 J% V+ c+ O6 Q& l0 H2 Y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( c* k1 h. H i! U& ?/ h5 sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ p/ Y* c5 q' i) G% [0x00, 0xFF);
/* configure the clock for transmitter */
X/ u) B7 B4 z* u2 aMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);6 p: p1 [/ J. B# v& j6 W. N8 P) J
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * h1 [# I* }, M2 w, K4 W" v
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! Q8 s7 G3 v+ g6 s4 h ]0x00, 0xFF);
7 p, S" b8 n; K4 L4 X
9 G0 Y* G7 E# _ k: X X5 U/* Enable synchronization of RX and TX sections */
) m- B5 z5 ~% S- U8 nMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 `1 d2 m& E( d3 n/ KMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; B1 S+ m6 b/ }; V" k) ^7 Z2 E! w
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*0 W8 u0 _$ V! f1 ^& b3 u
** Set the serializers, Currently only one serializer is set as
8 X) l% R; N! U% c) h$ j** transmitter and one serializer as receiver.* w( I: a2 c2 ?. C6 I8 G3 w; x7 P, b& [
*/
$ C# T: u! }# f% m/ V/ ZMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ u, D1 e+ K" w; nMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
- d2 i5 j3 x3 W0 k) M ]** Configure the McASP pins 8 m3 z4 a% ~& Z' ~, p; L- L' e
** Input - Frame Sync, Clock and Serializer Rx
a/ H8 o2 k& O** Output - Serializer Tx is connected to the input of the codec
, B! ^ w. U+ O0 _7 s# _# j*/
9 O# t, D5 t* o iMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: E/ u! c: y4 A) ^" R$ p, [McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- T! ?; A9 G- G& J, N" G
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. g5 X$ d) X: ~4 ^! n% {| MCASP_PIN_ACLKX$ _6 A6 m' P& v, I$ _4 b
| MCASP_PIN_AHCLKX) t* U; M0 [. v d& w$ S
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */0 f1 B' p! n: r$ x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 z. W! @' m) x2 q5 J| MCASP_TX_CLKFAIL ! g8 D4 m5 a6 ^
| MCASP_TX_SYNCERROR4 h6 g8 Y, A c4 T
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% M/ M; q1 L' H: M( e| MCASP_RX_CLKFAIL- L0 Q2 o! K4 ]# p4 A) M5 ]
| MCASP_RX_SYNCERROR
0 Q7 V- K i$ O) s' q| MCASP_RX_OVERRUN);/ [4 P8 O# h% y" o9 i
}
static void I2SDataTxRxActivate(void)
8 Z; ]+ k: a7 Y& E{
/ I9 z6 t& ]$ y6 k8 ?/* Start the clocks */
6 Y$ E4 h+ Z6 B, q0 `0 o! |4 Y9 OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: `" q2 I) k: `" ?8 n( ]McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */" O; x6 A: t4 }; A: C4 ?, [# Q# s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' f9 R" a4 P$ D/ I
EDMA3_TRIG_MODE_EVENT); v/ B2 m5 y7 v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 ]. G2 ?6 n2 VEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
' b O( M3 S2 C8 L0 i( pMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
0 K; A! N% r! ?' l( [4 WMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
( }* p/ L( [9 Rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */( u( j5 E2 m' V( q8 W$ V
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ s3 |+ M$ [9 `5 ]McASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 P0 ]( }9 Q$ {+ @9 o4 J
}
& A# s! h* r; |请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( P! j4 @: L+ U# t- Q6 l4 @+ u
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |