嵌入式开发者社区

标题: McASP无法通过McASPSeriActivate(); 请帮忙看看问题所在? [打印本页]

作者: Ming    时间: 2015-10-29 09:47
标题: McASP无法通过McASPSeriActivate(); 请帮忙看看问题所在?
我的McASP配置分别如下:
8 ?' L& o" \5 C( z( A管脚的复用设置是:) r, F+ T, j) q: I9 W* Y5 ?
void McASPPinMuxSetup(void)
/ \- [8 c; C" I; y. f{' Y, I3 P% k- ]2 r. A
    unsigned int savePinMux = 0;
" p$ Q- A0 R! X" V# O0 u1 }    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \( T3 g( m* `4 D$ V
                       ~(SYSCFG_PINMUX0_PINMUX0_27_24 | \( J% ~" d2 T7 N
                         SYSCFG_PINMUX0_PINMUX0_23_20 | \
* l1 f) w8 Z( ?# v8 z, g                         SYSCFG_PINMUX0_PINMUX0_19_16 | \
' Z9 ]  E) H1 r5 j1 K                         SYSCFG_PINMUX0_PINMUX0_15_12 | \
" B  f: \; d- P5 H# c/ P                         SYSCFG_PINMUX0_PINMUX0_11_8 | \
  @& {! _% W8 w; f$ w3 e0 ^0 o                         SYSCFG_PINMUX0_PINMUX0_7_4 | \
. x, t8 @6 B2 z2 r; v8 W0 R                         SYSCFG_PINMUX0_PINMUX0_3_0);
+ Y( g! P0 B, Q( {& A  I% t    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \
: R/ p' q) K: j: ]# f# L         (PINMUX0_MCASP0_AMUTE_ENABLE | PINMUX0_MCASP0_AHCLKX_ENABLE | \* T# }1 s, j5 X7 J! V3 m
          PINMUX0_MCASP0_AHCLKR_ENABLE | PINMUX0_MCASP0_AFSX_ENABLE | \
; G. P' `+ ^+ g- Y& u7 t$ ?          PINMUX0_MCASP0_AFSR_ENABLE | PINMUX0_MCASP0_ACLKX_ENABLE | \
- p9 O3 }. t1 t4 s6 k9 A2 i- [- B          PINMUX0_MCASP0_ACLKR_ENABLE | savePinMux);" S, Z$ K# f2 T
    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & \
9 g# M( G0 o# p# M" P9 s% w3 _                       ~(SYSCFG_PINMUX1_PINMUX1_19_16 | \3 D! d2 h* A: s! _
                         SYSCFG_PINMUX1_PINMUX1_15_12 | \
" m' l% r* i# a. a$ L; c3 h# b                         SYSCFG_PINMUX1_PINMUX1_11_8  | \+ Q+ B. U4 h& |6 h
                         SYSCFG_PINMUX1_PINMUX1_7_4   | \
: _9 [$ w/ I2 d! A* c5 e6 R/ \# Q                         SYSCFG_PINMUX1_PINMUX1_23_20 | \. v9 C1 k/ V4 e( ~5 W! L
                         SYSCFG_PINMUX1_PINMUX1_27_24 | \% Y2 I8 M/ n; k3 O
                         SYSCFG_PINMUX1_PINMUX1_31_28! \9 l& e0 z* k. J
                         );
1 F) H6 F, L- J$ O2 [+ }/ W    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = \
+ x' p* y; h! \! y& |. B# `         (PINMUX1_MCASP0_AXR11_ENABLE | \
9 W1 U0 I. W( L) V4 ], ?3 j          PINMUX1_MCASP0_AXR12_ENABLE | \
! J. s0 v! `) u/ T0 n! m          PINMUX1_MCASP0_AXR13_ENABLE | \
4 g1 P6 D4 ~8 W  z          PINMUX1_MCASP0_AXR14_ENABLE | \9 h: z% e, ]+ {& |/ ]* W! k
          PINMUX1_MCASP0_AXR8_ENABLE  | \* i& _7 i+ ^& l3 |1 {9 {
          PINMUX1_MCASP0_AXR9_ENABLE  | \) n+ g9 L( E- v3 u7 F* r* w; J
          PINMUX1_MCASP0_AXR10_ENABLE | \
$ g4 k% i& a/ X' k  R' I          savePinMux);2 j% _* r( _* u" {: t( H/ x
}4 P. |5 }+ f( [+ Q; {, J
5 f) b: T9 j9 j2 n3 q
1.McASPI2SConfigure(); McASP的配置程序如下:
: Z! H/ ]/ `* i/ X2 K2 Astatic void McASPI2SConfigure(void); ?. j# u% w& O/ N7 x
{
3 {' X. u" q' {  W! x    McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- k+ H8 o" n$ s    McASPTxReset(SOC_MCASP_0_CTRL_REGS);" y& C( H% w) R: s! x

- [* c0 ~6 s' A+ }5 ~    /* Enable the FIFOs for DMA transfer */% O% ]% ]* Y  c* q
//    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 6, 1);, X* R% g5 W. o$ O5 V2 r- [! {9 z
//    McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 O$ }$ A" I) w2 J/ I5 ^( Z
# {7 b, E/ y4 |& l  f
    /* Set I2S format in the transmitter/receiver format units */5 f3 v- t9 U% {* L! R
    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& i# \) S  o2 R! ~+ ^, \      MCASP_RX_MODE_NON_DMA);
7 {, A! ^1 T5 q* o4 h$ Z# p    McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 ]2 q  w) i7 o  D/ K, \. a) I% Y      MCASP_TX_MODE_NON_DMA);* R6 n( [% S. }
. T( i6 ~5 T  \& Y$ Z
    /* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ s/ ?" G7 a) X( m" [
    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % w+ g. |+ g, n8 c& |3 y
                        MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
9 _0 v5 C- I  ]' u% R. d2 k8 o    McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 I2 T( c) B* s0 }. d% x
                        MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);" `, Q+ f0 w: S5 u6 y8 p
. t! X+ A( r' a( g
    /* configure the clock for receiver */+ L/ O* i" }: \
//    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 16u, 16u);) _+ ~8 E: X5 r! _: Y
    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
* u, P- T$ ~% i    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);- }$ _" h! Z" `  }7 j: N+ k
    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,1 o% v6 {0 f% b- r. \) E2 \' }6 D1 z
                          0x00, 0xFF);
: t: B6 N7 T* V  l% E4 P* Q7 q
# A3 a% Z5 x' W    /* configure the clock for transmitter */! x" D+ h: O1 P, Y
//    HWREG(0x01D000A0) = (0x00001F00);$ O; V: L" k. `' C4 `
//    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 16u, 16u);7 o7 L5 [, {: n" W$ {. H8 m1 P
    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);
. V% g, m0 L1 @5 X) E" T) G    McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);5 d$ P. O! N1 v' i
    McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: P! [6 n0 q% h  o5 i
                            0x00, 0xFF);
5 q9 X) I( N  C3 k2 I' L
. j1 L! w  i. a# C    /* Enable synchronization of RX and TX sections  */  ' p) I6 O% f9 d* l
    McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
, w' c: x4 Q4 l9 c/ q8 j+ Y2 ^- r6 R% `6 J1 P; _# ^
    /* Enable the transmitter/receiver slots. I2S uses 2 slots */
- W( F! q, z9 Q1 t9 J/ \/ j    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% x3 X  o/ a; M8 E- E    McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 o. g9 y2 b# j" F7 q
. @8 n6 f" Z, [% S, O" n% r: S
    /*( ^3 h+ d( j1 T. U* }
    ** Set the serializers, Currently only one serializer is set as8 F( G* q1 O3 e9 l. e! ?' @0 W0 ?6 w
    ** transmitter and one serializer as receiver.
4 v- z: o4 R! o    *// [, _0 k8 S; J% U! d
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ ]5 e$ t3 H5 t/ \; d& F5 Z, i    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 13u);- R6 u/ k2 v" R. D; O; i; i
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 14u);
6 T* v) p- b& W4 @3 O6 p! {" j8 a! U    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 8u);- F! N% r' b1 ]2 U! @4 q, w
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 10u);
. F8 @/ ?+ g2 @8 W' n# y1 x  O8 _    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 11u);) |6 M3 }9 B; c; {2 X1 T' e
% f2 A' i8 l2 m. V% W/ ?0 c' ?7 h
    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);: {$ X5 o! R+ Z: S; Z
7 l9 Y2 B7 W+ D
    /*0 W" h/ {  x+ o3 y. v: ~6 f, {& z4 e
    ** Configure the McASP pins
) @) f, m6 _/ o! L    ** Input - Frame Sync, Clock and Serializer Rx
! O9 h7 U3 @) e! W7 k    ** Output - Serializer Tx is connected to the input of the codec 8 u) _. ]) ?/ K: F: Z0 y" v1 Z
    */
" A; u9 z( d6 ?- s$ k    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 z$ |. P3 }- o9 v* R    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,, |! X6 q. `% {/ M* ]1 X/ S8 \* F
                                           MCASP_PIN_AXR(MCASP_XSER_TX)
) b% o; l- |) x9 d' N: F  v                                         | MCASP_PIN_AMUTE2 n2 l8 g- \& k( U2 _1 Q. A
                                         );
0 S3 G, y( q. O3 d: Y" ?5 h% [    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS,/ ^: a6 ?% {) E: O
                                           MCASP_PIN_AFSX
4 }: {/ C2 @% ~9 G( T                                   | MCASP_PIN_AFSR
# B% g& x7 [5 V* a" ^' j0 V9 k                 | MCASP_PIN_AHCLKX
* l2 a$ J0 Y% b3 g* m                       | MCASP_PIN_AHCLKR
! ^6 @9 o) O. J+ T                       | MCASP_PIN_ACLKX( n5 y' ^# j7 y( r+ E
                       | MCASP_PIN_ACLKR
  I5 }' F( [/ x3 p( d                                               | MCASP_PIN_AXR(MCASP_XSER_RX)" T# ^# ]) s. k2 T2 p6 U8 N: B
                                               | MCASP_PIN_AXR(1u<<(13u))
1 c- u3 ^6 O$ Q2 ~+ L                                               | MCASP_PIN_AXR(1u<<(14u))# d; G  G8 I  U
                                               | MCASP_PIN_AXR(1u<<(8u))0 \, Z# p# F6 c  W% m
                                               | MCASP_PIN_AXR(1u<<(10u))1 L0 b$ ]  {. Z* l/ @/ @
                                               | MCASP_PIN_AXR(1u<<(11u))# k( X, N2 r) W8 F( g1 u2 L
                                               );, z, a3 _  b% Y% F3 e2 k

  [( [: U- \# l! j    /* Enable error interrupts for McASP */
1 y1 i1 N. @+ b- B6 r    McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS,: X) t+ G) W% U8 _+ V
                                        MCASP_TX_DATAREADY" t: j9 Z- ^0 P* |0 N' m* W
                                            | MCASP_TX_CLKFAIL # j: [9 C3 H; A) U# O
                                            | MCASP_TX_SYNCERROR4 W5 J: Z4 f6 K9 r$ i
                                            | MCASP_TX_UNDERRUN);
