嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
: p( g. h; ~" X0 q9 i/ Rinput mcasp_ahclkx,
6 f$ Y' D' \2 u: S5 W$ o- Vinput mcasp_aclkx,: L! o( `, s. }% ]
input axr0,
; \2 O) E- t. G) R$ O. s4 t: U6 Q/ m" b, t* @8 w s' B1 O V
output mcasp_afsr,
9 J! N0 M1 }. {/ o2 D! P4 Youtput mcasp_ahclkr,
: q( n; K% T' G! qoutput mcasp_aclkr,
$ ?8 _- Z; [0 s" x( R! A: y* K+ Qoutput axr1,
3 y3 ]' o6 Y$ g" t' m* Q& A" f
assign mcasp_afsr = mcasp_afsx;# k1 [/ |2 Y0 q- C! ?1 q
assign mcasp_aclkr = mcasp_aclkx;
, D# c* L: w& J, d3 B5 A$ a" p5 Cassign mcasp_ahclkr = mcasp_ahclkx;
) {2 a" @8 S6 q/ kassign axr1 = axr0;
$ I! r% @$ N K+ `( X- N( K9 Y: U$ e8 U; C% @/ i
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 | d. {. K+ w: I, ]
static void McASPI2SConfigure(void)+ n# y+ ]5 Z* |1 x) }# V
{8 {) _5 t5 W! U: L
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
a/ C7 r8 Y# `6 ?McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */1 F/ a1 }3 W5 Z% d0 E& | D
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" d0 R! _* C% l4 w5 F. v) d1 T
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
4 C$ B" i' }: x, ~; }; r1 E; S$ aMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, R V" G* l) {
MCASP_RX_MODE_DMA);! P$ K+ t4 w/ c3 }+ X0 K
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( N* i2 T5 W' _9 R3 l# L lMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 v2 a' x- z3 U4 y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , {8 O9 ^* q8 \9 T2 \
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ o5 u' D) ?% o6 x& k" y) MMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- z6 B2 P3 s8 o+ x1 n3 P5 pMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */4 S" }* \6 b, _% {: X$ X
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ Y; ]7 k0 }% B1 Z# p4 B5 f! l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( g) G/ L" B! f1 w# nMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. K P B/ X+ B& n0x00, 0xFF);
/* configure the clock for transmitter */
`5 N- Q" ^% @3 I" u8 r- t+ |McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 ?/ A: i! [! |0 a5 x5 LMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
2 z+ b, H9 E4 LMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," e; j3 \' Q# D# B2 Q
0x00, 0xFF);; ^ i1 G& L$ j9 Y
* f: O/ y+ D- K' G5 y6 G
/* Enable synchronization of RX and TX sections */
1 T5 B7 F+ e; d u" x2 h6 jMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ X2 z& L7 S- {% }% XMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# x# L, q' M! Z" G5 ~( C9 p8 \2 VMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*6 F$ d9 f" j( f8 E
** Set the serializers, Currently only one serializer is set as0 }- K$ }" O, Z+ y" ]) Y/ T e
** transmitter and one serializer as receiver.5 ?# x4 N8 l e* k( w" W4 ~) S
*/; x' c# u" V/ M8 ~4 T" R
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, u% S7 g5 Q* t. }$ O0 `$ r( jMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
6 @7 Q& \' H) C; Y- }$ o** Configure the McASP pins 9 X5 u, A2 y" s, ~3 s( E$ n5 N
** Input - Frame Sync, Clock and Serializer Rx( o: m1 d! k' c% Y
** Output - Serializer Tx is connected to the input of the codec
, u! s+ w4 N$ h1 n" e+ D! x*/
7 V' X4 t" l, JMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. R. c' v; ^6 T, @' K) b+ J/ tMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 Y# E" Q4 _2 r1 |9 V6 P1 H( tMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' g& r- V Y8 u1 Q5 g: {+ d
| MCASP_PIN_ACLKX
& |& ]2 C5 E) a1 A" i| MCASP_PIN_AHCLKX
. D" j. U, w+ x| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% y: B" {0 @9 D1 H
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) ?2 s2 h) t" x| MCASP_TX_CLKFAIL
* H6 n: [* v2 T3 N| MCASP_TX_SYNCERROR
0 e, n7 z/ u% @' M( W5 O/ `) C) Q| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* f% |1 Z3 l9 X1 @. ^: Y* a& b7 v| MCASP_RX_CLKFAIL: z5 O0 I: u/ \4 q# s
| MCASP_RX_SYNCERROR ( I. y6 Y0 z- \8 o6 Q6 C: e+ u
| MCASP_RX_OVERRUN);
) t. n( m8 u0 J" N9 ^! Y}
static void I2SDataTxRxActivate(void)- }! \ ^: {, v% m: a* b
{. i4 ^" Y) y5 B- Y5 W5 b' ~! Z7 A
/* Start the clocks */3 X: S# o, J+ x/ t# e' u& i u" C
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL); O9 V% c+ Q% G l7 x6 x6 n
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
Y7 v; @. B/ d! Q7 N$ T2 rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 a- k; Y& X' {) P+ e# J2 L, c
EDMA3_TRIG_MODE_EVENT);
! B1 ^) n, z7 q% ^; JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 Q: W7 o& C+ c* i( O3 U# O9 A' EEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
* E, |% Q( x7 n6 l# KMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 j1 L) y; O* _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */% d( I& v& L9 [/ B' e
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
# w4 ^& y! s+ s$ }McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 _+ C, `9 Z) J- [: \
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);+ T/ ]* K0 u5 F- T9 B
}
: T8 _: _8 J2 w" m
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: O- z. u7 b1 @+ @$ M) F. S7 a
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |