嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,( I' o% B" Z) Y; Y+ D. G' D% U
input mcasp_ahclkx,/ G5 n7 [& Q( r0 o) y. z. v5 Y+ C3 H7 F
input mcasp_aclkx,
9 O3 U2 e1 {. [2 A  @/ W2 b& {) p5 l" finput axr0,$ S/ d# p. t8 Z3 T; V  b% \! W
" \0 z: C/ ]; ^# S1 M" I7 X
output mcasp_afsr,
, [( F* M0 o' `output mcasp_ahclkr,
7 p3 o" o" X  Ioutput mcasp_aclkr,5 T" Y( s0 _- O
output axr1,8 I( t' u# a& t! F' ?0 B: Q
assign mcasp_afsr = mcasp_afsx;
4 o% v$ b& c/ {& b; G/ gassign mcasp_aclkr = mcasp_aclkx;0 v# l# K: _, V& F9 w* X
assign mcasp_ahclkr = mcasp_ahclkx;
4 b! A$ c- g1 I' J+ [assign axr1 = axr0;

( n9 U+ a$ |+ U9 g" X  }8 T
; ]+ P' o" n4 \, A: n$ A% L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 q# e+ }; }- l9 d+ p
static void McASPI2SConfigure(void)
$ X5 U3 G$ L, y( Q7 l{
+ b  A+ t( @" OMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
& P, g. v! C( t( XMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */. R+ C# \1 P( w' Z2 o+ u' g
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' K" @: t) I7 K1 XMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */( c* X2 R: V9 b6 x5 w) ~6 A. P
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! o% p  R& ?) ~! o( `( x) @7 G
MCASP_RX_MODE_DMA);9 @- E, x7 A9 N8 l0 C4 s
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- [7 n6 o8 x8 }8 \6 Y- _, D
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */! B; d) h, q7 a: o
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 `# v1 _) ^* |# }% w
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) q/ B8 s% O* Z, Y0 T
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
5 ~1 B3 f5 s  oMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
# F  K! ~9 }6 b$ VMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: a7 [5 N% n! |* w2 H! PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - [  z  g) ~0 T' h5 ]+ Q, L  o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) l' @9 T" r5 H3 ^  r
0x00, 0xFF);
/* configure the clock for transmitter */" ]0 I7 n7 k/ ?3 G& Z1 Q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 K- A- q4 T$ c  o
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! S; B# n% J, IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ X- P" \5 J, Q8 P+ I0x00, 0xFF);$ A7 c& I% x, r6 w% L" g& O8 s
" B( h2 M+ a/ O6 a2 O1 S
/* Enable synchronization of RX and TX sections */
& r5 T% W/ p% FMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */$ y) a" f; q( `" s0 m# p
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( [9 C3 A" t2 z' H  k. ^' SMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*# P4 T7 _+ N* j
** Set the serializers, Currently only one serializer is set as  x) }/ E) u0 Q* d) o2 p
** transmitter and one serializer as receiver.
/ Y0 p' }$ x7 @  ?2 |. {' ?0 _*/1 T+ M. R- f' M0 q1 N8 f
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' z$ }) _8 z6 P& P1 }# @# A; ^McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*1 y7 g  [& O) e! ?: L3 Y
** Configure the McASP pins 8 r+ h( |+ d# _* Y1 h. {# A1 ^
** Input - Frame Sync, Clock and Serializer Rx3 }9 ^" c" s% ~. F% v* {6 Q1 p
** Output - Serializer Tx is connected to the input of the codec 0 _9 {, X. W+ ~! f3 ^) l
*/  Z6 W4 m: P8 D: V5 Z4 X
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* ^/ a0 l5 ?: C, L3 w  k9 k6 x
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ `3 V( {& y. d$ S) Z8 B' CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX  c; {% A) ?6 g/ K# k3 H
| MCASP_PIN_ACLKX
7 d- i; P& I  e  ]- d! o| MCASP_PIN_AHCLKX4 u- l2 h. t8 q* |$ L' h0 o) d( r
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
& V# x* H' r, O, {) L( H1 \; YMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 y6 W; V+ W# l3 K, O| MCASP_TX_CLKFAIL
  k- D, [! q( E1 F  o| MCASP_TX_SYNCERROR
3 p4 ]3 F% B  S0 V6 c| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 U3 b8 R' C: Q
| MCASP_RX_CLKFAIL
. ?- B3 a# |" g3 v/ u, C| MCASP_RX_SYNCERROR * j* E% _1 ]$ y% E6 r  P
| MCASP_RX_OVERRUN);
0 _# ^3 @3 Q) t2 s! u% ^" W) W}
static void I2SDataTxRxActivate(void), \) {0 }5 P' N4 S- o
{
+ E5 N# s3 t7 a2 a/* Start the clocks */
3 J2 `/ C4 ?4 S  G  z. E+ aMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' C+ @0 U/ u3 H2 BMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */' \, P# v  H  W6 B. K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) L' L4 D# y) T6 l
EDMA3_TRIG_MODE_EVENT);
2 }; c. s" s6 Z4 {- |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
/ `$ b/ U  y# V. G- D( ~EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */5 v( }9 `5 o) B( O6 S: y* X
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);, `1 Y+ `8 B- h3 p8 m
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */( j( n" ^9 p  K  O6 E+ F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
- \7 [" A' q2 {  c; x  Z5 lMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: u; h' S! i1 J# s  y4 H5 gMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ a* p& Y8 n1 X, M9 a/ n9 l, k
}

7 k% D: ~) W4 F0 x8 @1 M! l9 @
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- b0 E9 S: J, ?





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