嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
9 U% D: @3 l. r5 X2 e1 W& @input mcasp_ahclkx,$ X+ ~7 p4 s4 q T
input mcasp_aclkx,
* m2 [, c; A" G. f6 _input axr0,
3 s- k, ]1 e5 b/ Y$ S7 ~; }- w* S
output mcasp_afsr,9 c- N" j1 p9 ^( b+ e$ e) b/ E
output mcasp_ahclkr,9 C) h. b! v+ }) ~
output mcasp_aclkr,
) O. m3 }# D. ^% z. X) W: y3 Moutput axr1,0 B1 p \) t O
assign mcasp_afsr = mcasp_afsx;
9 C9 R& I8 u0 P1 w- k0 \: i; {assign mcasp_aclkr = mcasp_aclkx;7 ~+ E% u A* j, W3 T9 g/ \8 i! l: y
assign mcasp_ahclkr = mcasp_ahclkx;* A, k; E# A, Q- Q1 o
assign axr1 = axr0;
4 k- k T4 o, J( M8 I( Q2 h/ g+ V! L! [' Z" E$ q/ Q( K7 L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
+ M' \0 Q5 ~6 y* G8 N- \3 Qstatic void McASPI2SConfigure(void)) K; P* o% n+ |" H, h0 A4 ^
{
! ?; _, Z, ~: E p6 a7 ~+ l3 i2 jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);: u* |" _ _" Y9 |
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */: H1 o9 |. t6 B) `8 ], W, s+ |
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 s D8 y( a; O
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
" \2 q8 i1 Z9 yMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; ~, k0 X) b( \4 r5 U
MCASP_RX_MODE_DMA);1 @7 X5 s' u4 F& w
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 u0 `5 j( T+ h# ?: qMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */" n; Y5 b, ^5 c1 r; u3 I* Y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) t& T% w; v. a6 U) R I* V
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ ~$ o" K2 ]4 S4 q0 ]' FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* L L9 t4 O, ]& r* r6 IMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
6 ]+ e. Z8 P8 p" y1 eMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
$ i8 f& A5 i6 m; tMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ T% Q) ^1 u, c, I* |( ~( m
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& w+ M3 e* u7 w( t0x00, 0xFF);
/* configure the clock for transmitter */
- p4 l9 S9 `$ i) m+ DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ M' d ~7 x( \# ? w5 W9 nMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 L0 o8 t' P5 m3 K* WMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,+ @9 g) U" _+ A- D1 m
0x00, 0xFF);, E. v- c$ ?9 U
: \2 y' G. h! T* z2 T
/* Enable synchronization of RX and TX sections */
! _- |5 v: J& @3 l' [McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
t$ D" x% ?6 e. F" ZMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& _$ o/ g5 x& R: g: [
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*3 e% z: X6 f) S `3 h: E; T/ h
** Set the serializers, Currently only one serializer is set as
" |+ e# X1 r1 s8 Z) n/ }** transmitter and one serializer as receiver.
' n- n8 h0 n0 m*/) D% }1 e: ?% w2 q* |$ T3 u9 x
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);4 {3 h$ v3 _9 c |7 L" v& N) p
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*+ O. k6 H: U, k/ `% Q. N
** Configure the McASP pins ! m! e W, u( P( i4 ?0 V6 x
** Input - Frame Sync, Clock and Serializer Rx! j9 w! o% V. ^7 e; L" w0 P
** Output - Serializer Tx is connected to the input of the codec 8 @5 f/ l. J# u ^. f2 a
*/% ]5 x. W' B8 s) `6 N
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 q" L s4 G& F5 v2 v, [- fMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 e) _) ~7 ^( SMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- H7 b4 R& A) B0 |: i+ j| MCASP_PIN_ACLKX
6 X; Q' v, Z& Y* ]- Z: q% Q% P% M| MCASP_PIN_AHCLKX
8 B' K. Y$ U# S| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP *// s) G' a' J: I7 I, l
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 M! a; r' _* W) N| MCASP_TX_CLKFAIL : |4 i; Q/ Y2 {8 q. c
| MCASP_TX_SYNCERROR
0 j0 V6 z0 [( X2 p0 o/ E9 K| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 Q' G1 k3 \/ A$ D
| MCASP_RX_CLKFAIL5 k: j& Z3 X; S9 T" f
| MCASP_RX_SYNCERROR - D6 q9 W; }& S) `0 a7 L. A# K6 ^
| MCASP_RX_OVERRUN);5 R, K8 G+ m) Q7 L0 s0 } s
}
static void I2SDataTxRxActivate(void)+ e' M8 j. _) I7 d1 d% {
{. n3 v& j+ J" }7 Y1 C
/* Start the clocks */ R5 g& \7 R- v& l; z) A( M2 V5 l
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 b( [0 U; Y5 P) _; S1 o' p7 X
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
1 {$ o W7 p/ O+ u* s2 g; [EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 s2 Q; W3 O) \3 X2 }
EDMA3_TRIG_MODE_EVENT);
0 {; s3 G( l) h: L$ yEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 k( P: z6 T3 j( ~ h" O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */$ \! a/ y, s* J; B% {- u
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ c* K! P7 M; K$ E
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */8 @9 c0 O+ l0 K' g2 M
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */" ]7 T/ O" S( V1 |9 S
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! y- `; w3 E" E
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% s* V( w t* I5 g. Z
}
( G+ x% Q6 O) U+ |# M# Z, H请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 }( E" c# R+ Y5 b0 y' w
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |