嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,( |. n% w1 x9 I; A. u
input mcasp_ahclkx,' x: O$ A0 I9 y/ E' e
input mcasp_aclkx,* W- c* ^9 \. a- r" f
input axr0,8 U- j, l4 i) v
) e4 d8 n6 V+ l5 V# _
output mcasp_afsr,
6 y2 I& [0 a! m/ ]# Moutput mcasp_ahclkr,5 P. w" x' D' K+ Q, c# B
output mcasp_aclkr,
/ D- D, n2 d; ~2 k9 u2 qoutput axr1,4 o8 r: H& {* ^7 @, o8 B3 N1 V
assign mcasp_afsr = mcasp_afsx;
+ R3 b% \, @% j. n+ E3 Eassign mcasp_aclkr = mcasp_aclkx;, y& d9 Z# v( W! V' {
assign mcasp_ahclkr = mcasp_ahclkx;
2 G4 N* t; W2 E/ m- D6 kassign axr1 = axr0;

' `# |, [3 o% i; Z" U+ D- }' }8 c8 ]" ?9 W
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
+ U$ G1 I4 I0 g- ?
static void McASPI2SConfigure(void)
8 j/ ?& U2 |( A% Y# i2 E{
; v6 j" N) @3 A6 {/ B, _. hMcASPRxReset(SOC_MCASP_0_CTRL_REGS);5 l/ T! H) J. n  a
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
# ?. d4 ]( {# ]1 eMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, [4 f+ r; |9 l# G2 {, P; e
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */1 E9 ?2 Q; y- P0 {: Q8 ?2 z5 O
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 ~$ G% e0 H" d# \4 QMCASP_RX_MODE_DMA);
0 Y8 j! Z6 J- u" u. a( n, m: s. UMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ H0 T; X+ {3 r7 ^8 g
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */, J9 {3 x7 R7 f" `1 U, G
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
0 y  ^- O1 N* r2 y$ a0 C# n) oMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" z6 C' ~9 M# C  h' e
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 z% w- P9 r9 S( N
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */  O6 \# z9 J6 s. N) X$ d; I9 f- V
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( [2 t& q. L$ O$ dMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); / H. W7 [- Q! |* I  N
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 V. @% P% a7 X. K7 J0x00, 0xFF);
/* configure the clock for transmitter */7 Y0 W, v" E# X4 y' |. z8 l8 y; f
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
  ^5 A4 [7 k- @+ kMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + z) C: `, u" Y5 }  r" T/ B
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 R5 k* h2 E% x/ O1 u
0x00, 0xFF);: l5 Q2 R8 r* U& ]. a

2 o) X  l0 U) A% u5 w/* Enable synchronization of RX and TX sections */ ) ~  z3 c$ m% B% X. g. G  M
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */0 [8 a3 b7 R" b# l  L# d
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 B2 T6 d3 }( s5 y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
" m5 I. J) w, m/ N** Set the serializers, Currently only one serializer is set as1 n8 K1 b) \; g- \
** transmitter and one serializer as receiver.# _9 ~# p4 m: S8 v* M, |6 ~0 z9 `# L
*/
+ t  X  Q4 n: f. tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 Y- V! ]5 I8 d( |$ J& AMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*" N2 z" ~, r8 C- u/ w% T
** Configure the McASP pins % T$ W+ h0 K! V$ l: D) T
** Input - Frame Sync, Clock and Serializer Rx  N# d( N) q0 M4 d9 Z: V
** Output - Serializer Tx is connected to the input of the codec
: i$ A% V) U. I" G& H*/
8 V) K3 A+ h8 A! ]$ v8 \McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 x5 A& U$ L. ~# q2 l! G& L+ FMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; {. C, a+ J. c+ t( r9 O% s; eMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# B: z6 e- A& {7 ]6 l
| MCASP_PIN_ACLKX; S" B! a- U. U" W4 W
| MCASP_PIN_AHCLKX
  u+ u7 P; Y! o! ]1 [  B| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
9 T+ C" ?2 k; a$ AMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / E% K) a' ?5 i
| MCASP_TX_CLKFAIL $ `+ ^3 K/ O# q7 x% m! z
| MCASP_TX_SYNCERROR$ S$ R# d& Q" |1 j1 w' a
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ) R/ X. u7 I1 t+ }6 [! w7 _
| MCASP_RX_CLKFAIL6 R& z# p$ {' ?( y; J) }
| MCASP_RX_SYNCERROR 6 P, q% s3 D9 B8 F/ r
| MCASP_RX_OVERRUN);
+ }& R* z# r- N* l9 l9 P9 J/ c}
static void I2SDataTxRxActivate(void): t& D1 X( Q! I- r5 ]
{
/ n; O; a; `( L/ e" |/* Start the clocks */
0 E6 b. b8 @9 s/ N/ h0 ~1 D1 V' \McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);/ T. |  x# V, k- T& I# U
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
1 J6 W; L9 W; g- S8 o+ w( BEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 e5 E* j3 h* o' {6 E
EDMA3_TRIG_MODE_EVENT);
5 ]7 e  H: h0 k0 X3 W  r6 R  ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 ?$ d- h$ O4 [* Q. k9 l" k7 V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
" e& o) E! y5 N+ Y% r, m+ J3 {+ `McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);, l! A7 {0 u8 g6 d$ ]+ T- ~: ^6 E
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# N( s1 M* t9 p  s8 ~) C& I
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
, q- R6 r' k( M; g1 Z, C$ V& v2 E$ iMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! m8 Q) i, A+ a9 l! l2 O* }McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" i0 \, K" l+ `& @& [1 l+ v
}

% q. J; [3 d% y9 j
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

, k! ]: y$ X0 k* M' J. {5 G




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