嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,* Q, r- Z* Q+ V/ }. `# L( h: R/ K
input mcasp_ahclkx,
5 Y4 S! X5 ^0 K8 c. G6 k0 t$ Y- @input mcasp_aclkx,
  o+ p* S- x8 L/ V' ^% ginput axr0,
3 i* t! ^% M, U) i% q% L' @7 `( T' @' C
output mcasp_afsr," a7 y* I& [, S& |  r
output mcasp_ahclkr,5 M4 K- X; i5 i( c* C! o
output mcasp_aclkr,8 E3 T9 _) B" N2 n3 G) K% u
output axr1,
7 H9 _1 e* e; U# w
assign mcasp_afsr = mcasp_afsx;
, E4 J! W7 G% H3 O7 \% a, massign mcasp_aclkr = mcasp_aclkx;
( c+ O# J8 i5 K$ q- T9 d2 D. T, Hassign mcasp_ahclkr = mcasp_ahclkx;8 e9 ~+ K7 z/ S
assign axr1 = axr0;

) w8 Z$ ~2 d3 m) J
. S# @2 D6 v+ t: A6 \
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

8 C/ P! P% s7 H6 V. q2 z( E. f* y/ A
static void McASPI2SConfigure(void)' Z/ R7 Z- h, z* U- O* q7 Z
{. V3 |. u3 v. \/ n" J3 J
McASPRxReset(SOC_MCASP_0_CTRL_REGS);9 T3 M0 m( `1 |
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// y( G3 P+ v2 U6 R7 ?
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 T: Y" M! ~4 F% X' l) PMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
# |, D: g% f$ e9 k5 |7 j! GMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! C/ M5 q$ ]: x) x" NMCASP_RX_MODE_DMA);9 r5 S! g/ W9 n+ M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 ]- @4 @0 E2 F  C9 z) o4 y. A
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; ~8 n: @% F0 a' m3 q8 A9 G' e9 @8 X
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; t* ~4 y0 {3 M! _1 IMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ L$ h; `3 p8 nMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# E  Y. W- G, S1 O. iMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */! y' d0 e: d. T. M" K' {+ {
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ C9 N" W! Z  N0 v4 pMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ \. S7 [& P1 i" a+ L( Z. M7 J, @McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. o* Q+ ^. w& y6 S0x00, 0xFF);
/* configure the clock for transmitter */
: v6 X0 C2 Z# Q* D9 k+ zMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
7 G: R( I  A; |- YMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . A$ h$ H+ f' X1 k; \* `$ z& q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 s# H/ n& N* U& {7 Z
0x00, 0xFF);
% h) W6 K9 c4 U" f$ X6 L9 Y3 \+ v. m& M/ m
/* Enable synchronization of RX and TX sections */
9 P0 c5 q" a  Q. B5 VMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 a! J* j1 h2 R* t, qMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' t! [6 t' E2 C- v$ QMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*: s2 ]7 G% R- M) e  m
** Set the serializers, Currently only one serializer is set as1 H8 I! ^+ N2 U" A. \$ c
** transmitter and one serializer as receiver.
, ?9 Z! N% U8 O% J*/: k; p3 f) L$ R$ S# q; @9 [9 w
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& `& w7 W& N' _: r8 ?' P9 fMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*% p% S3 c# I8 I; Z& [
** Configure the McASP pins 1 w! u/ T* K1 _/ r. R  H+ W7 K
** Input - Frame Sync, Clock and Serializer Rx; {5 @) S+ y* w- k! p6 s
** Output - Serializer Tx is connected to the input of the codec , K/ ~" M$ R0 u) M1 e7 Y
*/$ H% u& ~5 e; ^% f& v
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- s1 C8 f& E3 s% @+ F/ e6 C9 DMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( e5 H5 h9 [! `: Y: _5 t
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 B* ^6 S3 `- Y5 |! t9 B' J) `| MCASP_PIN_ACLKX4 X- d3 @9 B% ?, Q( B7 E3 S
| MCASP_PIN_AHCLKX' u, [0 _/ G3 _# u" b2 V
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
6 q( m9 H5 ~3 T) Y% PMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, _8 ~& U: o4 i& R' ?& D4 T/ ?) P| MCASP_TX_CLKFAIL # w! @+ {3 _& M9 A' k& ~6 X
| MCASP_TX_SYNCERROR
8 H8 h) p! k" K- G) w5 S/ A; @| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 S6 ]& V/ A" g% ]# k
| MCASP_RX_CLKFAIL
% C$ H" Q" X5 T% X3 C+ N0 F. ~7 ^| MCASP_RX_SYNCERROR 2 Z  l+ s- m6 a5 y" W
| MCASP_RX_OVERRUN);
6 D2 E( E) I! ]- o}
static void I2SDataTxRxActivate(void)  x& o+ N+ i  Y* q2 f( [
{9 q: ?9 ^# @- |9 C
/* Start the clocks */' E: P. x# I6 q3 n
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# [& y: O8 w0 |9 j% [
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 ?( J! R1 m, `$ z1 @% |
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# A9 y' Z. R1 w( m
EDMA3_TRIG_MODE_EVENT);# G0 I, g9 v$ d. L
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,   E; C# Z  H- J% r0 W1 q# X
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
: E  f' U5 A* J2 m8 vMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& z$ s+ v  k% `6 S$ j3 |1 F( S& P
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
$ W6 d$ A6 o: A$ M3 s4 {1 _while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
" \& K! w$ d* @2 UMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 m- |, _9 t. U  X! p/ UMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 g" N+ T8 b4 d9 ]' |}

# a: ?' s4 L6 w. Q3 X
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

* c5 ~$ ?4 o  ~9 H! C. @+ m" L




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