嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,% C S- y5 ]/ r2 d! L
input mcasp_ahclkx,
1 c5 O, u' J, v3 Z1 W' i, q% c: Winput mcasp_aclkx,& R; i; x! y- r3 Z" V, O
input axr0,
5 M. y' w+ z8 ` y
9 _5 B! o" h, T( B& Eoutput mcasp_afsr, C% D2 S1 t5 r& C: }
output mcasp_ahclkr,& s& n0 A6 C+ Y& G6 E3 }. F
output mcasp_aclkr,7 S% M* [1 C* r7 I6 |% D& e
output axr1,
/ S5 ]9 ?3 ~# g4 Y% [+ w
assign mcasp_afsr = mcasp_afsx;; ?0 @! W1 c! O, _' A
assign mcasp_aclkr = mcasp_aclkx;
3 ]( f" K4 n+ J6 s5 j. ^assign mcasp_ahclkr = mcasp_ahclkx;
# Z5 n+ b- y; c+ Z! n0 kassign axr1 = axr0;
' W6 S2 U* M, |, K- V) n/ M/ k0 Y- L/ B1 v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" [1 n, ^* H- c }9 N5 K- X- Vstatic void McASPI2SConfigure(void)
8 q% j& |$ }" U% Q{
8 z) J8 k$ M9 J2 AMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
& {8 e+ P( ~ P4 {McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */2 c6 l4 J, }) T* [" d& g
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% k" B' W. Y. O6 l% B# W- UMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */8 c% T- ~& R8 J5 e+ {/ |+ H( ?
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, ~- ^5 f6 W' w7 L. J; b* S& o" ~
MCASP_RX_MODE_DMA);' n/ l9 T$ C" R5 p! d
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ |+ B5 Z7 ~% \9 ~5 D) z
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 p4 X+ F5 C ]1 `1 ^McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 P2 B ^/ p8 @' M# y7 NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 D Z3 B ?' o( a
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 w1 p) \+ {& z7 i
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */$ c* P/ g- c5 b$ V" {
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 M$ h4 m# I* t& x- PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); / \& e0 r3 \1 G- S
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 z6 M5 r% t, Y' S1 E0x00, 0xFF);
/* configure the clock for transmitter */$ Y5 k3 ^: |8 b; Z r- R% z! y1 q$ ~4 W
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ }( n7 r: x3 y% k( d: j& i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( w1 Q* o1 P3 k f7 e$ Q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 c. F! u! @* P3 q0 v0x00, 0xFF);
7 h9 s& f) ~7 H; D4 o8 C( x1 G" h t
7 u* G$ A5 q/ g' k5 p/* Enable synchronization of RX and TX sections */
7 C% \8 G' s3 IMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
; }3 E7 n9 S6 O7 o/ z$ ^McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* ]. ?+ J+ R+ |7 q4 p+ hMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*& n7 d1 r+ x( P3 m, _: D R
** Set the serializers, Currently only one serializer is set as
5 O- P6 d& ^5 h- P0 w7 z** transmitter and one serializer as receiver.1 t, T) l" ` C9 E4 p
*/9 W' Q, }9 P; n* V4 m
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ j p4 s* c6 U B0 h3 c: h4 u
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
* k* A. g" a( U- t" e** Configure the McASP pins
# O. t l8 e! j ?+ P** Input - Frame Sync, Clock and Serializer Rx
, l$ ?1 k+ G3 n** Output - Serializer Tx is connected to the input of the codec
. t; p' b' I( v; b# O7 p4 j& ?*/! q. Z4 v3 e$ L6 Q5 U9 {2 T$ N
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# L x/ _0 U1 @( UMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
# T6 x# t) y9 ?, Z, p, R t6 ^' vMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( N( t3 A7 N3 \& ]# n/ d
| MCASP_PIN_ACLKX. U: ?1 u! u3 }: q9 J
| MCASP_PIN_AHCLKX6 R$ J9 m1 j/ ?$ S/ v1 z
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
& j$ |6 l0 M! Z2 SMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 `) [; v% k+ `3 a) f* V) m0 n; R| MCASP_TX_CLKFAIL
- \& x$ k ?+ [& ]8 J/ O$ f& F| MCASP_TX_SYNCERROR3 W: i8 F8 E: [% g
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 s4 w: u9 z6 {7 h2 {/ b, C| MCASP_RX_CLKFAIL
7 Z' v c6 i6 X+ O2 L| MCASP_RX_SYNCERROR * l6 u/ d( x; S* V
| MCASP_RX_OVERRUN);
: K+ H' g& @1 C4 E}
static void I2SDataTxRxActivate(void)
% Q. U& f9 j3 E7 i1 M{& _* Z7 V/ |% u9 |
/* Start the clocks */
9 e. Y6 e q2 ~/ j1 l0 ]7 GMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 L q$ q) n. _$ h+ }- ~/ \2 {
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
* y8 o) Z8 _* Y) I5 [* IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; g3 G! G6 v; B9 Z& `- U' I, IEDMA3_TRIG_MODE_EVENT); I( I! V! N9 a! l- J, Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 T# V5 c9 z/ S1 ^0 A/ J
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
2 i& s( ]& v2 ~1 ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ `6 B3 P- {) s1 I! k- AMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
- R6 y: e8 a, |2 j. swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
% H* d2 ~: ?4 W8 s+ L3 RMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 j' e" |. y- r: xMcASPTxEnable(SOC_MCASP_0_CTRL_REGS); q2 b4 F9 X5 M9 F/ t( U2 J
}
$ S$ p4 h: ~9 r" C) A/ a2 `请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 z: S6 E& o4 S/ T4 q" j# T
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |