嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
3 Q" t0 G: }# B* y) x2 ^# tinput mcasp_ahclkx,
4 {8 \  O5 ~: O: _$ S: I4 Yinput mcasp_aclkx,: ~1 k$ X. A. A+ M, B% I
input axr0,/ W( k: ]  F7 q! t1 m, L! j

( S/ c" r4 ~. O* Eoutput mcasp_afsr,% M* }0 S& W9 ?: q
output mcasp_ahclkr,' e! C  h, Y+ @7 b' K- o+ _
output mcasp_aclkr,2 w+ F+ T: t- F! O3 E
output axr1,6 J& J, t' l1 ~5 j6 E) q
assign mcasp_afsr = mcasp_afsx;
: v" P! T6 a. l& B( Sassign mcasp_aclkr = mcasp_aclkx;
( g! i) O7 f8 m- D# Tassign mcasp_ahclkr = mcasp_ahclkx;. ]7 d% }( n2 Q9 x; |7 C
assign axr1 = axr0;
' l- c- J9 b0 M' H( F4 J
1 I3 J9 |3 i3 A6 b2 P) h/ A
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

8 i% o3 e$ r( R- }9 e5 R
static void McASPI2SConfigure(void)
# H3 r# ~, U; c" ^{
" g$ ^0 V4 i4 d, P7 ]# `3 P& f- qMcASPRxReset(SOC_MCASP_0_CTRL_REGS);  N- i9 a; V$ J
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
9 q) V+ i* D* e8 ~; w4 X* Q" L5 w' A' ~McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 e+ e5 D7 a" ~- P8 ]McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
# X: U) |$ H! m4 }: C. x: {: xMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% c5 V6 K) r: j
MCASP_RX_MODE_DMA);8 c8 o+ y9 k3 m% H9 P& ^+ ~
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! Y0 `5 n- L2 e: L- z; g! @
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. K* e9 N# c+ z4 T" k! x  NMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 x' f; G% |/ g0 J6 sMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 ^4 r8 W" p+ p* u  v) S
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 6 D0 U* z/ K" r: t7 s( z4 R& c: ^# [
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
: n: ~2 r6 a; c8 B0 s+ PMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 V% s* L- c) q7 t- g% }, ?$ _# l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ! [+ g4 g; Y0 m" N* j# N3 |. P3 k
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
  B5 ]' T3 P# h/ G" K" @2 Q0x00, 0xFF);
/* configure the clock for transmitter */
! x  {! L" x/ r9 zMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' X  Q/ N6 g& V+ z% M2 m4 x
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, T  N* s* w) S/ Z+ oMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,! L3 o+ n+ [0 \
0x00, 0xFF);
7 m+ i& V: j: \- o+ u' W
4 ?# B! I2 ]. j+ J7 l, ^1 ?/* Enable synchronization of RX and TX sections */ - ~; e- z  S9 s6 h0 o
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
, C+ G5 W5 O. B% eMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);: J5 Q5 k5 t  O: i6 Q: J7 i
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*$ N, A  P7 N) H( b7 k+ r4 a
** Set the serializers, Currently only one serializer is set as
/ l# u, L* k. Y, O1 A* p0 t8 ]** transmitter and one serializer as receiver.
& k& X0 U) z4 q7 @*/5 }3 J9 U1 n' p  Q$ l% j+ g
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 }( D" n, p) rMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*: E. H% p; I& v  J
** Configure the McASP pins 0 _% \! R$ \: D1 N6 W& e6 i- C7 \
** Input - Frame Sync, Clock and Serializer Rx
8 j8 [) t& Z7 o7 b5 M** Output - Serializer Tx is connected to the input of the codec
2 }  _1 A# x) w5 B*/) S+ g9 Y9 q! t6 F
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; Z2 I' B" {* c
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% c2 X" b- C- Z# z+ U5 \  fMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 ~, @  W5 o' T| MCASP_PIN_ACLKX
6 X/ H& L" l3 C; I- V9 G* r| MCASP_PIN_AHCLKX, t5 l# `2 ?& `! v* s6 w
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */  ]# Q, @8 L# Z8 _5 D, P% g# z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR   R. T1 {* j0 [% H% ]% E
| MCASP_TX_CLKFAIL
8 L. O3 p; _; v| MCASP_TX_SYNCERROR# `. d: q5 ?% I1 y: x2 t, n" V
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . K) |- O) V4 t" V  S
| MCASP_RX_CLKFAIL
. k2 m+ W, }6 e( ]% |1 t| MCASP_RX_SYNCERROR
( C' V/ T7 t( Y& l& Q2 x| MCASP_RX_OVERRUN);2 ?* y: B+ }) K$ |1 a
}
static void I2SDataTxRxActivate(void)
$ H# c2 {' L: X2 h* B{% s+ Z7 d0 u/ M' Z. u. }
/* Start the clocks *// n8 k( ]+ l2 `. }9 v( w
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- I0 C) Y# i% `# d
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 d5 y* Y% _, H, `: I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 O) P  t; n7 @6 X9 ~6 QEDMA3_TRIG_MODE_EVENT);$ B. t5 Y# r! q7 t8 E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- B3 E1 J, C0 U8 }1 JEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */: e' t0 y6 Q$ I" K, v
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* S' i# J( ]5 M( z; @6 o
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# w- S- f/ [, ^5 s2 J
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */7 w$ P4 y) m1 Z# Q) C' i
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' O( _8 P* C8 ?6 T# `/ {' \' BMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" _% [+ `* b. _# L}
/ G8 O5 x7 n! n5 w7 _
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

' x; M5 {* w% k. |




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