嵌入式开发者社区

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

作者: Ming    时间: 2015-10-29 09:47
标题: McASP无法通过McASPSeriActivate(); 请帮忙看看问题所在?
我的McASP配置分别如下:
0 s: I* `1 b. _+ k( P管脚的复用设置是:
8 q, T* R1 m, @& q! P$ Rvoid McASPPinMuxSetup(void)7 H0 r2 C5 S6 V# K5 v5 ~
{
: _9 u' l. n3 e1 j    unsigned int savePinMux = 0;
9 F# S7 p, X( X" \    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \+ G" {1 i9 v8 P
                       ~(SYSCFG_PINMUX0_PINMUX0_27_24 | \, z' l8 N% E% n% @, Q
                         SYSCFG_PINMUX0_PINMUX0_23_20 | \
1 v0 G8 w' `0 n% c# z6 G                         SYSCFG_PINMUX0_PINMUX0_19_16 | \
! t' V+ R2 D  }8 |! }2 g* f                         SYSCFG_PINMUX0_PINMUX0_15_12 | \
- a; i* c, m, x1 y/ ~                         SYSCFG_PINMUX0_PINMUX0_11_8 | \
2 g* R% v* m3 r. W( m                         SYSCFG_PINMUX0_PINMUX0_7_4 | \( k; G  R9 F- F6 [* }* A; V2 s' J
                         SYSCFG_PINMUX0_PINMUX0_3_0);" Y3 y2 }' W$ v
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \
+ V1 i  `# k2 T, Q! f+ n4 z# T. g         (PINMUX0_MCASP0_AMUTE_ENABLE | PINMUX0_MCASP0_AHCLKX_ENABLE | \* O- Z# Z7 E! ~2 t& B3 A4 \( f$ O
          PINMUX0_MCASP0_AHCLKR_ENABLE | PINMUX0_MCASP0_AFSX_ENABLE | \7 z% J( L$ n; n* }7 ?% L; M4 r
          PINMUX0_MCASP0_AFSR_ENABLE | PINMUX0_MCASP0_ACLKX_ENABLE | \% I' N8 V4 Y' M4 ]1 n( ^$ [; H" e
          PINMUX0_MCASP0_ACLKR_ENABLE | savePinMux);
9 _1 `+ I  o8 |3 E$ L    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & \3 h4 H& ~- Q8 n! f0 H- q
                       ~(SYSCFG_PINMUX1_PINMUX1_19_16 | \' [' P9 x% X8 R* ?' k
                         SYSCFG_PINMUX1_PINMUX1_15_12 | \! }$ M4 T5 i$ M' o
                         SYSCFG_PINMUX1_PINMUX1_11_8  | \
% d* B$ D) ^/ ?: n0 x% p2 S2 {2 ^                         SYSCFG_PINMUX1_PINMUX1_7_4   | \
% f9 c# ~2 {* Z1 f1 B                         SYSCFG_PINMUX1_PINMUX1_23_20 | \
, @8 B9 h( H) A; H8 p                         SYSCFG_PINMUX1_PINMUX1_27_24 | \$ f7 x% t# y9 Q1 B! n
                         SYSCFG_PINMUX1_PINMUX1_31_286 p% c6 T3 Q- b* i
                         );
( t# w* F- V7 [  L    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = \
- l' [6 ?5 @( C# O! ~$ o         (PINMUX1_MCASP0_AXR11_ENABLE | \- e" R) j+ T, X
          PINMUX1_MCASP0_AXR12_ENABLE | \4 X; n8 p9 c$ i9 y7 v
          PINMUX1_MCASP0_AXR13_ENABLE | \: \! K$ F/ w8 K9 `
          PINMUX1_MCASP0_AXR14_ENABLE | \( Y# S% }  M) e* p
          PINMUX1_MCASP0_AXR8_ENABLE  | \! V, ?# s2 Z( `9 M9 Y5 \# M
          PINMUX1_MCASP0_AXR9_ENABLE  | \# n( ]9 Y/ \7 I2 o4 U4 J
          PINMUX1_MCASP0_AXR10_ENABLE | \
8 E& n  k5 A# U6 P          savePinMux);
4 v3 S4 e: L! @( q- c}9 z, J* l" |4 P" X+ B2 \
# C9 |5 T- H1 H7 ^$ ?# M
1.McASPI2SConfigure(); McASP的配置程序如下:
2 {* g' p3 ^" S7 m7 a/ Wstatic void McASPI2SConfigure(void)
- _, |+ [- j. H4 z6 X2 t. V{: A, {* ~: X6 S
    McASPRxReset(SOC_MCASP_0_CTRL_REGS);! X: h5 r& `9 K* C9 T
    McASPTxReset(SOC_MCASP_0_CTRL_REGS);  A5 s" Z* c- m4 M1 G, S

& Q$ k3 D5 K( J    /* Enable the FIFOs for DMA transfer */8 {; |' F2 C2 h) P3 w- J& z4 {
//    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 6, 1);
% z& X6 K9 }4 J" O//    McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& s6 x) L7 E8 C* E- P8 ?
8 e0 F/ |2 e: G) U, @4 b
    /* Set I2S format in the transmitter/receiver format units */
4 Q' ^4 ^/ \, Y6 R4 a5 j    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! Z. p8 w0 i& A+ Q, R- J& B& Q& k      MCASP_RX_MODE_NON_DMA);
+ K4 A, ?- o! N! X    McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 d" A3 e8 I$ A      MCASP_TX_MODE_NON_DMA);
. J; ]  B0 N6 E: V$ Q
3 [; _9 H( \% ]    /* Configure the frame sync. I2S shall work in TDM format with 2 slots */) y6 N' K# Y" I- D
    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * Y. I5 K+ |8 V) f/ f& O
                        MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# B$ B/ y0 k; i% u' ]6 }    McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' N, h7 M! G6 R+ w) T8 e                        MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);4 \! g- A! r+ Q( G+ L, p7 E

; A1 M4 S- }4 o8 V; g. x$ q' u( @    /* configure the clock for receiver */7 k# R. Y! G2 h9 {
//    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 16u, 16u);
: h; W/ |8 F! c( p    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ L1 l- Y& _% ]5 v7 O$ u3 J    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);9 b4 ^/ {: t7 o0 M: I% K
    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 F( J- n4 }+ z8 }9 W
                          0x00, 0xFF);" U6 |/ k8 N  r3 a) k6 }$ i( h. I
. W; I/ Y6 R2 ]$ @$ K2 c
    /* configure the clock for transmitter */8 z. Z. M( x- w
//    HWREG(0x01D000A0) = (0x00001F00);
. S' m: E: a" s! n" ]2 Q//    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 16u, 16u);8 ]  R6 K4 B; w" U0 E; D8 ~
    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);
5 ~7 w* G" a5 e    McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) R1 J" c$ B6 t9 U. Z    McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) X. x: u) E) w/ M4 J
                            0x00, 0xFF);% K% a- @1 z/ `- C

, X" `: J9 y8 q" z# i    /* Enable synchronization of RX and TX sections  */  
% Z8 N6 N' K$ N$ f; d0 @    McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);: C% W( A0 P7 o
; N- t: i: q4 I8 ~, Q; i8 q
    /* Enable the transmitter/receiver slots. I2S uses 2 slots */
( M4 H7 {& k5 V% N2 E$ C    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ I) S4 y) i' q  P; S/ W    McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) z+ N; y- H" \" g: w2 v0 H+ n# d
    /*( G2 A% {% z3 w
    ** Set the serializers, Currently only one serializer is set as
4 x; U' ?& i; a5 `    ** transmitter and one serializer as receiver.2 H, A4 Z6 B  Y$ d% y/ A
    */3 V9 m1 ^7 M) [0 p
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" G# [& U4 g( z; F    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 13u);1 X* ?4 _# m' c% r2 D
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 14u);
' u+ G9 }: r6 |" M5 Q" p( u$ u    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 8u);8 K! H  M* O! @9 |9 a! s7 a
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 10u);( u# Q, b: s$ j; v: I! V
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 11u);' ?+ z0 U& x/ m" P) T

' }% _7 K- p6 ]6 T6 U% a: x7 f2 v    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);! @& X/ @* f* Y+ }* M4 y

/ S1 ]5 s7 K- D9 n* O; O5 ]/ \% V* ]    /*0 N% v6 o1 K" t1 H$ i
    ** Configure the McASP pins
% @+ s; o) T; {    ** Input - Frame Sync, Clock and Serializer Rx
3 I& q# M* D& w    ** Output - Serializer Tx is connected to the input of the codec . J' q7 p* E; b# G: l  ]1 X! k
    *// j7 o0 K: K$ ~$ ?
    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
