嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,' s7 N5 @0 w8 C# D& A6 }
input mcasp_ahclkx,
& x( A" i# g/ _6 Kinput mcasp_aclkx,- B3 \/ O M6 }' y+ z
input axr0,. _4 s v5 j% Q/ g y
, K# Y2 _2 S7 e$ Poutput mcasp_afsr,; }9 A: D1 m, {/ J
output mcasp_ahclkr,
! U8 G: a2 S8 |9 Soutput mcasp_aclkr,* L! y# E, m8 ], w; m$ r4 j! q/ @
output axr1,. b. f: [0 ~$ s$ u* J o
assign mcasp_afsr = mcasp_afsx;
6 p" d: r @/ J( ?( U2 @2 z! Qassign mcasp_aclkr = mcasp_aclkx;9 _$ ]1 `! o X! c. {" g) A
assign mcasp_ahclkr = mcasp_ahclkx;
. l7 q) D# p( f. Z1 [8 rassign axr1 = axr0;
) @( D6 \1 O- P( w7 D- h2 k
+ [8 t L% P. Y% l- O在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) |' e/ ]; `3 m# G
static void McASPI2SConfigure(void)9 E2 [% O4 S) O, H& y$ W- \
{4 w6 p: {+ w/ L( a3 w' @! A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! k0 y; b5 c, }/ B& y$ j% k \
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */$ @/ C+ s( u9 m6 j: Y: C& g
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 W% T. O0 M, y' x: s% T
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */# s% N/ H+ Q6 y+ p6 m) C2 G6 z1 v) r
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) ^9 S' R$ }" w( lMCASP_RX_MODE_DMA);% i+ H9 Z0 c: d" U+ \1 \- d6 H1 {
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( w" O" x1 B3 N/ d7 S% q
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 T3 l% v+ X5 [7 zMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" q5 \3 D# L. \$ {( e; ]MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' m* }, N2 c9 N) i4 H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* s. {. B! L0 p. t& H1 oMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
# T# }8 z+ o4 \ {" A. l9 \% J* }McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( u, l: [4 L& g: ]: C* ~' nMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
9 i0 u- z! p" w# o$ dMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32," c. ?' n' _/ S
0x00, 0xFF);
/* configure the clock for transmitter */! i9 |7 v5 V; Y# ?. x: s
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 ^! i& A! m8 {5 K% U3 L* j
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 e' c9 x# _6 d$ \, JMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
2 m }5 A1 u q7 ~- s2 E& d0x00, 0xFF);
6 @7 f2 \9 w' o6 i3 L" {7 U
5 u# m) G% L6 s! _' |( {& G- X' H/* Enable synchronization of RX and TX sections */
& K2 n0 y: ~+ E) K' ~. @McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ ^) @' d2 @0 UMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# ~6 G6 ^/ Q9 P! M; e1 @. H7 x7 uMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
, Q4 g; Y% K$ x# C- m9 X** Set the serializers, Currently only one serializer is set as
, ^6 u: V1 p' k- x8 j5 a3 w+ m% z** transmitter and one serializer as receiver.
8 J; r# a3 I$ q*/7 ^' ?! M7 R0 m# T* x0 z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ i; R2 \& u7 z! Z+ o0 l# J$ }4 O. e
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*, i- }) u2 t/ k# x" T# G, F5 A4 U* ]
** Configure the McASP pins
0 s8 l: S2 x! @, j) m [4 q0 z/ h** Input - Frame Sync, Clock and Serializer Rx4 r, c8 `1 a( J5 z
** Output - Serializer Tx is connected to the input of the codec - M }0 d) j X" ~0 r
*/% T' Y: _( O+ J; n/ y/ w5 w! D
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" B, z/ A' [4 CMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ d' Q8 y$ `5 l2 T% L1 v x s
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% W! g, p- Q+ \) e- ]: O7 z
| MCASP_PIN_ACLKX0 z, p$ ]5 h; h4 F; [6 r
| MCASP_PIN_AHCLKX
% U& W: Y2 x: N, ]9 ?3 N6 o$ J| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
6 q5 O5 Y; r1 Q: GMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. s9 I; q. E( ]$ t q5 `2 Q| MCASP_TX_CLKFAIL
9 z$ g+ S- m$ v5 s6 i| MCASP_TX_SYNCERROR
6 U0 s2 p" t0 s) L) O; S0 m3 d& L| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: M$ b' b1 S9 h! X$ N| MCASP_RX_CLKFAIL' {& M& D( T, h$ y' B+ q% M
| MCASP_RX_SYNCERROR # U$ j" ~( m, d% M& `
| MCASP_RX_OVERRUN);
W6 v! t9 p* L}
static void I2SDataTxRxActivate(void)/ I: @ g1 W- ]! r' k
{( _) W; @/ E8 a- D& v' r, ~7 k& J
/* Start the clocks */
5 }0 ]* d: g6 q, _% jMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ @8 X& c# r7 _; z! S3 O! V
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */+ ]" ^: a5 d2 N) X* @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' V" H" G8 t. P) {) h- J" I+ UEDMA3_TRIG_MODE_EVENT);- K& q* a- d: }$ w3 h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
. }9 }( Z/ n' p% uEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers *// s5 s7 z. Z- _4 C. g7 w
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- b4 ]3 `* e/ ]9 q! zMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */2 K7 t6 s7 B& g+ G; z; T
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */; g6 `- a/ A1 j6 T
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 V# q) c6 N% `/ L. L: o% MMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);" [8 [7 _" G* t
}
. d3 t7 }6 ]2 c' b% u请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 D$ o, p8 R) @. R! B
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |