嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
8 q6 ]* i# U7 {8 a4 minput mcasp_ahclkx,
' n' t8 e: v8 n7 O6 Vinput mcasp_aclkx,* i- B. G2 L* |7 x: d7 ~! }
input axr0,7 s: T/ w6 q6 p3 b2 p
4 a) O5 u' S9 s; Q* d4 M" Doutput mcasp_afsr,3 M$ a g- l1 N6 U: n
output mcasp_ahclkr,6 O1 K! ]# `# d$ b
output mcasp_aclkr,: w7 L9 B, R8 u3 n( C9 z, ]- r
output axr1,& O. r1 Q0 N9 j# K( v
assign mcasp_afsr = mcasp_afsx;7 l3 B7 q2 H1 K$ b. U$ z, N
assign mcasp_aclkr = mcasp_aclkx;
0 X, s1 K, k7 q. uassign mcasp_ahclkr = mcasp_ahclkx;$ f9 n; u, s, \9 N
assign axr1 = axr0;
9 k0 G. ?" ~7 K. }6 ~1 T
& u8 q' M) D, l- l
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
- f8 T0 N. M/ Q# p7 ]; q7 {
static void McASPI2SConfigure(void)
; r# u" M: r8 a7 b) ~# v, }{# w; E6 ^5 c* K2 Y8 P
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ E; e' i# A; xMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */3 \( J' D8 B7 R: L3 m
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ q# l8 z# ?$ I! W* S7 Y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */) O O# U' Z( ~8 U8 s! ]
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! R. w+ _+ R }8 x% b" O8 l9 C- mMCASP_RX_MODE_DMA);
/ k5 a/ d4 o3 W: n# t0 hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, A. L2 x, \9 F( d8 C! w( NMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */( a/ d% E$ a; p
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 0 X& z; A7 q; i4 [9 g
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- W" }" h9 n2 K2 z+ G
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: a3 `2 c* J' a4 Q F: o6 D; JMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */3 Y9 Z* k* o) ~! H0 ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- \7 ^) m0 d5 C3 k! Z& `0 F: iMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 W F9 a9 U8 |- v L; F
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ b! x! @% _8 X- g7 s7 y0x00, 0xFF);
/* configure the clock for transmitter */* C! K1 B8 o- v/ C
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); l" Y: D+ r& K& M9 J
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 7 I# W% U/ R# ^% a2 G2 h
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, x. r4 h0 H7 h! Y1 G: t0 ?' S
0x00, 0xFF);
8 X3 f- h5 w) i6 u! Z9 q- i- v& k |! k) H5 C7 }# W2 ?: B9 d/ _
/* Enable synchronization of RX and TX sections */
* M2 ^2 E( N3 g0 Z/ ~3 Q, z9 v2 `McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
, V1 [- \: q, l ?( A3 E u8 lMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( p- x# X9 U' C" Y8 R3 W
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*0 S( x. K/ F- A% |9 @$ y/ d8 N
** Set the serializers, Currently only one serializer is set as
, m6 n5 w0 K) T8 `& B' b** transmitter and one serializer as receiver.5 t3 y+ V- {1 J: J, n* Y
*/
4 C) b6 |7 A" T0 r5 R! P) ?! L8 |' AMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& | l; ?% J4 j) u" u4 I0 a
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
, w; ~6 o1 n. K: h: K4 R** Configure the McASP pins 7 n7 h% [. t$ T4 M5 `- k
** Input - Frame Sync, Clock and Serializer Rx" f4 `; d4 N& Y: _+ I( [2 ]
** Output - Serializer Tx is connected to the input of the codec
; T7 A( V. i( j5 M2 B" ]*/4 E7 T1 q9 x: a) v# Z) Y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);# z" C6 b, I5 |+ E+ \( n7 T
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 b' ?+ a6 [; K8 a9 ^ a% `McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% N1 X6 q, e# R( ^; q
| MCASP_PIN_ACLKX0 O# h3 y' ?+ y5 v
| MCASP_PIN_AHCLKX
8 g: A; U2 h0 N+ W( z7 w4 ^| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
6 H* O! R% a- k& U* P: J- AMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- M' \0 f& z+ E/ K' E) |" s* W y| MCASP_TX_CLKFAIL
8 J% @" A4 m( Z% N8 h1 Y| MCASP_TX_SYNCERROR
% [ f+ {9 ~/ m7 _9 a4 x% x" f5 ^2 d| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! ?$ g. G+ E% `3 p, {
| MCASP_RX_CLKFAIL% Q# N4 N( K1 K$ @7 p( [
| MCASP_RX_SYNCERROR
6 N) v! P# v. i9 V! G5 M% x| MCASP_RX_OVERRUN);9 a5 M6 }. n/ h2 P% \* \# t
}
static void I2SDataTxRxActivate(void)
7 e" B. p/ q' d! \' U0 h# e. I0 H2 g{) X2 g* Q; V- V$ G1 w! C1 q
/* Start the clocks */
- [" Q: }! O7 S% A$ y. ^' X: FMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 y l3 ^. w u; u, F6 H+ V* @8 `McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
. G, O' v/ U. f$ T* P l) F7 f1 ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% W1 q X q& h* Y; Y& z7 oEDMA3_TRIG_MODE_EVENT);
7 o. P5 V2 J( D$ i& |; U# sEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - z I4 Z0 Q! f* O A0 O& @
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) _' ^0 B* Q0 r6 G+ G! A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 r2 ^* X" J3 ~5 x% X9 O) t
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */8 g; c" R( A D5 ?) ^5 k& u
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
+ b1 [4 U3 S* t' w# V. z1 yMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 K# q/ p7 C* [" CMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);, V6 q* l7 X. q" l
}
' S& S1 G+ k/ y* c( [请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) r% \/ o" i P1 [
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |