嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,- Y1 K: j5 n/ L# Q* C9 a6 m6 K
input mcasp_ahclkx,5 i- N- t+ ^- [, d  o
input mcasp_aclkx,
! [$ }8 _! P# c' a( zinput axr0,
3 L& c! i5 H; I: Z
/ d3 w9 L( ~5 R: f7 W, @# Q: Y* \7 E9 Soutput mcasp_afsr,
- t7 G8 z9 }( ]( {5 k5 Q, E0 M$ ^5 xoutput mcasp_ahclkr,% H* G2 O6 H2 h! Z5 ~- B+ f
output mcasp_aclkr,
' V% A7 W, Q5 P, \" ooutput axr1,' v# X( P2 K& ]( r4 H; C
assign mcasp_afsr = mcasp_afsx;
( M. p7 i8 X( Dassign mcasp_aclkr = mcasp_aclkx;
# v8 a" l7 Z9 b& rassign mcasp_ahclkr = mcasp_ahclkx;
! @0 f8 \7 f4 f0 T. b+ ]assign axr1 = axr0;

& Z8 p( c) P/ x% W/ T  d2 r, w" z8 B% E
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
, S7 J  d& M' g! u# Z) z0 @7 j# O' o
static void McASPI2SConfigure(void)1 Z! E6 Q" ]% c2 A8 k; c6 j
{
5 z: u/ T* ~2 z0 t! l& @McASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ B9 s( Y4 q( B$ W( v7 p1 QMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */) l: F0 u. K+ C' \/ d  ]
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# V6 H; q$ T& R- ^& S1 D) W
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
: W' q, b. C; T' B, m! u% V" OMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 B8 P% T: F: z$ A7 ~MCASP_RX_MODE_DMA);/ f" k7 ^' R# x$ K+ f
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 I- d3 Q) [1 Y( m6 @5 w& cMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 C' c# e% l) b
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 i% K3 B  f  q/ G+ L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 B; u# m* j! D- a
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 L( ?- B! Y( ]$ m! c
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */4 ~2 Z& p% ?% g* y2 q
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 B2 L8 a, v% p: S& tMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' O" l! Y' \, N& P. bMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 r( ]( B9 c( y4 H& u' g5 V/ o0x00, 0xFF);
/* configure the clock for transmitter */# v8 U/ J! P; K! E# t
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 l; a, ^9 F7 S8 w! ]$ r7 m+ P
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; W9 k) m( c( C8 g1 {' C3 [: F
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( g0 A6 X, K; v4 B" W: p5 I0x00, 0xFF);+ V4 S8 X* C  g$ C2 r

2 |7 @8 Q/ u" z; w# Z$ s" l/* Enable synchronization of RX and TX sections */
% [: q" y4 ^3 ~4 b' N* h" }- ~& H* YMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
9 I% r3 R  e2 y1 t, r, dMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, s0 l1 p" ^  n- L& N. `# c0 d7 m( bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
$ R/ U5 e, f1 c; K/ ^2 H: y** Set the serializers, Currently only one serializer is set as$ I- T# A1 ^' ?' ^5 W/ I
** transmitter and one serializer as receiver.
$ D% o. M3 r" g*/1 q4 w5 q4 v8 s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, g, X# c$ u# i7 m( K. D0 @  a
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
6 L9 A( _5 m. U" ^( l& j** Configure the McASP pins : T- S5 b% R# s1 Z
** Input - Frame Sync, Clock and Serializer Rx7 G( n7 `9 b0 @
** Output - Serializer Tx is connected to the input of the codec 1 E- J* H9 Y  w2 c* D' t7 q
*/
' B% L2 H, C0 \' T7 DMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 a4 Z3 V- t  @& EMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, x2 m9 y/ D4 t2 V2 v" ~% h4 q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, \% ?; S( _; k8 @8 t
| MCASP_PIN_ACLKX/ Y4 e0 v, \) K  T3 b
| MCASP_PIN_AHCLKX2 r/ g' I, \$ {# D3 r, X
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */$ _. L" j# O9 b/ R
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 u% b* u: [$ n, u3 |
| MCASP_TX_CLKFAIL
; i5 x5 T* f- `  s3 _& b* n| MCASP_TX_SYNCERROR
6 J" O- n- B! o  x2 w* }8 z" v7 \| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) \* a/ h; l/ m. g) |* U! s# m- i% Z0 @| MCASP_RX_CLKFAIL
7 |' D2 S  K2 X. ?| MCASP_RX_SYNCERROR
( }6 o$ `# J* t5 c- A/ m| MCASP_RX_OVERRUN);) {; Z7 M6 V% p) O) X9 i6 n
}
static void I2SDataTxRxActivate(void)
' r5 z7 ~: w% D- H{. {7 m# p) E$ r$ p. m' ?2 S* M& ~: v
/* Start the clocks */  F  }) j$ K5 b
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 @" A: h/ A6 y) `- H: eMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */7 l. u2 v7 h: Q* Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 e- ~8 P7 P' K4 f: [4 e% y
EDMA3_TRIG_MODE_EVENT);
9 d. K# D: `; a0 @5 I& DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) |  p: S3 Y# y* t) XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */: ^$ a$ R& ~5 Z. Q7 b5 d8 C
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' S( Z. `0 ]" s0 p( q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
! F9 I* d, V1 f2 S) X7 Iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */3 H7 U$ ~6 q9 ^) i2 `6 D" C, f
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ A8 w5 |5 `1 P( T% I) ]2 p- n8 PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% q2 @; C3 G5 U. [! |
}
5 c  Y8 L5 l% Z
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 ~* }' l8 ?$ @8 Y# P





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4