嵌入式开发者社区

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

作者: Ming    时间: 2015-10-29 09:47
标题: McASP无法通过McASPSeriActivate(); 请帮忙看看问题所在?
我的McASP配置分别如下:: A; o$ Q7 {8 n
管脚的复用设置是:/ o8 T) M5 D, S6 V& F* |
void McASPPinMuxSetup(void)
; ?2 D! p- d6 H1 g* e{
( x* `& d7 U5 k    unsigned int savePinMux = 0;
3 I( h  H! J7 B: v! C6 q7 I: i    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \
$ J0 Y/ W- w" T4 K' i                       ~(SYSCFG_PINMUX0_PINMUX0_27_24 | \6 B2 [9 O( A2 y* b. u
                         SYSCFG_PINMUX0_PINMUX0_23_20 | \
' S5 p: |! x6 p, p" z7 @                         SYSCFG_PINMUX0_PINMUX0_19_16 | \. Q7 J7 q  f0 _0 n4 E
                         SYSCFG_PINMUX0_PINMUX0_15_12 | \
9 G$ v; W7 h" H# O, |! X  v8 z0 ~                         SYSCFG_PINMUX0_PINMUX0_11_8 | \
& i8 p2 }3 C! Z1 }1 k                         SYSCFG_PINMUX0_PINMUX0_7_4 | \
) N. J# e+ B/ |                         SYSCFG_PINMUX0_PINMUX0_3_0);
" P% \' e  Z* i! q    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \
6 e; v2 V5 Y. {5 a2 O: v# X' p         (PINMUX0_MCASP0_AMUTE_ENABLE | PINMUX0_MCASP0_AHCLKX_ENABLE | \6 M1 Z! a4 Y% e6 y# `4 h
          PINMUX0_MCASP0_AHCLKR_ENABLE | PINMUX0_MCASP0_AFSX_ENABLE | \
. D+ p; j- o, C/ t6 @          PINMUX0_MCASP0_AFSR_ENABLE | PINMUX0_MCASP0_ACLKX_ENABLE | \
# n4 c9 T1 n; j- S* e+ f5 a          PINMUX0_MCASP0_ACLKR_ENABLE | savePinMux);4 j0 H: E& W) h& V% \7 _
    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & \
% N5 Q$ h2 }! R4 [4 z( ]                       ~(SYSCFG_PINMUX1_PINMUX1_19_16 | \% u/ a) R, S' _/ U7 W  w
                         SYSCFG_PINMUX1_PINMUX1_15_12 | \
/ g5 O2 E) W9 q1 g; \6 D9 @                         SYSCFG_PINMUX1_PINMUX1_11_8  | \6 A  i  X5 ~+ p6 t3 ]: z3 P
                         SYSCFG_PINMUX1_PINMUX1_7_4   | \8 V& B' \0 N1 y. P) Q! F. U
                         SYSCFG_PINMUX1_PINMUX1_23_20 | \& N5 [" I& Z7 ]+ b3 {& `
                         SYSCFG_PINMUX1_PINMUX1_27_24 | \
7 M1 G- Q+ b- s3 {                         SYSCFG_PINMUX1_PINMUX1_31_28
  G6 r, |8 D. F  h* O( f2 b                         );
: Z- o  H4 B5 U- d- a" t    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = \
% N, m, b' _0 ^4 @/ E( F         (PINMUX1_MCASP0_AXR11_ENABLE | \  e% p0 a6 O7 f+ q
          PINMUX1_MCASP0_AXR12_ENABLE | \
& s' |+ L! \# d          PINMUX1_MCASP0_AXR13_ENABLE | \# n" }& j& q# C& I
          PINMUX1_MCASP0_AXR14_ENABLE | \, [$ ]& b0 \/ n9 z+ }! g. f
          PINMUX1_MCASP0_AXR8_ENABLE  | \) ?# e) S  ^; [
          PINMUX1_MCASP0_AXR9_ENABLE  | \" E* Q# j# a6 D) C6 t
          PINMUX1_MCASP0_AXR10_ENABLE | \$ ^6 ]: ^, y) u4 y) d
          savePinMux);" U$ n- h! j2 h: ^/ m
}+ n( _* C- S5 {2 F: H' ^7 \! A, L, D

# Q' o, a5 `1 G6 s1.McASPI2SConfigure(); McASP的配置程序如下:
0 b4 I( @' i2 Bstatic void McASPI2SConfigure(void)8 b6 @, D2 C: H* c  j# {8 e
{
" j' c2 b( }: Q% k. s) T    McASPRxReset(SOC_MCASP_0_CTRL_REGS);4 B. W! M9 Q5 Q
    McASPTxReset(SOC_MCASP_0_CTRL_REGS);
, A: o$ r* H+ A* M1 A! z5 B" h2 s& b8 P
    /* Enable the FIFOs for DMA transfer */
; t6 q  K: I3 [/ x- _- q! e//    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 6, 1);
, ^4 {* K( I# z3 y' J//    McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ T6 Z; k6 R0 e+ ]& Z

/ o7 f' W& }4 p7 k. a. j8 b0 ?4 s5 n    /* Set I2S format in the transmitter/receiver format units */2 e6 i) Y7 e5 Y: s* E, {  [) S: J/ _. u0 h
    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 Q6 z  y+ O+ }3 V      MCASP_RX_MODE_NON_DMA);
- `! m/ y8 P* v* {7 k* i    McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& ^9 j8 C' O5 C" t( S  v      MCASP_TX_MODE_NON_DMA);
# u: l; B6 M8 R9 k: I* c& \4 N0 Y  S
    /* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 H8 z# z9 i1 O; M) L. `- J' w
    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; x( m+ X; ?' Y                        MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: n3 x1 B1 X  h' H% B8 V
    McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / F  i8 ?. |6 }* c  S  V# E) R" E
                        MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);
' x- Q! P" {* |' F
) P9 k5 y: G( X! \1 s    /* configure the clock for receiver */
- b; ]+ ~7 q* q% f; _1 y//    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 16u, 16u);. E+ x' w/ l- h+ ~
    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 [4 N3 M; v" b# c" ^    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);1 L1 ?) e/ S( _/ R7 {
    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& l6 i% z2 E/ B0 K9 u
                          0x00, 0xFF);/ c/ G4 E4 k1 V0 J' a
/ s! X2 M) v7 F/ D5 c
    /* configure the clock for transmitter */' q8 e6 \0 J/ G' h) k  _
//    HWREG(0x01D000A0) = (0x00001F00);
- h+ H1 x( m' T//    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 16u, 16u);' u% Z; n- `" O/ M: K5 m
    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);7 C1 `; w' E- a. i9 Y
    McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);2 h1 L# T) O3 C
    McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," t% K0 h" J- {$ F; c% Q
                            0x00, 0xFF);
4 P: Z1 u4 I) R: [! T9 M/ j6 H8 g 3 r5 T) b! O- y" v
    /* Enable synchronization of RX and TX sections  */  2 r% X6 v* N8 ~7 u. ~4 l$ o
    McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);& P& e: n: K4 x- t) K+ d
5 B. h* [7 H. j
    /* Enable the transmitter/receiver slots. I2S uses 2 slots */
( p. U& G: c$ ~# f9 ^! A8 B6 g    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' l5 x( ?0 X+ n1 Z' i+ {$ h1 ?    McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; k' w8 l% [' m3 I8 v( |& f6 t0 N3 e5 c  g$ W$ x
    /*
1 q- `( ]; m# n, G- A* a; B, F' M, [    ** Set the serializers, Currently only one serializer is set as
1 l3 Y  S( G. e( t5 N    ** transmitter and one serializer as receiver.9 l: I8 Y5 b% W6 P0 C( Q
    */  s7 H0 D. w6 ?$ ^! {/ q
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" T9 W+ H% _7 t5 t    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 13u);
) o, l1 ~/ a/ l" l1 \; ~0 e- @3 ~    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 14u);
# d' c. F/ V6 \9 d    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 8u);2 _- K4 j# G- g7 V9 J
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 10u);4 g5 v" f7 ], h7 W$ ^# Q) ^
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 11u);
) w) g* x# g4 R6 q+ N) C3 [% z' P! n# y  j  x$ f2 J
    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);1 D+ Y/ f7 \( Q' n* x
8 u3 o7 z. a# r- @
    /*2 j4 [$ E, F/ ^8 v% F
    ** Configure the McASP pins 4 ~) r/ Y( O/ d+ K7 q0 b' z
    ** Input - Frame Sync, Clock and Serializer Rx3 o& m* Y# i( e9 N- g( f3 j. g
    ** Output - Serializer Tx is connected to the input of the codec
) ?( J. I$ y) V    */, d$ \& t& i: X, d$ u
    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, I' F  i( U& ?5 M) V% ?
    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,) W3 ?! F& ^& u
                                           MCASP_PIN_AXR(MCASP_XSER_TX), S! r3 Q2 [& h
                                         | MCASP_PIN_AMUTE
2 h; Z9 s" u6 W, n                                         );5 W+ \8 `4 ?4 r7 V8 y
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS,+ [) j  L& I5 G4 g1 [- D1 j9 R
                                           MCASP_PIN_AFSX
7 m0 e2 j- m/ k/ \6 t- @9 G                                   | MCASP_PIN_AFSR
' I# b( v8 w( f, M; R& F                 | MCASP_PIN_AHCLKX, i) F* R7 ~+ D* s
                       | MCASP_PIN_AHCLKR3 d. P* p0 x; j6 Y
                       | MCASP_PIN_ACLKX
( Z! E( P! ]3 c: B7 ~. F3 x3 h                       | MCASP_PIN_ACLKR% R4 g; T* ^" q# {- c7 V8 s
                                               | MCASP_PIN_AXR(MCASP_XSER_RX)4 Z. d8 f* ?! v- v+ D. a
                                               | MCASP_PIN_AXR(1u<<(13u))
6 f5 g8 b) b# ?8 v% M! C                                               | MCASP_PIN_AXR(1u<<(14u))" X1 \+ Q' G, P
                                               | MCASP_PIN_AXR(1u<<(8u))! p7 ^$ s6 n2 z9 ?# L4 m4 j
                                               | MCASP_PIN_AXR(1u<<(10u))
; t9 M( T: n7 a8 G& I                                               | MCASP_PIN_AXR(1u<<(11u))
+ k& o6 d0 i6 F. [7 M                                               );. {* F% T3 \! L
4 M" J1 P1 c2 U/ z$ q, x
    /* Enable error interrupts for McASP */
; S3 n# A7 ^* V% z    McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS,
! k7 Q; @- r6 c* ^                                        MCASP_TX_DATAREADY
& [" D; P+ L! `- x                                            | MCASP_TX_CLKFAIL 4 [1 F' w; E5 _1 s
                                            | MCASP_TX_SYNCERROR
/ J1 ], S& v4 x% [3 V; D! ^                                            | MCASP_TX_UNDERRUN);6 z/ \( T$ U$ m0 j: x) l

( P3 `$ i' i# Q1 i7 U( M    McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS,, D( j: b8 V3 e& k0 C  o
                                        MCASP_RX_DATAREADY
. X/ X# Z3 o9 K( k+ f5 f* L* O                                            | MCASP_RX_CLKFAIL+ O4 Q2 k: s+ @5 u! g6 T- ~
                                            | MCASP_RX_SYNCERROR 0 t: q8 e2 s, }% }, I( Y
                                            | MCASP_RX_OVERRUN);
6 g( h# w3 p8 ~  {( m//MCASP_RX_DMAERROR MCASP_TX_DMAERROR
. i. c; s& C4 e  I4 Q1 S
( H; _% g+ b+ T! G}: d+ [: k7 k5 Z, ]! O
$ }0 N. e$ E4 ]' W* Z/ n* W
2.运行完上述配置后激活发送接受I2SDataTxRxActivate(); 遇到这个问题:程序无法跳出红色部分的语句2 |* A# z, M0 u1 P6 V
static void I2SDataTxRxActivate(void)
0 V' P# e) L( `1 X8 Q2 V& A8 j{
0 Z3 P4 s9 f; [8 R. K8 C! S    /* Start the clocks */
; H0 S4 _" X/ F2 r( [+ m9 Q; t4 z    McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ @4 H; K; u1 r5 i* N3 s5 W: T9 f  d( s
    McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);
' Y# e+ U' v, T( ]* y5 P
" X2 g- ?) G, x5 z1 z6 m' _    /* Enable EDMA for the transfer */2 q0 E# g+ T$ d9 y! X: \2 \
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 m# T9 O: v4 A8 ~0 X2 \
//                        EDMA3_TRIG_MODE_EVENT);$ e" F6 g  O; ~, @2 u
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' [' s. u% r* v9 t# R" x  _1 \//                        EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
9 _$ }6 v0 j: J! r9 Z0 q: P, ~    /* Activate the  serializers */; l5 _- Z' |$ r/ O5 [
    McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: a% N& n1 U- E: `, h2 }    McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ \4 R7 \$ m4 `! x2 [
    /* make sure that the XDATA bit is cleared to zero */+ W* q2 I- f9 f* v
    while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
6 N4 y6 ~3 z0 o2 i1 R    /* Activate the state machines */
- }5 L! g! U5 q& s7 q    McASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 S1 i& X5 j  f& v8 @6 i7 i) Q
    McASPTxEnable(SOC_MCASP_0_CTRL_REGS);  s  j. o' v! G: M0 I
    McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX, 0);" w' s  L% g# E+ ~
}: x7 A( R2 \8 ?: a

( B5 @* X2 a6 U7 A- p6 G; b
作者: Lewis    时间: 2015-10-29 17:26
音频例程的McASP的所有时钟都由外部芯片提供:: a! S5 {- b7 c2 Z3 x( Q. O
在音频例程里,5 R& m% P  J1 {0 U
McASP_AHCKLX 外部输入24.576M的时钟,! J$ }* w: X2 V: a1 O9 s9 A
McASP_CLKX由外部输入1.536M的时钟,
7 Q* Q) I) q% h# M) j- xMcASP_AFSX有外部输入48k时钟。
/ n& U- b  w$ L" ?' J6 @1 @& ]$ t! z不能激活McASP是由于McASP_CLKX没有时钟输入,在此引脚提供任意时钟即可通过激活函数。
作者: Ming    时间: 2015-10-31 11:40
Lewis 发表于 2015-10-29 17:267 g; \4 N1 D3 j" S" o1 y2 p- O3 c
音频例程的McASP的所有时钟都由外部芯片提供:
* X+ F/ \) a5 D0 @$ j- u在音频例程里,
' h6 `& D) Q/ ^4 _McASP_AHCKLX 外部输入24.576M的时钟,

0 w+ _$ {7 ^( m+ P. n2 b' V4 a谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死循环判断。没法通过,这又是什么原因?
作者: Ming    时间: 2015-10-31 11:41
Ming 发表于 2015-10-31 11:40
) f0 |. C( W, W( r谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死 ...
* f! h: \( D+ g: S2 r# ^
就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26
6 Q, g- S5 S  W5 v  [3 Q5 B音频例程的McASP的所有时钟都由外部芯片提供:' V) @* j1 L) N+ C! N9 ~
在音频例程里," T- s) M6 ?% l
McASP_AHCKLX 外部输入24.576M的时钟,
/ w+ n1 i; V! @" x$ \1 \! u- m' s" z
就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:260 w/ P$ u' I4 l+ w+ _4 ^) r
音频例程的McASP的所有时钟都由外部芯片提供:
4 ?& f1 {3 w) m7 q4 |) Z: S在音频例程里,
0 D' E- g: \! m' nMcASP_AHCKLX 外部输入24.576M的时钟,
1 w0 S" e' Q; @  F& }
这句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Lewis    时间: 2015-10-31 21:13
1、
- F6 H' j4 E+ R& S5 |' pMcASP_CLKX 和 McASP_AFSX的时钟倍数要正确* T0 z+ M4 f8 h2 B
2、McASP不支持仿真停止信号,如果加上了软件中断,则后面不能通过此函数。
( r& K) `) }  J2 {( b) M6 V1 Y2 t9 R[attach]502[/attach]% j3 e4 ~2 s( d" J. B3 `( h3 I





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