嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,2 ?& r9 D# _) t; ~5 l
input mcasp_ahclkx,
# _# V- s: s: Q. e' b0 Yinput mcasp_aclkx,
0 w8 g3 J' f+ T9 yinput axr0," h* O" G5 ^( `/ i
# t/ H6 j- ^# v* r* y
output mcasp_afsr,* o1 b3 |6 ]5 U( L& Y. `; E0 X
output mcasp_ahclkr,8 H/ b) {, J8 N u# v7 X# H
output mcasp_aclkr,- b+ `7 n! I* V4 {; P$ A
output axr1,- R w- a5 J8 C. ?. i
assign mcasp_afsr = mcasp_afsx;& P: `+ ^3 ` X
assign mcasp_aclkr = mcasp_aclkx;/ u: i6 i' B# |) x Q
assign mcasp_ahclkr = mcasp_ahclkx;
5 x/ Q8 N* G' Z8 \9 G/ T9 L( ~assign axr1 = axr0;
* z9 E+ J4 \( U4 ?2 k# m9 w# B
5 T' Q M9 f. l; E/ n$ V在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
/ M, T! E( y; v7 b2 Vstatic void McASPI2SConfigure(void)
6 p: |2 S, c- C4 e{
3 G7 e- Z- f. l/ iMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 Z) y' E( A) n4 m1 E( aMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
, C8 l( s" E) f+ t5 ~McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 o4 P" S2 h- v: Q+ {/ MMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */- b8 e+ V1 L% K3 ~+ R# t- W
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ ^+ e, V2 H$ n0 j4 uMCASP_RX_MODE_DMA);
$ B+ i# m- @) r' g8 g/ E4 C' w$ a7 ]McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" C0 f( o, L/ N* r$ I+ HMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. Q+ @- k' f# T) `3 ^* YMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - U3 j3 L1 A7 c
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 Q( x: N9 l- R" ^. Y" [: Z; g; p6 H& `McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 J! j7 ~8 y" o6 X% u1 JMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
5 b$ |7 X% e2 I! ]* j0 W' hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
1 r _% e: }$ Y. v! y, mMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 J8 V1 p( C# z( u$ i# z. O: W, mMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. E! ]) c# Z0 Q/ q0x00, 0xFF);
/* configure the clock for transmitter */
! q: Q! T7 F$ V& c" |; PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 M4 g0 ]8 b, ?* ~McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * e* U9 D7 t* N- ` |# |
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: Q; q( j1 M" q" v# j# w0x00, 0xFF);
+ G* a+ p7 X7 ~" f3 E
. F9 P& o, ?3 }; L: m3 s! D N! N/* Enable synchronization of RX and TX sections */ 8 ], s- `8 Y% s& h3 G. u8 G) U8 A! y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ j, ^+ r$ ^/ ^; kMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- `# B- H5 r" g2 I* P5 g9 N6 _McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( [8 v, g2 _5 z( K1 ]' \** Set the serializers, Currently only one serializer is set as
* Q2 S) R7 h% y** transmitter and one serializer as receiver.
* d# ]* Q B5 n. w*/
- T' Z& n9 R1 |. h8 `' IMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) ]- m* k% e& z$ c6 W$ Q2 D& R
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*- {2 K1 Z2 Y; n( b1 T) z l
** Configure the McASP pins
; F: w0 a4 V' V2 j$ K) d** Input - Frame Sync, Clock and Serializer Rx! M$ i8 x% q/ }6 E2 {9 u
** Output - Serializer Tx is connected to the input of the codec . {; G# S7 s; V" A" @0 E8 _
*/# s% b+ a: h1 e, K$ C) g( R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ b& w3 T# ^# O: PMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 p- s8 L5 X# y" A9 sMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 y8 M# T; x8 a) d1 e8 c$ N| MCASP_PIN_ACLKX. s3 K) }6 g& f4 i
| MCASP_PIN_AHCLKX
& T0 I! x5 u; K9 n3 y| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */5 r0 u% o: {, H* e$ N% C2 I8 _, ^1 R
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' s8 d, h u' L" g3 N, e% Y| MCASP_TX_CLKFAIL % B! I% j9 M+ \, r- C* A
| MCASP_TX_SYNCERROR
. P. K/ \) u7 o3 O, B. v4 h7 n3 n| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
T4 U6 y, J* M0 B9 Z$ r| MCASP_RX_CLKFAIL
) w! a, n3 F7 S' w3 \* z# W' ^| MCASP_RX_SYNCERROR
+ h. m" g L2 C3 I. o+ ]' ^| MCASP_RX_OVERRUN);
8 a# y0 M! v9 X4 }9 w# ^}
static void I2SDataTxRxActivate(void)
/ G7 Z% w; u9 v% S5 f/ J( b{, ^/ Y, @9 O/ }& {
/* Start the clocks */
1 i* z: z7 f4 ?) V. u) nMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 x; Y, L7 e+ r4 r( _0 UMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */0 X- z9 f# B( @& x. c( z8 R; m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: m/ J4 q' ? l* Z. O7 B8 ^, Z& t
EDMA3_TRIG_MODE_EVENT);
: G8 }0 f$ t! jEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
9 Q% ^5 \4 r1 v2 k) E7 g# ~# uEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */% Y+ _& Q8 k1 t3 t& m. N
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 E8 j/ G) S; T6 vMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */; O0 h* s! M; g8 z4 R0 o5 j
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */5 }. |. e( {2 X6 L# R/ n( o5 g; J
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ n3 c1 D1 P: T/ g9 ?
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; w9 P! ?6 j! {+ m3 B1 I( F}
6 E6 ~' N2 q0 W! E z6 U请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 H; E$ @6 H3 P
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |