嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
- }- F9 M; v3 P2 l* `" `0 tinput mcasp_ahclkx,
( A3 q" F, i2 ?$ ]5 pinput mcasp_aclkx,7 Q: g0 K4 `5 {
input axr0,2 \9 T: S. G3 W7 c2 p+ \; p$ b
2 K% U1 T) r, Doutput mcasp_afsr,& G" o4 G, c! c# K) N/ g _' u9 I
output mcasp_ahclkr,+ D: [6 ?- v' k* w3 h- @2 ]
output mcasp_aclkr,
% }; [) D4 z) k2 Joutput axr1,- ^$ F( \( H& e! I" i, b
assign mcasp_afsr = mcasp_afsx;
$ q6 N9 {' b7 U/ [0 m2 [$ ^' Massign mcasp_aclkr = mcasp_aclkx;
( q7 g0 e! c( r0 H4 J; Nassign mcasp_ahclkr = mcasp_ahclkx;6 F) F# P* D& B
assign axr1 = axr0;
4 f/ B3 Y; M9 v+ p7 d4 l; Q' I. c, x$ @! ]! }* c' {0 H
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: [5 U& ~0 S \+ V g
static void McASPI2SConfigure(void)+ ]& I9 i5 K. |- k s; F3 y: y
{. r! q$ m! `% t& q8 d" L
McASPRxReset(SOC_MCASP_0_CTRL_REGS);) b7 g, w! f! L2 F1 H
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
0 i1 K7 g8 f# r# M" E! u; N7 k$ j( UMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# H9 `3 q+ c2 F/ S, x5 P g5 U7 l. H$ P& TMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */$ g+ f/ N1 }: b; B7 n- b7 W
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% A1 M4 W9 A e! x" JMCASP_RX_MODE_DMA);, A& x0 q0 W. O, |
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 u% s" O6 c3 G0 F; B2 n8 }MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 ^, [1 J- z2 S( vMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. d1 H$ C# r4 e- FMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ b9 Z5 N5 r" a5 h5 A1 YMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 j. ]9 S* o: \6 G) C! c/ S: m8 m7 iMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
- A) d) e/ t& A4 L9 P8 T: Z" [6 EMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 N9 M# }! I" q. V7 X
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - G& l; r0 w$ f" Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: e' m' ]* L8 B; }/ K& G" ]
0x00, 0xFF);
/* configure the clock for transmitter */
6 K" M2 z% o6 U8 F M/ f/ rMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: d, v) C# l% X; Y6 l
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: ]4 W$ C! y- N% C) Q& w6 I3 g% w5 [McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) {& f/ L5 u9 Y2 F0 ]* h( a! H$ x; e Z
0x00, 0xFF);4 ?" P% z& e' @
. q1 {$ z) a* V
/* Enable synchronization of RX and TX sections */ 8 T+ w: x; J, r% \6 e$ R1 H
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */# v) D. F: y8 V }
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- e* @8 n0 f# ]+ p: \4 JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*4 e9 p/ o- ~; @' X% j( N* |* [ u
** Set the serializers, Currently only one serializer is set as, M! H- f- A* m& \% O6 o
** transmitter and one serializer as receiver. c4 m) e( I* [$ @" w% L
*/7 n5 F ]; W1 q7 O
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: [2 C8 \, t6 ^& k
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
: S& a) ]( F$ }: J) ^** Configure the McASP pins
0 G5 j8 \$ _ y** Input - Frame Sync, Clock and Serializer Rx6 H1 Q w# T: K- O7 w" F; m
** Output - Serializer Tx is connected to the input of the codec
8 z1 s2 W# Z% G3 L*/
; q- `* [3 v: E! r% L$ sMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 F. b: ]9 H/ x) K# c- O* C, ?
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 m0 b" j# I, J) q. C$ E- X( hMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& s/ h6 o3 m" i' e) c| MCASP_PIN_ACLKX
* H8 \# _; d4 w- G# ~9 R% p. W$ C7 T' P| MCASP_PIN_AHCLKX
+ r) e+ v* ]0 E% C! E| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 h. N6 \% a1 _McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
8 G* R1 t1 N' }, R/ E! v. e) l) s' U| MCASP_TX_CLKFAIL
! p: o. W- C2 S/ ~& A| MCASP_TX_SYNCERROR
" {0 d, v: D7 U: l2 o4 o/ }| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 P- D r2 {7 |- d1 S( i| MCASP_RX_CLKFAIL
4 I) o* E/ l3 ?, f( V2 T/ l| MCASP_RX_SYNCERROR
! W6 J* X& m( [& N+ A5 P& \| MCASP_RX_OVERRUN);
( d/ j* |5 M# A% R5 Q1 r& B7 b4 B}
static void I2SDataTxRxActivate(void)
& |6 [! d9 {# C* P1 A{
+ G" R, `" K$ j) f% ^/* Start the clocks */
# K5 D+ x' B- J @1 N# pMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 v3 L- T( T Y8 ]( K" V
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */- H" n4 K) q2 N. L4 N2 F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ s+ J+ D. W1 E ]# z( S H
EDMA3_TRIG_MODE_EVENT);
0 V: O$ \8 z* L& \EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 d1 \1 J; s2 a% D2 m6 I" S( @
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */' T. g1 ~% S3 _+ h7 S0 O+ Y4 A# g& W
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 e) F( C- H5 z3 VMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
; }& b5 j. t5 N' s9 k m0 |1 s* owhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
3 v- a% I& C5 VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 _7 r; R3 Y5 A# D
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, ?& z/ L' B& p9 W9 Z
}
( Y" r: e& {( C& w$ W0 b, ^7 I
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 M) i( t! M& b M9 p
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |