嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,) e' ~! V4 D; t- Z0 B- q3 A
input mcasp_ahclkx,1 M+ J0 {8 `: j$ ~
input mcasp_aclkx,
3 z" q4 t& m! ~8 F: y' K) winput axr0,( V) N* t; T6 i: A
# ] P1 c$ h5 n2 u- O' s8 }
output mcasp_afsr,
* ]+ K7 J4 D0 Boutput mcasp_ahclkr,/ V1 {5 o7 M0 c6 r O; r; t
output mcasp_aclkr,: z5 v( E1 l: e* U) _' G1 z
output axr1,
* w \ c$ c0 J/ i6 Z5 S- [& L5 Q
assign mcasp_afsr = mcasp_afsx;) `2 n& [7 M7 h% M( m; j; l/ }
assign mcasp_aclkr = mcasp_aclkx;
2 {; w6 @4 }# J* c' sassign mcasp_ahclkr = mcasp_ahclkx; Y3 X0 m, u% L3 B
assign axr1 = axr0;
% e. r8 c0 @2 |" p) T, N
9 p( i! L7 x: \% x2 @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( T8 ], W$ ^* ~2 Q( T. istatic void McASPI2SConfigure(void)
1 b5 m/ B5 i4 h: Z; i! o{" v# F D2 Q# \: W- J
McASPRxReset(SOC_MCASP_0_CTRL_REGS);6 q2 J7 P2 a$ z: z& J: F9 H6 @
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */: }, j. n% B' n. D8 ?
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 O( q$ x" T- \2 v0 Y. e
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */+ y1 P3 u: g0 P( T, g
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# `. w' E6 e$ Z1 R4 {- v
MCASP_RX_MODE_DMA);, G$ [- d+ Y2 O5 n3 _* [
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% C, I! P* q" ]; ZMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 w# `$ L' g5 x+ W4 e2 |. ^+ i" hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 n+ O- |" e! M7 z8 OMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 c- _ ^0 E+ d. R/ s- h# GMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, |- ?/ ]' C0 V9 b7 |MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
# n8 x1 T. v1 ]& }" p& zMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: K2 Y$ b9 d0 e3 v; ?* ?McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 a% e+ s* N8 n: Y t+ oMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( G& b2 S0 H% Q, ^5 p0x00, 0xFF);
/* configure the clock for transmitter */: H- c; E8 q9 h2 y( V
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);9 V, Z- `, ~! e% }9 s0 C
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + W# a& u, }! b6 }
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" }, P/ |: O# P! u( v' X0x00, 0xFF);' S, `$ {; _5 j7 j/ B; P7 B) Y( [
9 f8 Q1 j* z3 b; t/ ]/* Enable synchronization of RX and TX sections */ % d1 {# J" r$ ~- l4 x' C
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
: G8 `; e2 Y2 \McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) e' I' y: ^3 e. g. X
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*0 J5 m$ N' H: L9 v0 y4 V
** Set the serializers, Currently only one serializer is set as
: ]+ _4 a3 R% q0 m) m** transmitter and one serializer as receiver.
9 S$ I8 V8 N6 _4 f*/* B# F! E e1 ]& T! k
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& Q; Z, O% j/ K# A |1 l
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*' O9 g5 M: S$ P5 P
** Configure the McASP pins
6 t; o- Z% g& d2 u9 G+ n2 d) B) m** Input - Frame Sync, Clock and Serializer Rx2 X. K" f, O5 P Y3 s- b8 t+ q! d
** Output - Serializer Tx is connected to the input of the codec
0 b3 o0 P4 N3 s+ |) S6 N*/; F$ b% n7 q) s
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* G& {3 t7 r _+ C; dMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- w2 r# Y& k" ~. q6 b! M
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
/ Z% Y/ ^8 v* a4 h R, n p" H| MCASP_PIN_ACLKX" k( @/ \' q6 ?/ h% C9 v
| MCASP_PIN_AHCLKX
8 T) S ?6 p6 }8 a2 p| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */$ v& _2 h4 Q4 s$ U: o& |
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; d- w. h: A( i
| MCASP_TX_CLKFAIL $ f5 H2 i: d$ G I2 V
| MCASP_TX_SYNCERROR; Z) M& u: t: `0 ~7 I# {
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ) T# `, B& s+ s/ t# m; `
| MCASP_RX_CLKFAIL
2 S9 r+ |% E `# w+ l$ o9 O| MCASP_RX_SYNCERROR 0 y1 O9 K6 \4 I; r% Z3 S
| MCASP_RX_OVERRUN);) G: F* B* B& n( w8 N
}
static void I2SDataTxRxActivate(void)
% P5 X. ^- w, L' R% p2 q{
* ^4 m5 ^ ^ @7 L2 s' I0 g7 `. m/* Start the clocks */( {: z, B- u( K6 l3 L1 C& S
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; n7 f& ?1 B5 N. J# z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */& v1 J5 _) Y9 r
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: J" _0 V V- J' h$ L8 ?5 i5 V& t7 [
EDMA3_TRIG_MODE_EVENT);
# t. i8 P$ r8 r7 Z2 v {% [( V5 A( lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( v/ z% \0 q0 W7 x' z8 s) ~
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */+ Z: K5 c( B) _6 z1 b& L, G. b8 O
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 u. [' z$ O( b% F4 R% gMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
: G, c! @7 c# t: o$ W. F; k. F2 ~4 Uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */. S9 j% \. \* D5 r( a% G$ h
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' h6 @0 v9 e: M4 wMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 p, T+ v; `, f/ O' T1 L}
3 U5 ?' P" ~ F7 y9 { r2 Z
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 @& r- G" f- V. L
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |