嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,4 \+ `4 D# L* [0 P
input mcasp_ahclkx," ^, I. [% T& z5 e  S
input mcasp_aclkx,
# }& R' {2 o5 U8 w$ iinput axr0,# `, h& Y, v; q, m8 w- @9 `% ^6 O

( F% ^3 ~( U1 n# y9 p( @! Xoutput mcasp_afsr,
  ]* l* K( {; H  ?output mcasp_ahclkr,
$ Z; ?% |) U2 Q. l3 doutput mcasp_aclkr,
# d" L  b3 T# Routput axr1,& U' m" j( ~* j9 r
assign mcasp_afsr = mcasp_afsx;$ ~% t8 [$ P$ P& [0 O; }
assign mcasp_aclkr = mcasp_aclkx;
; H8 ]& {! j. T: N9 u+ gassign mcasp_ahclkr = mcasp_ahclkx;
' M' @/ `1 N2 q3 M8 M7 ]3 k" gassign axr1 = axr0;
$ O3 F: M; T* q* P  e8 F$ V0 {( q: h
0 G/ d$ G* ]+ R. c8 C1 O
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( s4 \) ?& N7 ^/ ?% w8 O
static void McASPI2SConfigure(void)( ^4 _* ?0 A" S, q/ s& @) ^) S) {
{( k$ k" D6 k2 a: G1 q
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 j: c9 @- ^$ hMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
! J& w% m; l2 u4 ?: D+ YMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 }7 @. q6 D, ]0 C7 i4 rMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */; p2 _* ^' ]+ R! E6 h
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* H& x2 b7 _3 }7 a; u: }, M* hMCASP_RX_MODE_DMA);
. F* M6 ^9 a8 N3 wMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, t9 `5 C3 |) t8 r+ j
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */' _- {3 H+ r" P' w
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; c( H7 h' l4 c" NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# F/ [5 |3 W& b2 N0 XMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 D3 @" O+ Y- M4 ]7 }% l
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */* {/ }) A0 a& _7 m9 q9 x
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 ^3 J& n. X2 ?$ D6 y" [
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ L& {( ]" X5 L) s1 D
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! y% q2 K, J$ O3 L# \8 q. Y0x00, 0xFF);
/* configure the clock for transmitter */- h: Y- D# W& ^  F/ I
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 a, g4 P. s1 h# d7 d5 rMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 1 K* A- v5 T3 d7 ]3 p0 I$ N$ t
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* |: s- {1 Z; h& ~# c* V/ W0x00, 0xFF);8 g& O* C, m) W9 t4 p8 L
4 J+ n1 o' O+ ?2 v& R# Z
/* Enable synchronization of RX and TX sections */
! n6 @2 M/ T- a% x) @( EMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 R8 O% ~9 S+ K5 b# e! xMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' b. m, U$ H  `8 W$ k5 LMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( K( ^% f: r7 T5 s** Set the serializers, Currently only one serializer is set as
9 r) n4 P2 _* C6 b** transmitter and one serializer as receiver.
7 ~+ X- o* N! u5 V, u" P6 Z*/, K& W3 \8 n7 n& ?' j
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( X- G$ B) Y, r; N, t6 m9 E2 u/ L
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
1 Q4 N- ]: m, J# i% v  \** Configure the McASP pins
' L3 o; a- x* d" K9 A, `# c** Input - Frame Sync, Clock and Serializer Rx% F& `) M1 {& [) @" i8 w
** Output - Serializer Tx is connected to the input of the codec % w& J/ ~! z! z" u9 B4 O3 e
*/$ W8 l3 Y- a4 E' ]' `+ o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 e% a" O9 D) e5 t  S! \4 `McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* y) |# G( }( i- M0 R) BMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
  ~; y: C2 ^6 P+ E" Q& V| MCASP_PIN_ACLKX
1 H/ z; F! h  s1 b2 }| MCASP_PIN_AHCLKX
) L4 V  W1 |! o( Q| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */2 r& L# B% d6 [. J" P( j3 e! V; O
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
8 J3 |' G) o* \( S5 d+ u| MCASP_TX_CLKFAIL # s+ e; z% i' Z* S
| MCASP_TX_SYNCERROR
1 i) J6 L3 Z! K; L! f: @) C| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * @# q  E* M3 ?0 f
| MCASP_RX_CLKFAIL
5 _% ?! i7 ]: B$ d2 v( I, t# C| MCASP_RX_SYNCERROR
2 `& y1 P4 a& a& y6 c2 R3 Y| MCASP_RX_OVERRUN);/ f7 t4 F1 L6 e8 T# j( U) d! l
}
static void I2SDataTxRxActivate(void)* l4 L( z& e: s) H  w: d1 [
{
* a! j- Z* p+ s) m5 V/* Start the clocks */
) c) }! C$ q2 T: i8 lMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 t6 F. M# g9 H" ~$ j" s1 A8 mMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */  p+ O8 ~7 M7 K4 R* |
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 ~- {/ s, b* f8 B9 l4 p* `9 j
EDMA3_TRIG_MODE_EVENT);6 q/ y; l7 _+ k) y3 f3 B  A8 N- {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, W4 Z) z) N3 c: |: zEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
% L4 g- [- L4 d5 tMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) a# H3 s8 H3 _5 O% _# E& H/ IMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
+ C1 q3 N4 k% C: k4 M% O2 Fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */% o5 {. c  p0 [8 S! o$ q$ e
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);( v0 y; N. n2 L' l( g# Z: P/ q. a
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ I. p. [1 r) \+ U  [
}
1 Q/ \, H/ p4 o+ P* f
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- p7 g% {( \) c





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