嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,) O! ?" G; B" S! |4 n1 ~
input mcasp_ahclkx,
~: z+ ?8 L# D Y+ R/ W/ Yinput mcasp_aclkx,+ n3 q# k* B, J8 [+ l- u0 ~
input axr0,
+ G5 Q5 Z' J+ R& i9 x5 R( F/ P9 s8 g1 d$ G1 e
output mcasp_afsr,
( A) K" `3 u7 t* m0 r" ?; eoutput mcasp_ahclkr,
' }0 O0 k# p" d4 h$ y8 U3 s5 x0 Routput mcasp_aclkr,9 q; o1 ?: n! w' _0 G6 x! W1 [
output axr1,
/ A8 z7 i" n P, @" L! E
assign mcasp_afsr = mcasp_afsx;0 n) G% m+ h( `. D" D
assign mcasp_aclkr = mcasp_aclkx;9 L. [- x6 }, ~* G9 f8 Z
assign mcasp_ahclkr = mcasp_ahclkx;; z/ F2 G! s9 E2 E$ O+ p# X, L& m
assign axr1 = axr0;
! G6 }. Z3 o1 D1 ~) [
6 g; ]% _# N2 B& n; q. I% _+ Z# C1 o! V在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 ?$ k T/ J4 d+ G: m
static void McASPI2SConfigure(void). ~( F, l5 T8 }1 `* H# x
{
) y' a/ k: c" J8 u9 _4 \McASPRxReset(SOC_MCASP_0_CTRL_REGS);
1 v8 _% F p8 q' E$ CMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
8 [/ s6 ?1 p% i$ XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
4 L, N- K/ z: _# x6 PMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */3 a& \, f) J3 l# C, I& ?
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, C3 t% J: W' x& @
MCASP_RX_MODE_DMA);
2 o" ^& B* d7 h$ }9 bMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 z/ ]/ U% b- F S- J, z( U
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */) g8 a0 j5 b- {; u/ k. Z3 n
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
6 k' X) b! w* x5 J8 E3 K0 aMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- F% k% A' V1 o- j, k& X
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 W1 O' ]: U! H" F0 T5 E1 r) w5 uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */3 m! j" V2 M& o' X2 q. b, V3 h
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 Q5 y3 ^5 L2 }; d
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# R8 B4 n' Q* zMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; t2 p1 H1 W% ^: n# Q7 \( A0x00, 0xFF);
/* configure the clock for transmitter */* A7 o1 L; ]7 W8 X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ v2 z# Q3 j; o* t3 m
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" C& Y% L. D- j4 sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, k b/ @! a- t+ f) A
0x00, 0xFF);
6 e' R3 B B7 g6 K; s( O, g8 }5 T {0 L( A, C! Y% V! x6 I
/* Enable synchronization of RX and TX sections */ , q. ?0 {1 s [5 Y8 f7 h
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots *// R6 U) N, s7 R# O
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. H, W. D: `' n/ dMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
, H( h6 m Y, Z** Set the serializers, Currently only one serializer is set as* ?% q! v2 Y5 I. B( k2 d/ ~
** transmitter and one serializer as receiver.
7 m1 M: s3 [/ U' ]*/
4 a( v9 W+ Q9 K% G9 ^McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 i8 Q- L' ^4 @6 GMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
6 M( D1 F* O0 `2 [9 @** Configure the McASP pins 5 p8 I/ N: o8 `' _) _) F" q- _* l
** Input - Frame Sync, Clock and Serializer Rx/ m, R. Y% C/ l4 Z. ~3 j" k3 I
** Output - Serializer Tx is connected to the input of the codec
, k0 S& x! _* Y! O*/* I/ `& B: ]+ I4 V
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 x' Y" C3 X. t8 g& BMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: h+ k+ H+ ^3 h' zMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
# e9 \6 F% |" a: b* @| MCASP_PIN_ACLKX5 I& K* k- f2 y% x9 K
| MCASP_PIN_AHCLKX
. D# q: M" @; u3 P4 z2 T2 w4 [| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */ P# a$ y' Z! j4 E
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & d4 [7 S U% \& E' a# C
| MCASP_TX_CLKFAIL - g( r- B- c b( R1 K
| MCASP_TX_SYNCERROR% t0 t0 M0 u1 V. C! t
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- g1 w# }/ p. t4 d| MCASP_RX_CLKFAIL
, n* r/ n: }( Q% A! y| MCASP_RX_SYNCERROR , V. ?7 D- P, a, t* k
| MCASP_RX_OVERRUN);8 I- b2 U `+ s. l1 y# }
}
static void I2SDataTxRxActivate(void)# N' Q9 S+ j, R! C! i1 I' R
{% |! q1 v) u7 D3 f' r' I
/* Start the clocks */
3 N6 ^9 ~9 A" e; K$ T# F# JMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: Q/ h4 V+ c4 i: n, q% N n# |
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */3 e1 w6 L! J9 H5 }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 u' b. ~# p- E- h! Y
EDMA3_TRIG_MODE_EVENT);
' b* S8 G, e% e+ ?3 a. Q6 d' eEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 q2 b4 X D( V% ]/ h8 T. z/ a
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
& T7 Y+ f6 \# G2 p' fMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: c8 {, X \8 W+ hMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
/ ^' O& c2 ]5 R2 Xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
3 `& y! @% L4 B* f- k1 Y: WMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);. K' w' e4 I& Z# x0 G! e0 R$ P
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
# c$ E7 S/ _$ y( V1 B _# v}
+ L* c/ C6 @5 u请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 ~3 M3 N# ~% C8 z" G
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |