嵌入式开发者社区

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

作者: Ming    时间: 2015-10-29 09:47
标题: McASP无法通过McASPSeriActivate(); 请帮忙看看问题所在?
我的McASP配置分别如下:
$ ]( r2 o% P7 R5 z6 g5 ~$ c, X管脚的复用设置是:3 F# C2 A2 Y2 r1 R
void McASPPinMuxSetup(void)' a& \; t2 [3 d1 m( F5 P
{
" ?, O1 @! E9 o* k, ^: d3 V0 j% i    unsigned int savePinMux = 0;
$ C$ Y7 R) @: P! J7 a    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \4 G: J. x& V6 ]) b( N- g3 J* }
                       ~(SYSCFG_PINMUX0_PINMUX0_27_24 | \" F& p8 t5 o7 `2 _
                         SYSCFG_PINMUX0_PINMUX0_23_20 | \
; v& E5 W0 Q9 V( X' P                         SYSCFG_PINMUX0_PINMUX0_19_16 | \3 @6 w% M/ t" B" l0 @& l" ]0 o
                         SYSCFG_PINMUX0_PINMUX0_15_12 | \
! h1 G9 v! y! B& G! u                         SYSCFG_PINMUX0_PINMUX0_11_8 | \4 D& y( t! ~+ E3 l; `( d
                         SYSCFG_PINMUX0_PINMUX0_7_4 | \
0 C* g2 @2 [3 k8 t                         SYSCFG_PINMUX0_PINMUX0_3_0);
4 u$ l8 E4 |" N" C. v4 A; |    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \
0 Z) N8 _' X. i         (PINMUX0_MCASP0_AMUTE_ENABLE | PINMUX0_MCASP0_AHCLKX_ENABLE | \
9 @' A: R2 [. G& `/ }          PINMUX0_MCASP0_AHCLKR_ENABLE | PINMUX0_MCASP0_AFSX_ENABLE | \% {: o4 R0 T6 {4 m" C
          PINMUX0_MCASP0_AFSR_ENABLE | PINMUX0_MCASP0_ACLKX_ENABLE | \2 X  f' o3 W8 B! o
          PINMUX0_MCASP0_ACLKR_ENABLE | savePinMux);
( A1 N' n$ B4 ]' a) l5 @* e    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & \6 }# V5 r7 ^1 W8 j
                       ~(SYSCFG_PINMUX1_PINMUX1_19_16 | \9 p' v) H8 U+ N# H" K) U
                         SYSCFG_PINMUX1_PINMUX1_15_12 | \
4 _8 F$ `4 ]2 b0 F                         SYSCFG_PINMUX1_PINMUX1_11_8  | \
9 H* p% t& y4 y% k3 ?  s8 n                         SYSCFG_PINMUX1_PINMUX1_7_4   | \4 Z: u/ d: ~4 `
                         SYSCFG_PINMUX1_PINMUX1_23_20 | \4 x- S* X/ Z0 \* }: x$ ^
                         SYSCFG_PINMUX1_PINMUX1_27_24 | \
! B$ H2 l) G5 \* }) G: v                         SYSCFG_PINMUX1_PINMUX1_31_28' V) C% r$ q  V1 ]* L3 _
                         );2 i' \0 h0 ?( i5 h- R% I2 H; z
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = \/ N+ P6 m  }5 I$ `! ]
         (PINMUX1_MCASP0_AXR11_ENABLE | \  n9 v. q* z: s5 N+ Y! w
          PINMUX1_MCASP0_AXR12_ENABLE | \
# V9 I+ Y# s1 ?, |9 T# f. {- P          PINMUX1_MCASP0_AXR13_ENABLE | \4 \, p5 r+ X* H1 n# Z  K3 _
          PINMUX1_MCASP0_AXR14_ENABLE | \
/ W8 g9 g" ~- I2 w) v, G          PINMUX1_MCASP0_AXR8_ENABLE  | \3 g$ ^* W# E& c: P9 x# l  z& D1 n. @1 t1 `
          PINMUX1_MCASP0_AXR9_ENABLE  | \
5 O; `0 B) |$ [4 q; X$ b9 B          PINMUX1_MCASP0_AXR10_ENABLE | \
; j* F9 V+ F# @          savePinMux);4 n' N  n6 X. w
}5 Q/ d% G+ _3 f7 I3 X3 H' I( o

, o. z4 Z  e: X1.McASPI2SConfigure(); McASP的配置程序如下:
: ^2 h$ b) [1 Z* a# L, Q7 pstatic void McASPI2SConfigure(void)
  v2 e  X2 S" X- G{/ {1 \( i6 I3 u2 {0 W# V. _5 S
    McASPRxReset(SOC_MCASP_0_CTRL_REGS);: h. X9 L( Q7 T& D3 z
    McASPTxReset(SOC_MCASP_0_CTRL_REGS);
& i+ J, W* d  U8 X% T; W8 i& w: k9 Z* [7 r: ?$ z7 \
    /* Enable the FIFOs for DMA transfer */
! |; K, ?6 Z# Z% s//    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 6, 1);
: k9 Z) P! ^: Y; J4 ]//    McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ v; W/ r1 A' x) X- f+ w4 z2 v7 E) i# k" `- W: @& L6 X" t3 [5 {
    /* Set I2S format in the transmitter/receiver format units *// S7 e1 _2 M9 A& q
    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ a& f( M% y8 E$ n9 L! q: e
      MCASP_RX_MODE_NON_DMA);
' c2 X# ^) ?3 S9 k* y/ F5 P& e% y    McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( C0 B8 n# s& U0 n+ p
      MCASP_TX_MODE_NON_DMA);
2 x4 j6 y. F, u- n
' E2 T) Y4 y: a" r$ G3 ?    /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 d2 T. b2 b& o7 @3 U    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. v- Z; C& r* t" k                        MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% J9 a& f& G9 F# |$ G) l    McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 {/ q: t1 g; `! z+ t/ C
                        MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);: l3 @4 P* y# f" t! \0 l
$ [" c& }+ U: Y9 `0 P( h
    /* configure the clock for receiver */
1 y/ d7 p7 L5 {- W" M+ ~. I8 g( F//    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 16u, 16u);9 T" p% F1 m& M/ Q# \
    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ j9 F1 ^3 N6 ]! |    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' @* L1 M& T! ~- ^: T8 v( b6 n    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 C! I& X. Z1 _7 A' ~/ U
                          0x00, 0xFF);
$ n! j5 c/ S5 D- M; J: ?* _, e' d  @, L6 t
    /* configure the clock for transmitter */
2 t; U3 |5 w- ^; k+ O//    HWREG(0x01D000A0) = (0x00001F00);' q8 U2 @; v2 Q* [9 _" R$ b
//    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 16u, 16u);
3 {8 s8 w6 A% q" A  {    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);% B+ l6 ]: b: A
    McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! U0 S  w4 n' |/ }    McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# V2 c6 i1 A! l7 s                            0x00, 0xFF);# W* d. g4 V, d
6 c8 X6 O& C4 e
    /* Enable synchronization of RX and TX sections  */  , p, ]! P. }  H( d
    McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);' \' z! j% Y) `, j$ u$ S
$ i' E- J( c+ D: {
    /* Enable the transmitter/receiver slots. I2S uses 2 slots */
1 U3 H' f, ?- ?" l3 f0 R+ h    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: G. S$ ~' Z0 @' e6 [8 n    McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);  C: @" o4 Y  @( Y

+ f" F+ t' S/ K) w1 e, x    /*
$ [/ J% K( a1 `    ** Set the serializers, Currently only one serializer is set as
' \% a) E/ u) `3 i# l; e3 F    ** transmitter and one serializer as receiver.
/ g2 a  u$ F3 G3 a. _! R    */) r2 E5 I* a- H$ o$ U
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 N. x: \9 l7 k( `" D5 [  s, [# V    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 13u);9 j1 u* \6 O5 h" |- T# u0 ~( }5 x
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 14u);
8 e" h; N# _& \& \1 ~    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 8u);5 l, F3 h! K" r" o# w
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 10u);
5 d( k) Z5 G8 ]2 k( m) o8 B4 c, P    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 11u);
4 q" Z, p- L' T; l- I# r
) d% H. b! |) u% V    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
& |  y7 D, ]* |9 ^( b) x& E( _8 c( Z
7 x# |. P* C4 O+ |( p$ J7 p! [3 V9 Z    /*
/ ~" B. |9 M& V! x3 @0 a3 V2 u    ** Configure the McASP pins $ Y! ]3 \  R4 {( R4 @3 p3 S, p. J( A
    ** Input - Frame Sync, Clock and Serializer Rx8 J/ d: c, T8 s9 u, }! V
    ** Output - Serializer Tx is connected to the input of the codec
5 W5 g3 M2 `1 e5 k& ]' w: |9 ~    */$ M: H3 ]/ j& h2 [7 r
    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* ?$ Q: x6 [3 A$ R6 X2 ^    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,1 g( x$ @# V( h8 q- V& S4 y7 {
                                           MCASP_PIN_AXR(MCASP_XSER_TX)
. X6 k6 x9 T5 W1 f3 |' D; Y                                         | MCASP_PIN_AMUTE+ U' j' y' {0 |& Q: X
                                         );5 Q+ A  C8 L' I
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS,, o3 w/ |' s: @& ?- d* s. S5 M
                                           MCASP_PIN_AFSX" ?9 {9 S: I1 r! J% i: @
                                   | MCASP_PIN_AFSR! Z  l+ X' b  F$ ?. b! U/ n
                 | MCASP_PIN_AHCLKX
1 x; m, C$ Q: @! j                       | MCASP_PIN_AHCLKR: x; ~4 f- d  p% P% [2 z& A
                       | MCASP_PIN_ACLKX1 g2 q  P7 D. P- v
                       | MCASP_PIN_ACLKR: q. M$ u4 o( |$ |& W# u
                                               | MCASP_PIN_AXR(MCASP_XSER_RX)
6 u  w3 P" j9 q' [. e9 X9 m) j                                               | MCASP_PIN_AXR(1u<<(13u))
8 A$ ?) _  b2 o- @                                               | MCASP_PIN_AXR(1u<<(14u))
0 R* g2 ?; b) I; Y! o; D! B9 V                                               | MCASP_PIN_AXR(1u<<(8u))% _) @) h% b* ]: A, P/ b0 U  ?% L
                                               | MCASP_PIN_AXR(1u<<(10u))
/ @0 U9 z( P+ i) {" j                                               | MCASP_PIN_AXR(1u<<(11u))
% _: N+ b$ r2 _- E) q0 M                                               );5 a( `0 }8 `4 K8 L6 ^& V% b
7 d8 r) f1 C6 O9 ~( J& o. c
    /* Enable error interrupts for McASP */
- q, M6 D. n3 w; y' i    McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS,7 w* V' X# l& u! v5 S, f
                                        MCASP_TX_DATAREADY9 A8 c; ^2 q! R# A4 P
                                            | MCASP_TX_CLKFAIL
( v0 n9 a1 P2 r                                            | MCASP_TX_SYNCERROR
! a) k5 b# d9 _8 P                                            | MCASP_TX_UNDERRUN);
9 _* J9 g  f8 O( u5 y0 M6 B  e6 I+ }6 g. L+ e" w: S- h
    McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS,& a; ~+ H) m2 a6 {( }" H/ l5 p+ t
                                        MCASP_RX_DATAREADY
, n( V+ s  h$ H4 q) q, h                                            | MCASP_RX_CLKFAIL
, x0 i+ H9 D/ D& [/ i                                            | MCASP_RX_SYNCERROR 6 W# x6 z7 `2 ~+ _+ z
                                            | MCASP_RX_OVERRUN);( r' g' h7 L) E8 O
//MCASP_RX_DMAERROR MCASP_TX_DMAERROR
( [, R! {! u3 n" z3 d9 E( c$ t/ }7 N( m* Y: d6 I4 Y! B# t# g# u
}
1 D  X- L& ]% A- Z2 }
1 F! G' E7 K/ d5 ^2.运行完上述配置后激活发送接受I2SDataTxRxActivate(); 遇到这个问题:程序无法跳出红色部分的语句
: s$ n! \0 d/ \7 R8 G6 f1 ]/ s% bstatic void I2SDataTxRxActivate(void)" g0 v- i4 f, [4 |2 o) A
{
# b7 z: K9 b0 o' C5 o$ [, L, H    /* Start the clocks */
2 P0 U# C5 a' d9 d( o! V+ y/ Q    McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);  w; U; @+ u- c
    McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);; f/ m3 l3 |3 w5 @

; S9 Z4 o% _6 ^$ B5 C    /* Enable EDMA for the transfer */) V% n2 h3 I: y6 j
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
/ R4 K& }" f9 |* L) G. R//                        EDMA3_TRIG_MODE_EVENT);
: I/ `5 P/ n/ R8 j, o, |//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: k  f  ?' {+ J7 e//                        EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
1 t* u5 q" x# K9 y* N6 h    /* Activate the  serializers */
1 t# O3 B. D* H, g0 F    McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% f" t: T1 _8 D6 A! W; E
    McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 `. i" h  ?+ [; w; o$ _- W
    /* make sure that the XDATA bit is cleared to zero */
4 ?4 R7 Q$ B1 G7 a( Y    while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);1 `1 p* C  @: M7 k% [) q5 i% h- W
    /* Activate the state machines */. c6 b- z. K8 k* S4 u
    McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 s1 h( Z& o) w( R8 B0 f; V" Y    McASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ V/ _) x4 H; N$ m' T
    McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX, 0);
) u: e$ ?9 R" U* b}) s4 o, E1 R: k* A

: g$ z8 i: }( V; U$ q& N# o& N% c8 n# E
作者: Lewis    时间: 2015-10-29 17:26
音频例程的McASP的所有时钟都由外部芯片提供:0 [5 G4 P7 x$ q; \& Z
在音频例程里,( Q3 c0 X  q6 e" ~4 t- a8 ^4 P
McASP_AHCKLX 外部输入24.576M的时钟,3 y/ q6 U  J9 C5 ~2 P2 [
McASP_CLKX由外部输入1.536M的时钟,8 L* E$ C" i4 e
McASP_AFSX有外部输入48k时钟。
; p  m9 m2 L6 Z0 C, b不能激活McASP是由于McASP_CLKX没有时钟输入,在此引脚提供任意时钟即可通过激活函数。
作者: Ming    时间: 2015-10-31 11:40
Lewis 发表于 2015-10-29 17:26  k* H# i4 W$ X" v; U# y+ i
音频例程的McASP的所有时钟都由外部芯片提供:
( H9 w3 r/ K/ G# g# l( j  a在音频例程里,* B# A. w7 }6 N. p; W5 f
McASP_AHCKLX 外部输入24.576M的时钟,

2 ^1 L9 |+ S# l谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死循环判断。没法通过,这又是什么原因?
作者: Ming    时间: 2015-10-31 11:41
Ming 发表于 2015-10-31 11:40
* n% V3 c& w1 v( K- t谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死 ...

6 E; R/ \' `! \$ E/ k/ A就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26
" p& W! J6 o# s& z/ t* J5 C音频例程的McASP的所有时钟都由外部芯片提供:: ~; y0 Z2 A1 u" m
在音频例程里,
# N0 k* b+ z- yMcASP_AHCKLX 外部输入24.576M的时钟,
# b6 ^1 R3 ]3 B6 l( W$ [
就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26" W$ s% s/ V9 a# n% v
音频例程的McASP的所有时钟都由外部芯片提供:& |) i4 w+ g$ {  C/ h5 x- ^
在音频例程里,
; b- w2 y3 Z- Z1 qMcASP_AHCKLX 外部输入24.576M的时钟,

" k6 s/ ]  d1 B* q5 w这句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Lewis    时间: 2015-10-31 21:13
1、
6 o& H1 @- B, V2 X1 }' f" \McASP_CLKX 和 McASP_AFSX的时钟倍数要正确' l- q/ J! R8 E, j1 |& h9 T: t  L
2、McASP不支持仿真停止信号,如果加上了软件中断,则后面不能通过此函数。
$ u% I" g' r0 f( }5 q0 |/ W[attach]502[/attach]
; K- N& w; b# x. t) ]3 F9 s' J




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