嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,3 o1 }4 R3 r% Q! O0 @2 r$ O0 ~" q
input mcasp_ahclkx,
7 b" v5 l' b/ V  o$ t* U9 Tinput mcasp_aclkx,
; C; r+ A  n. R( |input axr0,
5 j5 a7 @# o0 f  s. m+ B8 g
) w0 v0 f; o! \4 {% t! ooutput mcasp_afsr,+ {: |1 h' a% j9 K% I
output mcasp_ahclkr,7 u8 w, p8 C5 w
output mcasp_aclkr,
* {8 ~8 n  t2 T, Z4 s) loutput axr1,* K' ^  \' B4 T9 _/ m
assign mcasp_afsr = mcasp_afsx;4 B7 H' x' B. a, b1 d
assign mcasp_aclkr = mcasp_aclkx;
% T* g& t! k4 T- X* Oassign mcasp_ahclkr = mcasp_ahclkx;8 y2 Z, k: K: Z& {
assign axr1 = axr0;
% G  ]; o, g/ ?, n2 ~

- z9 v* P4 _: Y6 G
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

. x! q. F( h6 M$ g
static void McASPI2SConfigure(void)
) M6 f- V* N+ L/ A{" k" o- Z) o& o2 h2 Y$ j
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* S' G1 r0 e4 DMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// z6 C+ ]) Y& O) \4 g
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; e9 k* g2 I6 q* X7 l  JMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */; L. Q: X" h' }' F- c
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& V) R) |4 U6 K3 D3 \0 ^/ S. p' M
MCASP_RX_MODE_DMA);8 F* E" m1 o# c6 j: |7 A' q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 i- V6 j& _6 ?
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */( O  k7 w3 V4 B/ z" {- L
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, B4 v- w# s* J$ v1 K) V: eMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ Q. l  i! L: xMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 I4 q* T2 C* G4 U0 |+ F: {MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */6 |7 T/ _+ F( J- O. ~; p
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# ]1 Z3 L: K6 F, \0 B8 r$ Q; [% A
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & M' \* _/ t% _! E1 ~
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ j3 K3 r) C9 o( j
0x00, 0xFF);
/* configure the clock for transmitter */
& B) {* t( C# n  G# gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( I2 d/ z: p! e# d: ~- V. {8 UMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, X7 H( n7 v6 v/ O. F  L2 a7 BMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. u0 J4 t( [; D+ c# z
0x00, 0xFF);
# r( }7 F2 D' _6 W* j' o
( G0 h! y0 s/ P3 C5 f( }! v/* Enable synchronization of RX and TX sections */
5 |3 s/ }. H* w) u, V6 oMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 R. [) W1 {: s1 n- YMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; B5 Y6 {1 P" U
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
- s9 t8 {9 s% d" k; M5 {% {: i** Set the serializers, Currently only one serializer is set as4 w1 ?& ~6 P* o6 _% C. }
** transmitter and one serializer as receiver.
( s+ Y; z" w% `3 }*/
1 h0 _! s+ E8 s% M0 TMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 [! _7 `: A3 l0 N, C
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*. b  W. u  b6 o3 j# ^$ p
** Configure the McASP pins
: h1 a- v  U9 |/ [  K2 Y4 c3 K1 j5 s** Input - Frame Sync, Clock and Serializer Rx
9 `8 _! W/ g# ?0 w  R( @** Output - Serializer Tx is connected to the input of the codec
' C6 H0 P. ]+ Z0 _5 K( c# W*/" F3 J+ R: K% T5 ^; ?
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
8 F9 T9 v. g5 }- F2 e% }5 JMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
1 i# w% j& I* r$ x) P/ cMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. s' x$ D+ q3 K# C; ?) n| MCASP_PIN_ACLKX0 V" J6 b  R# Z, G
| MCASP_PIN_AHCLKX, }' k2 n7 B4 P* X) L9 W
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */  h% F3 m5 D$ c; z7 j
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 M3 l) R1 ?4 e| MCASP_TX_CLKFAIL
* b4 `5 `' L/ z/ n+ I" v( V| MCASP_TX_SYNCERROR
( F7 B6 m, ]4 ?. i| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 M" g3 z1 @  n" t( I6 A| MCASP_RX_CLKFAIL
& Q0 d7 G% N  d5 A) s. H( V| MCASP_RX_SYNCERROR 1 l' q% {& [8 B& C# }! [9 z
| MCASP_RX_OVERRUN);
& U1 F1 S8 C8 |0 i0 V}
static void I2SDataTxRxActivate(void)* g; ?, L, P9 d6 F6 I
{
' d' _) ]# o# h5 t/* Start the clocks */3 @& c2 U9 @5 V
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- T7 i$ P" r6 k+ q1 |. d% Q" K( `: KMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
# k& ~8 z) o" F, R5 ^' qEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 Y. [# U; \8 jEDMA3_TRIG_MODE_EVENT);
* k6 A1 V0 q/ G! EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
9 ?: p# r3 j; U8 Y/ b0 k$ m1 bEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
7 j; H% @  g5 U/ ?# i8 i3 NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( H  `, i3 I* v; lMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
8 H1 @5 `( k4 `while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */; A* j: i7 z3 ?- t/ t$ [7 O  Z% i7 ^1 u
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);% \7 q& [; n/ U) Q7 Y2 k  t/ U
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" n1 d5 n4 r7 ]! [, Y" ^7 Y}

3 W% i* n4 y; T3 E1 z
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

, P" e+ P, a9 @) `3 J' p; Q& q




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