8 U$ z% D$ J3 |) r. W; v( s    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,2 J( h7 E- J3 q& A- I  @$ f
                                           MCASP_PIN_AXR(MCASP_XSER_TX)4 L% |& e" H3 k2 v9 I& A+ b
                                         | MCASP_PIN_AMUTE
. ?  i$ n2 T$ l7 p) O8 {% r/ [                                         );) `, L! n6 L( W6 J& b2 H
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS,/ V4 f! i8 e8 h1 m
                                           MCASP_PIN_AFSX
! x, j8 v/ f, Y, b6 O5 x0 k% _                                   | MCASP_PIN_AFSR
; m* |1 ~1 L3 p' J9 f" H) m                 | MCASP_PIN_AHCLKX
+ i6 G# t7 B- Y3 d/ t                       | MCASP_PIN_AHCLKR1 O0 k; E3 b$ C+ q  b2 s. @
                       | MCASP_PIN_ACLKX
$ |$ x  I# @; \( Q                       | MCASP_PIN_ACLKR0 o) |) S; }2 L& h
                                               | MCASP_PIN_AXR(MCASP_XSER_RX)
# c% o+ k" f& Q/ d3 @, L5 _+ |                                               | MCASP_PIN_AXR(1u<<(13u))- T( F) i, K( }1 t' a
                                               | MCASP_PIN_AXR(1u<<(14u))
  n. p  q4 P' L: Z. i                                               | MCASP_PIN_AXR(1u<<(8u))
& W- v  U" W5 o+ c" o                                               | MCASP_PIN_AXR(1u<<(10u))
) V& B# k1 D% a1 }                                               | MCASP_PIN_AXR(1u<<(11u))7 w" [/ N1 H" _2 I
                                               );8 S/ x0 v0 w9 Y- n
# T' ?2 k, L8 k1 @6 N
    /* Enable error interrupts for McASP */
7 f. k/ S) U* y8 y' O& j9 n' r    McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS,- H  h. K8 C: w" d7 D8 x* L1 I
                                        MCASP_TX_DATAREADY5 v9 E/ `) V/ O/ f7 k. D
                                            | MCASP_TX_CLKFAIL
9 u  O+ u0 W# S& X8 s; D                                            | MCASP_TX_SYNCERROR( [! V1 Y3 Y& c$ _
                                            | MCASP_TX_UNDERRUN);
2 N  C) [, d+ y0 u  a) C
* F1 j4 `* ?* `5 ~8 t* V    McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS,( T5 L/ {8 S: _$ E% m  B1 h
                                        MCASP_RX_DATAREADY
. _5 [  b9 N: m% m+ i) ~- t, e                                            | MCASP_RX_CLKFAIL7 r& i: p$ \, A$ ^7 X5 `& D6 i% W
                                            | MCASP_RX_SYNCERROR ; m6 T+ u# ?: s7 ?8 c6 O
                                            | MCASP_RX_OVERRUN);
" `9 A# C0 Q( m; E! M//MCASP_RX_DMAERROR MCASP_TX_DMAERROR
9 o, F" C, _8 |% c1 A7 x7 \- Y2 t( t* [( ^  d2 p6 u
}
4 s1 A1 x# B4 E7 D' L3 m/ Y) W2 ^0 e7 O8 D) N2 e
2.运行完上述配置后激活发送接受I2SDataTxRxActivate(); 遇到这个问题:程序无法跳出红色部分的语句1 E! y' v9 d( v7 ~: g4 U% x- F/ b
static void I2SDataTxRxActivate(void)
" q0 h- a: T+ V: M# ~$ B) w{. Q; p8 G+ k- ?) @8 V
    /* Start the clocks */
! K) E! N# c! t9 f    McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 P7 Q# V7 [$ H$ i    McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);
. d+ J& V, p8 t" G2 C# b
+ ]/ e. `; m3 X! K2 ~    /* Enable EDMA for the transfer */
% y4 W) {8 n6 L  A9 \7 H, y; k//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 t6 X  `) F4 e6 y
//                        EDMA3_TRIG_MODE_EVENT);+ j3 |6 C) @5 l6 H1 ?! c
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,+ d. n0 m6 E) ~( M" @2 M
//                        EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
. P2 m  K% z  H4 N9 j( K$ t    /* Activate the  serializers */
4 ]' P% K$ o$ `: G" a8 m    McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 [- M6 N! H2 f- o/ G( m2 y    McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);

& Q3 f/ f: |) U& f# @    /* make sure that the XDATA bit is cleared to zero */
' W+ v* `( a* S% `# Z5 f. A4 r    while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);. R/ H8 A; X7 R- I% L1 j
    /* Activate the state machines */. `# x& E; `: {& o, @* E2 |
    McASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ |7 J) M( l0 y2 ?& f: z# z
    McASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 ~6 J: K, q4 `8 ^2 L
    McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX, 0);1 U% R, ^* ~. k
}
2 s1 D" ]* O! u1 i& g7 a# _: ~1 [; m0 `1 t

作者: Lewis    时间: 2015-10-29 17:26
音频例程的McASP的所有时钟都由外部芯片提供:( [$ Y) V. }) E7 C& E
在音频例程里,
1 I  Y- [5 v7 h: ]/ [McASP_AHCKLX 外部输入24.576M的时钟,
# M2 L8 ?6 ~8 B" BMcASP_CLKX由外部输入1.536M的时钟,
' Z, d+ K$ H: G5 IMcASP_AFSX有外部输入48k时钟。8 o* ]4 v$ b- {
不能激活McASP是由于McASP_CLKX没有时钟输入,在此引脚提供任意时钟即可通过激活函数。
作者: Ming    时间: 2015-10-31 11:40
Lewis 发表于 2015-10-29 17:26( B* ^! R; m3 h9 Q3 @
音频例程的McASP的所有时钟都由外部芯片提供:0 C2 W) A0 Q5 J( o3 I8 M" L, L8 u
在音频例程里,6 n- c  l( x0 H
McASP_AHCKLX 外部输入24.576M的时钟,

3 u( @6 ^# k; U7 \2 z& y1 @7 k' O谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死循环判断。没法通过,这又是什么原因?
作者: Ming    时间: 2015-10-31 11:41
Ming 发表于 2015-10-31 11:40
8 j4 |8 v: E  F9 v谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死 ...
4 z0 ]) d: x0 y6 s5 P* ?- `
就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26
" u( b$ V  ~$ l: r音频例程的McASP的所有时钟都由外部芯片提供:0 T. T$ q3 m8 ?, N
在音频例程里,
; r4 M  _+ c1 x& Y- [6 t' Z! b; HMcASP_AHCKLX 外部输入24.576M的时钟,

& W& z7 S0 l% g# F& I; f就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26# V2 h/ i; f  l3 B, c
音频例程的McASP的所有时钟都由外部芯片提供:
; y! n7 U. x0 t& ^2 K在音频例程里,$ K: y  J3 y% V$ v8 f: D% n) U
McASP_AHCKLX 外部输入24.576M的时钟,

, A6 ]4 p' J4 M8 @7 j3 `0 N7 h这句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Lewis    时间: 2015-10-31 21:13
1、
1 @$ N4 z) [  e* c$ XMcASP_CLKX 和 McASP_AFSX的时钟倍数要正确' d6 |2 P8 ~# P" v
2、McASP不支持仿真停止信号,如果加上了软件中断,则后面不能通过此函数。
2 a2 G8 B% \7 w" Y7 e2 ?$ O[attach]502[/attach]: h2 X" v. [1 k& u2 w; `& ^





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