0 e# A& f5 I4 m/ D/ a( R9 }/ w' o  A2 \5 k$ E8 {$ @: X# U
    McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS,* @6 Q7 ^2 x6 t) Z* x8 S
                                        MCASP_RX_DATAREADY
5 s1 f" Y6 h1 _  E                                            | MCASP_RX_CLKFAIL7 E: R" u7 `' Z( H
                                            | MCASP_RX_SYNCERROR
1 o1 b% _8 {7 f3 L6 N: E                                            | MCASP_RX_OVERRUN);
/ {8 v- b$ H! j6 Z5 q# e//MCASP_RX_DMAERROR MCASP_TX_DMAERROR% e( D' E5 |. I0 U! [: c5 P0 f

2 |: o3 P: v" q2 e* `% q}5 _- e$ B" ?0 k+ |% c$ G

: i7 f. l) Z+ @2.运行完上述配置后激活发送接受I2SDataTxRxActivate(); 遇到这个问题:程序无法跳出红色部分的语句
* j/ @# ~! e! i; @static void I2SDataTxRxActivate(void)8 u' L6 C' \- L/ C, ~# q( n: {
{- S7 K5 w8 S! Y
    /* Start the clocks */6 ^4 @$ }3 ^7 ^5 s
    McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- f8 Y7 d' g4 l    McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);
0 B$ _" H2 n, x, R, P
9 [9 z4 \/ X  j    /* Enable EDMA for the transfer */  m( [: C1 y: T3 y$ g
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
/ e; s, w. R$ n! _) t4 R$ D//                        EDMA3_TRIG_MODE_EVENT);! |* z' y& V8 t0 u+ }
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
" u% b/ v  c) m$ @//                        EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);; r2 Z3 \2 U% `9 y. z5 `" G" L4 b
    /* Activate the  serializers */- B+ G0 L9 H6 @+ u) i. @+ n# G
    McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);+ @" j+ Y- `; X- H. ^
    McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 Q6 x' g' g+ J3 a
    /* make sure that the XDATA bit is cleared to zero */) B% H$ W! `6 C2 C) d# X* g9 e
    while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);/ Q2 x/ Q5 s/ w! Q) K) C
    /* Activate the state machines */
8 `# ^8 R/ m4 _4 d4 B/ K  }: f    McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ [' |4 S: ~6 k% `! E2 ^/ z0 C
    McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: E* l6 w# {5 G8 H    McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX, 0);
# i# u4 J) {# A' Y3 A0 |$ I  {. q}
! M( @4 u1 P  z* V# A" B( P" ?' o. n5 V) r( a; c- m; y

作者: Lewis    时间: 2015-10-29 17:26
音频例程的McASP的所有时钟都由外部芯片提供:2 B4 x6 ^, p  |- Z5 U- v; c
在音频例程里,* V' |( ?( Q* A: E
McASP_AHCKLX 外部输入24.576M的时钟,
, F( ]4 L1 @3 |3 k+ a5 Z  e. cMcASP_CLKX由外部输入1.536M的时钟,0 G' ~& L4 y. r* \; Q6 H3 g
McASP_AFSX有外部输入48k时钟。
4 T/ d0 `1 _* ?- n/ l不能激活McASP是由于McASP_CLKX没有时钟输入,在此引脚提供任意时钟即可通过激活函数。
作者: Ming    时间: 2015-10-31 11:40
Lewis 发表于 2015-10-29 17:26
$ D0 t% X# @2 z+ i音频例程的McASP的所有时钟都由外部芯片提供:' x+ p' u6 E0 K+ D, m! K, V2 A6 P2 m
在音频例程里,. G  T0 y, e7 p! m: [1 F" U
McASP_AHCKLX 外部输入24.576M的时钟,
. r8 A( k7 c4 f8 r) v  V' Y
谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死循环判断。没法通过,这又是什么原因?
作者: Ming    时间: 2015-10-31 11:41
Ming 发表于 2015-10-31 11:40+ [) a, \# M$ N3 }* G* x
谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死 ...

: k- _$ S, p  Y, s2 o就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26
5 h& z: R! M5 \音频例程的McASP的所有时钟都由外部芯片提供:
) y* J2 O9 b( I2 b2 P在音频例程里,3 d6 u( M& [$ I$ z% X* _& H! ]
McASP_AHCKLX 外部输入24.576M的时钟,
- K. X' A" ^! U) F; f: |( q
就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26
7 q" W% s9 q4 q+ x# G; M音频例程的McASP的所有时钟都由外部芯片提供:, y  w0 A+ X5 f; d1 C
在音频例程里,
' @) R& U- m1 G1 `$ `7 [' z2 C& [McASP_AHCKLX 外部输入24.576M的时钟,
# Y7 d+ w9 I8 L: o9 j
这句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Lewis    时间: 2015-10-31 21:13
1、5 {# m& X9 c8 t6 P0 A3 g, ^% f8 _6 s9 U
McASP_CLKX 和 McASP_AFSX的时钟倍数要正确0 L# ^' n( e# `/ [# z
2、McASP不支持仿真停止信号,如果加上了软件中断,则后面不能通过此函数。7 C3 Q  r& F' k( \9 {2 C
[attach]502[/attach]4 J2 m9 X# {/ V0 _, t3 J" P' a  g





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