嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
- P/ J: ?. R' h+ h# b6 x! q1 cinput mcasp_ahclkx,- V0 N; f2 ^$ X3 Z( b6 ^$ K( d( P
input mcasp_aclkx,
* o. j& {' e" v3 R, q' P4 X! V+ iinput axr0,
& ]5 _# J6 x/ c/ e+ O+ F) }/ {+ D' t$ T% k$ i
output mcasp_afsr,
/ k, I5 H/ A, V$ p% A  ]  R- q5 boutput mcasp_ahclkr,
8 ~" o8 E% t! b9 l9 h3 I- aoutput mcasp_aclkr,
% n! |  ?5 l- W! Q7 xoutput axr1,/ j, q4 {/ Y, U* c, N
assign mcasp_afsr = mcasp_afsx;* U9 d+ K, u4 F( J. k0 W3 z- E
assign mcasp_aclkr = mcasp_aclkx;
  G' @: ]! Q- ]' H; _4 L3 n* ]assign mcasp_ahclkr = mcasp_ahclkx;% g$ L$ D& {* `2 {. `
assign axr1 = axr0;
9 u9 M& E/ A( V2 b- P- h, U8 g0 N

# G& q# x, e( V2 v! ]  p+ b
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

5 d* |. W; p) q) s$ P5 V
static void McASPI2SConfigure(void)
) A. m0 q5 I# H/ i{- B- V$ G& S  F6 w- \- a1 T( I
McASPRxReset(SOC_MCASP_0_CTRL_REGS);: a* ?& z0 y. S  k7 F
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
+ Z1 Y7 S+ N) C5 x- q: mMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# [+ N. q+ [$ `/ QMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */* q' E0 b: f- L7 C+ N) \7 ^
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 T1 d9 R# D3 u2 {! p8 X% PMCASP_RX_MODE_DMA);9 X; {" C" G* ]* G$ k( ^
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 g" `9 M: n1 J( t9 O$ [8 m
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" }" c; {7 w5 f) bMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / |. L3 ]# b& y8 \9 q8 R. r6 ?
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, H" p4 t) J; }' E: v- o
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ P- K* a* a, _5 R' R( w* k$ [MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */2 G% W; C; z# @$ f& {
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) y  D4 r# g) l5 e% n* u" G
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & l: L7 j. y" L/ i
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' S) x, m- F5 f  }+ h0x00, 0xFF);
/* configure the clock for transmitter */0 J" o2 ^4 Y: H  x4 S- ~6 t" E
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 S( F9 V: o( ]# _3 YMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 v0 H  {4 n( g- w8 F( b# MMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# B5 c' o5 O' z! f0x00, 0xFF);
6 Q) \6 j& x6 v, h* k" d* F' R' m$ [* [) M. U
/* Enable synchronization of RX and TX sections */ 3 z9 K3 m0 Y3 ^- @0 d( U
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
- }* I. @  c' P+ Y! H; ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 U* k# c5 c7 k: d7 g
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*) X$ ^. {5 W  o/ {
** Set the serializers, Currently only one serializer is set as6 ^+ r: P& L7 K% [4 F- a# x
** transmitter and one serializer as receiver.
+ ]! k' M$ D4 s*/, V7 f, y/ j4 j8 P$ d; E
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: q! E% c6 Y$ D2 Q' B* X" C# j% s
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*" C$ o6 _  o% d) _
** Configure the McASP pins
; S  s- N4 J( _** Input - Frame Sync, Clock and Serializer Rx
6 j; r9 F. J' R8 K3 Y7 I** Output - Serializer Tx is connected to the input of the codec 0 f% o6 i2 P" T( q  V, g* _
*/
8 P: e" M6 \) L! u4 ]! KMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
8 ^( D$ Z0 @2 v" ^3 [' l/ XMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, n' e2 D0 y$ R% s/ [# T/ UMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- @" q" S) z5 }3 i2 M4 V- p7 j
| MCASP_PIN_ACLKX+ Q, m! g9 x3 l" _/ z( g
| MCASP_PIN_AHCLKX
% t' @" J% T% r5 q| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */# h! ]4 A5 g3 @' X& m7 S1 E
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 1 ^7 \8 ~/ |5 A
| MCASP_TX_CLKFAIL $ X2 M2 ^% N# V
| MCASP_TX_SYNCERROR
+ _/ y2 Z2 Q0 O" [) V| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
2 M4 g" Q  _4 s( g4 X% ]5 \* s| MCASP_RX_CLKFAIL% o8 B& N% ^3 |+ R$ r+ r( C
| MCASP_RX_SYNCERROR
1 V+ h& I! X8 y| MCASP_RX_OVERRUN);" Q* G( x4 E7 j$ H: a
}
static void I2SDataTxRxActivate(void). b: O0 J" w" b7 X2 i4 ?
{- F! N, _' ?. E; E7 A5 L/ K3 J' u
/* Start the clocks */$ |( C8 J. w2 c
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ S1 |% ^+ X4 z3 d7 D8 F: fMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
2 L, v% |6 x9 aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 c& W2 L4 w# P. u6 E% zEDMA3_TRIG_MODE_EVENT);' }+ T" S* Q# a* q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 c  |$ R- e0 J/ n% U  p: x0 BEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
) @2 O" I5 a# _- a1 s. B0 ~' UMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ p) F  I0 ^& C1 k2 {McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */7 g! U4 a+ M3 A; y! y2 z( o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */2 Z; x- F6 |2 K+ v3 O1 |
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);( j' `- ]0 ?& n2 c% e% c! D
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) z( U4 F4 n* x5 _+ F* V}
5 Y$ h6 i( M" e8 e7 _- K0 W
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
; V1 S7 O" J8 L- R8 x* }+ S





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