嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,, U8 o. T# L, P2 y) _+ t
input mcasp_ahclkx,
" m/ [% m9 b: @! \4 |3 S0 }input mcasp_aclkx,
& [! M) T* q' k; x: N8 l* N) tinput axr0,
( y" J4 @, B3 I/ U, G& m/ ^& I1 t1 o
; P3 E* P3 {: x3 ~4 ooutput mcasp_afsr,
. u& S- p- U$ Q/ {0 \& {! ^7 houtput mcasp_ahclkr, j$ C1 F. w3 x! U
output mcasp_aclkr,
, V. B' E: I9 }5 l4 Goutput axr1,
7 H6 g6 g1 e/ a! C. q7 e) _! X+ u( ]
assign mcasp_afsr = mcasp_afsx;
' H, Q$ l9 c/ X* D7 k* ^+ f! Nassign mcasp_aclkr = mcasp_aclkx;: f% F, A! V0 @7 }7 G* k9 X
assign mcasp_ahclkr = mcasp_ahclkx;! P+ K9 D) b; S0 w) \
assign axr1 = axr0;
/ l: s3 |' h' Q, ^* `) k C, Y
) ~& a+ R* B* b& `$ k; z2 Y6 k" p在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) ` {- h* Z+ Gstatic void McASPI2SConfigure(void)
0 h: ?% o4 a& ]- ]& H' h/ j{6 `8 R: a3 ]/ S3 q; q' q
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 G" {) P6 z& d( ^- jMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */5 d! L) W* f& B* s: B: [
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: s0 s) A5 v hMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
, k h4 P7 p! z5 \5 eMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 ?) g! R6 I+ X
MCASP_RX_MODE_DMA);) R8 w( \ {7 [0 S4 t1 k
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" U$ P' Z2 J7 C; }# FMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' N2 O& H0 I, yMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 0 W* S- O2 a7 M
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 J2 X# g9 Z8 y% FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 M, N' W8 Z" n0 l9 p+ T* e% A
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver *// j! ?" O6 d% [8 y: M: C y# q* b
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ y* u' P u! Q8 { H/ x
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 O/ W" r, W; Z) L
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: G% o0 H5 h7 P6 w' ^: R0x00, 0xFF);
/* configure the clock for transmitter */
+ n& ?2 g S& U+ s: l9 n/ vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, o8 C8 ~* ~% N& _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . a- H2 r) [4 y; b2 b O5 g
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: o8 P2 [ _6 i, ?0x00, 0xFF);
Q) Z7 q9 V" `/ h2 f" d# I0 N$ z7 H/ M, D) F) O# I; s5 o# `# Z
/* Enable synchronization of RX and TX sections */ ! F. z" r! S! S4 `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */0 Y4 A( s% t- h7 p& R
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% u* @- \9 M& h( G+ X: B5 ~8 t
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' t* I; K7 S* r
** Set the serializers, Currently only one serializer is set as, ]; Y7 U! D2 L/ Y; U; e
** transmitter and one serializer as receiver.. H5 y- h! g+ L0 T
*/5 y6 I; E0 |/ p
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( m1 N K3 [: j& x5 m+ h+ U
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
+ Y4 M7 C( S' k+ s& I* E9 }** Configure the McASP pins
& Y: B* i) t4 C! A# D9 I& W** Input - Frame Sync, Clock and Serializer Rx. x, E7 C: L8 A! j0 D- C
** Output - Serializer Tx is connected to the input of the codec ; f7 e+ `5 ]7 y# i2 C2 i" A: E
*/
( h9 X& R. H: F4 bMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: F9 L/ [2 I5 H& h- ^McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; a) ~6 z3 w) Y, PMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. J8 |& x0 v( ~6 }( M8 L
| MCASP_PIN_ACLKX
( F! e( c+ H: J; D| MCASP_PIN_AHCLKX
* \0 h! @% J3 m- P3 K2 R' g| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP *// R) u9 A( O% R" M$ v3 y6 @5 W
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % ^& X5 @! g4 [
| MCASP_TX_CLKFAIL
! R" j- Q7 @7 q' [; P2 h) p1 R& C; d| MCASP_TX_SYNCERROR
! ?2 K$ Q( t0 G& f! a| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . M( T, v* A. T
| MCASP_RX_CLKFAIL
( x! M O7 q, G, _+ f| MCASP_RX_SYNCERROR & f( @8 w6 [4 g2 W
| MCASP_RX_OVERRUN);) l6 P* \1 l6 K9 F7 c8 I0 D% Q
}
static void I2SDataTxRxActivate(void)
7 O4 [8 v, q3 o4 M# S/ @2 u& i8 z9 c{
3 j; U: e: v. s7 d4 T/* Start the clocks */; S: }. K/ M) {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, f* ~! \& {+ L) C6 }" } OMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
5 b' v9 }0 M! R# R/ m3 y ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. m4 L. I( m2 H. r N. `5 m
EDMA3_TRIG_MODE_EVENT);$ K {. ^8 `1 o3 ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ ]2 y+ q; @: o8 |
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
- M& g9 K# ^3 I5 k7 }5 R1 W2 L7 xMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) y2 {9 _; p7 R9 G" J; y9 u6 kMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
* h3 a* l4 J2 m; z; v+ twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
: T0 l+ `' v! f0 d4 i( `1 SMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) ?. x/ ]+ ^2 G1 a( {6 i0 H* \McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% W4 h. M# K; _5 w* O( r
}
/ @- g7 F i. L% |; {+ x" I0 A, i
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 x Q# Q! v) R& w6 m4 A
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |