嵌入式开发者社区

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

作者: Ming    时间: 2015-10-29 09:47
标题: McASP无法通过McASPSeriActivate(); 请帮忙看看问题所在?
我的McASP配置分别如下:/ i9 a7 f9 E: O
管脚的复用设置是:
. @- P9 D* y+ J6 h8 k: zvoid McASPPinMuxSetup(void)! h& ~3 P# m' l) G
{
7 B% g& p3 {( M& B    unsigned int savePinMux = 0;
# ^% \. O3 `) ]  z. P9 N    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \  h! U. ?: r6 i
                       ~(SYSCFG_PINMUX0_PINMUX0_27_24 | \. I# f. S! j7 y# V8 s# j) |: S
                         SYSCFG_PINMUX0_PINMUX0_23_20 | \
2 E  l$ K) p5 T# u% D                         SYSCFG_PINMUX0_PINMUX0_19_16 | \
; l- p, w+ i0 x8 F$ z                         SYSCFG_PINMUX0_PINMUX0_15_12 | \
1 \! ^9 c' a& d" g* ?7 V! q& B                         SYSCFG_PINMUX0_PINMUX0_11_8 | \
( `  N7 D9 d' B# R8 N& w/ {                         SYSCFG_PINMUX0_PINMUX0_7_4 | \) `% i0 H# g0 G/ D* F% l  e4 a. D% |
                         SYSCFG_PINMUX0_PINMUX0_3_0);/ ~) b' ]" ?' G
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \
- _/ {& z+ q  {" p         (PINMUX0_MCASP0_AMUTE_ENABLE | PINMUX0_MCASP0_AHCLKX_ENABLE | \( L/ [* g* c6 V' a  n0 I' A
          PINMUX0_MCASP0_AHCLKR_ENABLE | PINMUX0_MCASP0_AFSX_ENABLE | \
* Y. D9 w6 E  V          PINMUX0_MCASP0_AFSR_ENABLE | PINMUX0_MCASP0_ACLKX_ENABLE | \
0 B2 j8 k8 w1 `; d          PINMUX0_MCASP0_ACLKR_ENABLE | savePinMux);7 u0 p5 y  R8 i3 M
    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & \
" m  g" }& D) H  O                       ~(SYSCFG_PINMUX1_PINMUX1_19_16 | \- J- ?* G. B3 ]. f6 z
                         SYSCFG_PINMUX1_PINMUX1_15_12 | \4 T' ~0 D% I! ^$ l( d9 C
                         SYSCFG_PINMUX1_PINMUX1_11_8  | \
0 x( f1 k# o% S$ N' S3 q0 t9 O                         SYSCFG_PINMUX1_PINMUX1_7_4   | \% W" ]! T9 _: |. {3 M; s
                         SYSCFG_PINMUX1_PINMUX1_23_20 | \
6 J3 r& x- ^( G                         SYSCFG_PINMUX1_PINMUX1_27_24 | \
* l3 E, Q; [& ~) W                         SYSCFG_PINMUX1_PINMUX1_31_288 p' g* f* O4 l( d  B4 g
                         );1 M* N% \* A, |$ m5 P
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = \* _1 Y: t( |% ?4 d  w) z" Z
         (PINMUX1_MCASP0_AXR11_ENABLE | \1 r9 b0 ~+ b5 s( g7 }
          PINMUX1_MCASP0_AXR12_ENABLE | \
& |, i+ v+ N+ s/ D. Y( {; ~1 ^          PINMUX1_MCASP0_AXR13_ENABLE | \4 p7 d* |6 p( ]( A5 I8 f
          PINMUX1_MCASP0_AXR14_ENABLE | \4 S* K: D- E$ V3 g
          PINMUX1_MCASP0_AXR8_ENABLE  | \3 Y$ h9 O0 {  k
          PINMUX1_MCASP0_AXR9_ENABLE  | \7 C$ v& H  k) g# u
          PINMUX1_MCASP0_AXR10_ENABLE | \- x% N! ^2 ?) q+ F
          savePinMux);
6 }' b: w+ \3 k3 [7 w" B9 V}
- `7 G& W8 j$ ]5 ?7 d/ c1 ^; u2 ]4 r) l" |
1.McASPI2SConfigure(); McASP的配置程序如下:
+ J8 \4 a9 J0 Qstatic void McASPI2SConfigure(void)
$ u0 y5 y7 Q! ~4 _5 `) g{
- f# ?' J  c' Y! Y; I8 H2 ]/ S    McASPRxReset(SOC_MCASP_0_CTRL_REGS);7 t9 L6 @% r6 J2 O+ w
    McASPTxReset(SOC_MCASP_0_CTRL_REGS);
8 T8 ]8 U% j9 j4 w4 E
: j: p& W6 ]+ k    /* Enable the FIFOs for DMA transfer */
1 f( @% _$ d! L8 k6 B//    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 6, 1);9 ?  g) ]) y, r' ~: e+ q/ z
//    McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
  q! ~# T: Q' c
$ j) f% S' ^% r! j% v7 g    /* Set I2S format in the transmitter/receiver format units */
1 d+ |. R5 v  r: a) C7 e: d    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 K  ~( b+ m% e! ^* S& Q
      MCASP_RX_MODE_NON_DMA);
8 X- H3 \( B, s/ _- z    McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 |! `: _# s2 T' Z& _      MCASP_TX_MODE_NON_DMA);
3 v6 ?; i( }$ Z
' o( n5 e: @, m" i4 e    /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 F$ G+ i5 T6 }1 T6 p) T' s    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 _- K+ u' k0 k- f
                        MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 z! s& v" ~- z4 H* O
    McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 ]' t7 ]" a: |# b$ i2 x* R% x                        MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);. Q& n5 `# D+ T8 y& j

8 i7 r+ W: I# a3 f  q    /* configure the clock for receiver */
4 |( f0 u+ F9 i! B' s* E//    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 16u, 16u);
( r5 Z  Y" I7 e! u    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 U# P6 ?9 R- A6 V7 Q1 O# L" e
    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
+ ]) O6 `) V7 _! Q    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ N/ @% h, O# e# y1 p& ^! I) [                          0x00, 0xFF);
3 q- m0 y2 l  M+ Z9 u( I$ z- z5 ~. _( A. L! U7 C" F! G+ i- L' q
    /* configure the clock for transmitter */
2 U5 }$ x: _3 T) _5 g//    HWREG(0x01D000A0) = (0x00001F00);
7 t4 ~" F/ v" F1 h  B//    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 16u, 16u);7 H5 S! u" z( n- l* f
    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);
2 n# F/ w4 U1 S/ O" U  f    McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);/ f) Z* h4 G: y# q! q
    McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! G. J* W! [/ o, c3 T                            0x00, 0xFF);
7 T! O2 B) g3 x% u
( v" W9 [5 `. D! w/ c    /* Enable synchronization of RX and TX sections  */  
7 _& \, z- |0 v6 r, x/ x( k* _% o    McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);$ D9 V6 b5 A" S0 Y; }1 r

4 {. o& w  Z( a) A    /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ P% n+ o, [5 _# f, k2 |    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
8 b! R/ y6 `+ A2 y8 d    McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ J+ M  u. w) t& B
6 B0 z4 H  e$ Y/ a% v" ?% u    /*, A9 q2 L8 U- k" s5 X: I! K: a
    ** Set the serializers, Currently only one serializer is set as: u+ S9 ^7 m% @0 `6 }- {
    ** transmitter and one serializer as receiver.) L# m1 d! |) V& j% o
    */2 {6 ~/ d4 t- O' Q. G! s
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ m, E# j4 |% E  u" T* U, _
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 13u);9 S+ W. e' j! k) Q6 r8 X
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 14u);
# T8 T. P- i$ e! I  u1 S    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 8u);
3 r2 H! r0 Q5 t$ y& A8 ]& h9 c    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 10u);- t- X4 j7 \' q% Z: A6 G( ~
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 11u);
, M, l% T& r2 ?0 `1 w
, ]0 y$ p/ k& i2 a9 h' u    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
" o* k( s- ]+ |& F; t+ }+ j, Z3 C, p' M9 V' ]  [2 U
    /*
* _6 [' z& I* F5 D    ** Configure the McASP pins
) j. Y+ ]4 V: x5 M. U    ** Input - Frame Sync, Clock and Serializer Rx3 Y6 J& j: G* V& o
    ** Output - Serializer Tx is connected to the input of the codec ; W  d4 C/ P7 G! y/ ?1 j, T4 F& s. F
    */6 _; Q$ |; f. M8 ^
    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);  e0 q0 n: e( D; d2 `
    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,
' N4 g5 r! }; \* Q- x6 e                                           MCASP_PIN_AXR(MCASP_XSER_TX)/ o+ [  f' M% i; n
                                         | MCASP_PIN_AMUTE
+ V/ o. b& W, H% n9 R                                         );0 X$ V! X# W' X* e' `# {
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS,
6 H, m( {( ?1 H, N$ s                                           MCASP_PIN_AFSX; o! `7 E7 ~  \5 Y3 a/ ?' n/ L
                                   | MCASP_PIN_AFSR9 |6 o' Z0 A0 N
                 | MCASP_PIN_AHCLKX
' ]2 f8 G* l2 V: |8 n/ I                       | MCASP_PIN_AHCLKR
6 O- v% f  G5 P1 g) v                       | MCASP_PIN_ACLKX) S' M4 u4 S0 H: Z( B! J+ c
                       | MCASP_PIN_ACLKR; [  `3 a4 I" y  A; a1 S6 V
                                               | MCASP_PIN_AXR(MCASP_XSER_RX)
7 z$ g# `& N; ]: }) ~                                               | MCASP_PIN_AXR(1u<<(13u))3 C$ i# i7 B' W* @6 ?" }
                                               | MCASP_PIN_AXR(1u<<(14u))1 C. v0 {% V$ J1 `
                                               | MCASP_PIN_AXR(1u<<(8u))$ R$ S; I8 ?' |% ]+ D$ O
                                               | MCASP_PIN_AXR(1u<<(10u))) G8 B4 V( T, Z6 g
                                               | MCASP_PIN_AXR(1u<<(11u))
4 E! V. |7 R8 U/ a% Z" H                                               );
/ [9 }# g+ r- i- X: j" I
% |) `! r, G6 q/ F8 o5 H    /* Enable error interrupts for McASP */; Q/ A" G. l# W, M, E
    McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS,: j6 v# d+ m3 w* X
                                        MCASP_TX_DATAREADY: p# M" W6 D9 ~
                                            | MCASP_TX_CLKFAIL # Z% |0 c5 z- M0 n1 u" W, m1 u- v
                                            | MCASP_TX_SYNCERROR
7 d2 z% h  g9 C7 R- N  e                                            | MCASP_TX_UNDERRUN);% \3 S2 n( d- K# ~$ j1 k

0 S" Z( V& B7 ^4 f6 K4 o. `    McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS,' Q5 y5 v" W, u2 C4 r8 A
                                        MCASP_RX_DATAREADY1 ]# J! W3 Y# \0 u; C3 {
                                            | MCASP_RX_CLKFAIL
; R' s- l- {* c2 n2 T. }+ w                                            | MCASP_RX_SYNCERROR
2 k' }& l; p& v. M                                            | MCASP_RX_OVERRUN);
* y- H: w1 N4 B! S% R- S* j//MCASP_RX_DMAERROR MCASP_TX_DMAERROR0 L: w% o8 v7 h4 a! @  E+ C# B
6 j; u% b# `3 X, |$ D. C
}0 K. B7 T. l2 s) U
  K- g! D  B8 a# V5 s& L% D. v
2.运行完上述配置后激活发送接受I2SDataTxRxActivate(); 遇到这个问题:程序无法跳出红色部分的语句
. g& ]# b+ I/ r  @* j$ sstatic void I2SDataTxRxActivate(void)
1 {5 G2 M9 r5 w& J7 E* l3 B. p$ Y{7 {' Q0 z* x/ v
    /* Start the clocks */* {* R3 `- J- v: \9 O" _& }1 O. U
    McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; u+ \5 H+ z# C% T: \
    McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);
; r& ]4 H* l5 u  M0 Y+ W  w/ _3 J) `; h2 D
    /* Enable EDMA for the transfer */# V7 [, ~, O# \, i1 S- ^, |% c- p
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
3 }8 t1 ~$ {( f0 m//                        EDMA3_TRIG_MODE_EVENT);) ~1 j/ Y( t' S& p: i' h$ }) W8 O1 F
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,4 a4 |- ]: }6 T' b4 ^4 J, L
//                        EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);4 B! ]8 Y, L( i
    /* Activate the  serializers */
5 R) X- ~  ~. J# [$ }    McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ d- P) i3 ]! k/ M3 [8 ^    McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
* K$ S  ]3 r" n$ ^6 ^0 o3 i
    /* make sure that the XDATA bit is cleared to zero */
$ q6 h+ H6 c$ f. t3 A4 X    while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
6 A& ?; K4 F- \9 A, u( L    /* Activate the state machines */
: Z' b; c5 ^* E0 |    McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 C7 w% `) H; v" D- @    McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. c9 c$ s- m) G1 ?; n0 Q5 a    McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX, 0);6 T/ e9 l! y  _" \2 ~2 X1 C
}8 N; s1 R6 o5 ~4 m% ~7 a' [

$ c' ^$ r! y& Z, d( g
作者: Lewis    时间: 2015-10-29 17:26
音频例程的McASP的所有时钟都由外部芯片提供:
- F/ x. u7 [8 ?2 {6 E! y/ i1 @( F在音频例程里,* }+ r/ q  |; M$ z! L
McASP_AHCKLX 外部输入24.576M的时钟,
! G* A( G! T0 V0 P4 j5 o. ?! Z$ lMcASP_CLKX由外部输入1.536M的时钟,! z$ _, B# q, A( m8 o' Q
McASP_AFSX有外部输入48k时钟。
& T6 [' l& D2 c不能激活McASP是由于McASP_CLKX没有时钟输入,在此引脚提供任意时钟即可通过激活函数。
作者: Ming    时间: 2015-10-31 11:40
Lewis 发表于 2015-10-29 17:264 T5 U) D6 a+ u
音频例程的McASP的所有时钟都由外部芯片提供:
- H) t, }* D! m+ k  Q6 X+ o在音频例程里,
( v! Y( ?' P4 ], i# R/ X+ BMcASP_AHCKLX 外部输入24.576M的时钟,

3 ^! \5 [, D& c* J谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死循环判断。没法通过,这又是什么原因?
作者: Ming    时间: 2015-10-31 11:41
Ming 发表于 2015-10-31 11:40/ u2 f! i- x. ^  f- J6 e. U/ T
谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死 ...

1 y' f* z" a/ o就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:263 w7 |3 j. d, H7 F0 K+ F6 ?: T4 D4 `
音频例程的McASP的所有时钟都由外部芯片提供:+ U+ Q  H! t! f
在音频例程里,  a  }1 [/ F  t- V. d7 C7 ?- G
McASP_AHCKLX 外部输入24.576M的时钟,
6 U, b/ R# T2 }9 Z
就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26
/ t# I- X, k! b) j- Z% t音频例程的McASP的所有时钟都由外部芯片提供:
& o& `3 z$ n& R/ w1 X& s在音频例程里,2 N0 k( Q# D; m: P) B
McASP_AHCKLX 外部输入24.576M的时钟,
, `! c( ~* L) D. m3 Z1 `
这句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Lewis    时间: 2015-10-31 21:13
1、$ J' W+ J0 k- y: ~6 U
McASP_CLKX 和 McASP_AFSX的时钟倍数要正确
1 B5 _* y! ]9 m' c6 }2、McASP不支持仿真停止信号,如果加上了软件中断,则后面不能通过此函数。$ @9 K! D5 w! J" v/ _
[attach]502[/attach]
/ a6 e  p. s7 g% W. _




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