嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,8 {+ I- ` _ K% g
input mcasp_ahclkx,
% a. c0 }( `) b0 K- B% X0 S8 Ninput mcasp_aclkx,
( ]7 S& r9 T ]' r4 u- Einput axr0,7 S* j% k0 T+ r0 ?5 D
, d# h5 t) [( a' Y0 ~: s5 eoutput mcasp_afsr,0 z- V6 x; ^3 W9 z% L
output mcasp_ahclkr,
7 V7 ` c+ T4 |0 a9 O) eoutput mcasp_aclkr,0 T1 v/ | m4 C) n4 }, o2 z; x
output axr1,! o4 c0 m6 p+ c
assign mcasp_afsr = mcasp_afsx;, F5 h* `- ?% Y6 h7 U1 B8 N x
assign mcasp_aclkr = mcasp_aclkx;
+ S% S/ A3 \2 E- C* E: p" Massign mcasp_ahclkr = mcasp_ahclkx;6 a/ R# Y$ i& e; {) C/ H: Z
assign axr1 = axr0;
* D; L6 W: y" R% b2 e
' c: z, W ~9 A6 e
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
* W8 S* d" Q3 v: Nstatic void McASPI2SConfigure(void)+ \0 _% t# u6 k k9 x A5 b5 h. T
{
6 l4 R; z* K( S/ AMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ B# O1 g7 B( e( x* }+ rMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
" C) L0 f# u! N; T# F. e& z! v8 GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. _; h* t: R- H' |+ |
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
- D2 g, f u* `# ~$ kMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ r$ z+ r; Q Q$ TMCASP_RX_MODE_DMA);2 b7 m9 [" s, i8 |- E' y3 k
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 W$ x; n: T8 g0 Z H v( aMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 `: [& B& r/ J5 H& E; [3 E1 N* QMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) c4 ^4 I2 Q0 i Z- j) e) EMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 {, Y1 z" Q6 P, Z5 x! J; g
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* M. O. G$ @4 \3 _" vMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
6 _3 T {5 `2 H/ Z, _) _McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# O& c& b3 V* b% ~ n4 wMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 V! M5 z4 b/ b1 x) \. \McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 ?0 ~" ?+ h2 L% b0x00, 0xFF);
/* configure the clock for transmitter */% X; y, t6 l& \0 E2 s
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' S7 u2 X! r3 eMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 W7 y8 s# I$ e, X9 u# E7 I5 nMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 x/ g9 J4 a% K7 f) h8 y
0x00, 0xFF);+ m( A+ o j6 |$ W9 V$ n# F! \
) l! Q+ T7 X$ [, t' o- C9 Q9 ?/ J/* Enable synchronization of RX and TX sections */ 6 f+ l+ w$ m. K* ^
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
! ]) {9 R! m1 @# I5 L! w/ [2 Q: n; `McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# {5 p# e, h6 U1 ?7 F. ?5 bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
) k4 O3 A/ \- f) r( {! f" {** Set the serializers, Currently only one serializer is set as
2 r2 y( P7 C0 b7 l7 R** transmitter and one serializer as receiver.+ }) u* U) k7 j3 ]6 J5 p! p) b
*/
/ d1 }3 Y: Q) o0 q& s2 j% yMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( X0 h+ g: T" O# HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*8 g% y! e8 q- l
** Configure the McASP pins , K9 ^' J' p' V0 }
** Input - Frame Sync, Clock and Serializer Rx3 B# q7 G6 e3 w. ?* L: K
** Output - Serializer Tx is connected to the input of the codec
5 `* L# P! o! Y0 D*/- f9 i. g( Y, S; B; J" j. Y: Y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# N/ B# z2 ^. y& [( _McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 a* e$ p+ B( ZMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) T/ C! Q0 r4 M& S, f. S7 N
| MCASP_PIN_ACLKX
* M0 _4 M9 T0 f- @. |/ b| MCASP_PIN_AHCLKX
$ S5 X6 x, S( [# a$ z, z( @| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
# A/ b# d! U) [McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 I G& a$ Z s3 [6 l. I/ h| MCASP_TX_CLKFAIL 0 d% E' _1 G$ j4 J( K& d* K+ l; y
| MCASP_TX_SYNCERROR
2 L1 ]$ `! {) e* b| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" I8 v7 U2 c: C; N( o4 M| MCASP_RX_CLKFAIL
$ M! S4 I! C8 j: ^0 ]! P7 i1 E| MCASP_RX_SYNCERROR ( N3 w2 W* Y- k* w. s. @. b) ^# Y
| MCASP_RX_OVERRUN);
5 r8 N- E1 w$ a* e- {& ?}
static void I2SDataTxRxActivate(void)( @3 J) }# w2 u3 J; V
{# ~6 B! d' f) _0 T+ g( ^" ~- [
/* Start the clocks */9 |- A$ J3 }+ M8 b" j
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! P4 I4 z4 K, J3 U% A$ yMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
7 k& x: y" s: h3 M5 i6 |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* W _2 d5 ~. x) E4 ~0 dEDMA3_TRIG_MODE_EVENT);
% v) u: _+ e' g$ C" ^, s% WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 d( h8 N; q: I0 @. [# `
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
6 n9 P1 J5 \! [, R* KMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. o! a# s' p( X- D1 y. ~
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */ n* u a3 n9 X' L
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */9 `; c) G+ c0 ]# y( W5 {& v5 S% h2 t! u
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! j3 Y, Z) z: J n* aMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);" n0 Q) j# ~; O- j5 c/ k1 y8 |, c
}
2 X2 m3 }. p7 {' q# _" P请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
; W4 P5 F; j9 z. v4 C
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |