嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,# s1 ?, P5 M4 l8 @7 j' ]
input mcasp_ahclkx,
2 f( r0 F( D/ finput mcasp_aclkx,
+ b3 y* _! I4 z n. c' }7 X qinput axr0,( l4 i* @: m0 g# M& j
, l, ^: E' |' H5 _# e7 {/ X0 O
output mcasp_afsr,) B3 b7 K+ x4 A$ o w
output mcasp_ahclkr,
4 P4 M8 Z# I% G7 c$ m. N0 A a; Koutput mcasp_aclkr,
e$ i P Y( Boutput axr1,4 F8 T+ @6 q, i' W; C3 S8 x3 y0 h
assign mcasp_afsr = mcasp_afsx; [! C/ y) O) j4 W
assign mcasp_aclkr = mcasp_aclkx;$ C; m4 r! _/ D/ B1 R7 `* F, W1 ~# q) y
assign mcasp_ahclkr = mcasp_ahclkx;
! X5 s; O! P! H. s) ^% R) u5 ~assign axr1 = axr0;
( c7 q8 d& r9 F' U$ N- k% @% O
2 j; o- c0 L$ s* h在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
, L N0 Q a) A: r; y, T
static void McASPI2SConfigure(void)6 z) W3 U+ E0 `, J' k3 q
{
' ]7 L, w2 y* h; p0 m. u+ X/ PMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
# ~# y7 r+ j* s4 b4 b& z7 {McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */6 N4 ~ u' \& u' Z( G- N$ \5 k& G
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 p% x' }5 f! J; e9 q6 p
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */' o% e% C, z2 B0 |/ B) j7 l4 b: _5 j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: M* U% _' g9 x/ h8 i
MCASP_RX_MODE_DMA); b7 z* @! `4 H {( ]& Y; O
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, O# f8 k7 b/ t! a
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 Z1 s: _) C5 |" Z& Z6 _- I' kMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 0 z$ w A' i5 t. s" I' s
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 F' c8 k8 t) D* z- m- R
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ `7 G, w; @2 ?/ e2 ~
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
/ `# `5 i' M0 L% Y& K3 H2 OMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; v( f5 r4 [# I6 L# x: QMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 b+ p G+ Y! ]- p8 t/ W9 P
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 n) k9 i( z: H" K6 q9 p0x00, 0xFF);
/* configure the clock for transmitter */
3 r' j! \* n" ^5 }McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' Y' L. q" O: ~/ q! ]$ PMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, w9 d5 z, f! W" p5 Z* q1 }McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," |+ T5 B3 c3 ^' v4 U. b3 b
0x00, 0xFF);
: h. G: i, x- X7 o8 Q
) {3 g( R% q; m4 m7 g6 N/* Enable synchronization of RX and TX sections */ $ {$ _( g# ?, l+ [3 ~6 c) w0 x
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */# Q, `' V, o3 P" [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ I7 ?0 _$ c6 b7 n- }6 y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*: h1 Y9 q5 Q9 t \2 C( `& h
** Set the serializers, Currently only one serializer is set as$ T: s0 ~4 D; T$ h* q+ i1 z( _
** transmitter and one serializer as receiver.
! n" n1 F* W! T5 _9 A N*/
. c& h( U* Q I8 I5 OMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 P3 H% q4 H* I8 i: z# l6 W) v6 `! fMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
) g% z( C/ d) a( \1 l' W S** Configure the McASP pins }2 O$ \2 Q7 x# d
** Input - Frame Sync, Clock and Serializer Rx
& r! }) r0 N3 q6 |( J** Output - Serializer Tx is connected to the input of the codec
/ A# H/ z6 r* k6 w: D*/
# Z5 w+ _* G( o1 \% _: WMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( P5 J+ U( r/ S. f0 |/ w
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));0 t4 K( A' q" Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 r% X- L8 c3 S3 w9 u
| MCASP_PIN_ACLKX
4 k3 F5 b; [8 o2 H8 n| MCASP_PIN_AHCLKX. R8 m, F+ A7 t# \7 r7 _5 c
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
& x5 o; z% G' v2 qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 g& `# A( M! p9 D+ R. w1 K% \| MCASP_TX_CLKFAIL , F& g; ~' W2 ]
| MCASP_TX_SYNCERROR1 l; \2 u5 p9 P" L
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! }- ]/ r# c! ]( \5 F2 u2 H
| MCASP_RX_CLKFAIL
9 L, {/ \: J7 `7 M; o: {# W| MCASP_RX_SYNCERROR # S) Y8 C' g/ D! P" V, M
| MCASP_RX_OVERRUN);* `4 }$ B9 h! c
}
static void I2SDataTxRxActivate(void)
" Z4 p: G, N& O% y0 g{2 I# Y N% [+ C6 }; c
/* Start the clocks */$ l4 U: J9 \! P) g, J }8 h0 ~3 e) C
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) t: Y* A2 e! V# i5 jMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
* P' s- S% K; }9 } xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ U6 t7 x2 d% LEDMA3_TRIG_MODE_EVENT);
8 S% s6 S* K0 D9 q/ WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 B; z5 h p) v7 U7 W" U' E. E
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
, _8 Q, e0 r& d7 ^$ _2 s! u% y5 }McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 \& W+ M* C' l' p
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */5 J& }( X8 W0 ?3 o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. ~# P4 H) C* D8 S! g# _McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 P: o6 [& A+ Q) d% EMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);6 j0 u# U p. }4 }3 S) s
}
( s! s2 C' b# c2 G( a& K5 m3 H请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 D/ J) V( G, C2 V/ _
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |