嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
4 @- j, D+ i, o& J# ~7 ?input mcasp_ahclkx,
# y$ j2 _ S& C4 h; l% zinput mcasp_aclkx,2 m3 j2 R& K6 C" t V
input axr0,
$ I3 }/ ^. R( }3 Q& w
/ X+ W6 c& h$ youtput mcasp_afsr," I) l6 q% S1 l1 R1 p
output mcasp_ahclkr,
/ v/ z7 ~5 i- y$ P( t6 Joutput mcasp_aclkr,
' W L% T2 T! ~. ^( R6 |$ T- I" v0 Boutput axr1,' {& f. O: l- s# ~7 o8 z
assign mcasp_afsr = mcasp_afsx;8 r d; V& w8 R% G% ^" g; y3 J
assign mcasp_aclkr = mcasp_aclkx;* I( {: ?+ _& s. k
assign mcasp_ahclkr = mcasp_ahclkx;8 P3 \# ], l5 W* Y# D+ }
assign axr1 = axr0;
: i3 L A4 [+ a+ i& m. u, [+ I& x2 ^8 V2 S
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: f: |+ _; N7 [' h [( b
static void McASPI2SConfigure(void)6 g5 B3 Y. V8 L) ]- k2 Q( i2 i; U- M. D2 |
{
. w$ E+ \6 L7 V$ n+ rMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
- Q! ^2 b" b' A) gMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
; t2 C2 \: D6 n8 h3 a* `! s% jMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! _/ P# e% y9 F6 _, MMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
. e$ c9 Y* i8 W$ |" \McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! ~- c7 Q: f- c9 S1 l0 z
MCASP_RX_MODE_DMA);$ \6 E* W. q; L& ^1 \ c! @, f
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) m6 B1 W8 E4 ~- F7 i$ \MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ S! b/ o' v4 V- X7 P2 wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + d6 r. v. b! ]" f8 U) J3 b" b
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 c. I( E6 y' L5 G6 p5 ~, c/ `
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! x- t. G3 i" M* u* yMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */8 A' {8 E3 v- h1 {
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 Q" n: \' M5 `( l% U. E7 j* }McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 2 y6 x+ C% N4 u. S; y. B
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# D5 C+ A( q" a$ e/ r2 t+ Y- \5 i
0x00, 0xFF);
/* configure the clock for transmitter */
S, e6 O! y4 I' v% |McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 s( a$ v! _3 z* [) \; s
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
* z& \$ f, Z( I% U4 B8 o* {) bMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) [0 d+ q* s: v5 B9 {0x00, 0xFF);, H) J& V$ t1 N; x. w
2 V, ]4 k( a' T7 Q9 _* I
/* Enable synchronization of RX and TX sections */
: F& r, `) H& |, ^4 NMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, q) L C& q4 b0 e8 j) T: E) I
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 a% M& h" z& e
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*6 n. d ~: I1 N) D. _3 H& I# f% q% k
** Set the serializers, Currently only one serializer is set as
4 B V2 ]3 w; ?! N( d& }2 v, K2 v+ [** transmitter and one serializer as receiver.+ ~( d' ]( N, A8 k
*/ ~( d! q5 o: z9 _
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ j# }) ?8 y8 c2 K: `6 H1 GMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
6 r: |' g7 x5 P8 w3 ?** Configure the McASP pins
0 [: Z% K7 O, q** Input - Frame Sync, Clock and Serializer Rx
1 |1 X+ q8 C, i, [. H1 {** Output - Serializer Tx is connected to the input of the codec ' S& L5 |6 \2 f6 w: a
*/
8 g+ P8 w. ]$ g- [1 R- H- YMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 `3 r! E$ O& x( l5 R4 sMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ p$ {$ U( d! S0 s+ D" I b$ ^McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. P% Y0 x4 O" o9 K
| MCASP_PIN_ACLKX
q+ o4 Y% u0 J- m( K( ~: _+ l| MCASP_PIN_AHCLKX
$ O! A; m2 O5 |. n| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */5 h# o. a( E# z0 B* \$ j: M8 ?, J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 K6 s2 y6 d$ I3 F3 s" @* l1 j
| MCASP_TX_CLKFAIL & p# C' i! ?0 h& [$ w/ |7 f c
| MCASP_TX_SYNCERROR
8 U0 t. U' t- @| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
4 O' n, X q: ~8 Q6 u c6 i, B4 I| MCASP_RX_CLKFAIL+ I& K6 m/ J9 v3 t- x% X$ s5 ?
| MCASP_RX_SYNCERROR ) K& V! e7 }1 t7 U
| MCASP_RX_OVERRUN);
3 o7 k% o: g/ m* s# T3 I}
static void I2SDataTxRxActivate(void)
# E# U7 n: W: x: o& l! N( F{; S# U2 s. ]1 m3 E: `/ C7 u
/* Start the clocks */
6 Z0 X! y; ]2 {, FMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
( W0 _" C% L) lMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */5 Q) {% N: M9 H" ~' a/ \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 l- Z2 [9 X2 a4 s1 ]' d" d gEDMA3_TRIG_MODE_EVENT);9 g# |" ?2 r% S* U
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 O1 ~$ Y/ U$ D! v+ ~4 A! E
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */1 R2 u4 m5 z0 |$ _% ?7 m5 n
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 ~2 D x; D3 v) J7 fMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */$ e$ c. Y! y; D4 E3 ~( B
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
/ K" P6 c' ~8 WMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 ]% j$ |. m/ e$ Q2 q
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, F" D, A( l/ _' P; l}
! Y- t t9 d R2 F" N3 H; X# n' |. B l
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 Q! Y! h1 u# l
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |