嵌入式开发者社区

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

作者: Ming    时间: 2015-10-29 09:47
标题: McASP无法通过McASPSeriActivate(); 请帮忙看看问题所在?
我的McASP配置分别如下:
9 e2 N# Z6 y$ D6 C) L管脚的复用设置是:0 Z/ Q' E5 O( l$ I: V
void McASPPinMuxSetup(void). W6 W' @/ I6 B, B
{
+ [1 ^+ F: ?7 v    unsigned int savePinMux = 0;* @6 b% p( Y3 Z
    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \( m4 X2 e" E( N( n. J& c! n
                       ~(SYSCFG_PINMUX0_PINMUX0_27_24 | \
' N1 C" H7 ?- ~' ?                         SYSCFG_PINMUX0_PINMUX0_23_20 | \
9 _3 K. G7 o; V# V  b; q  t                         SYSCFG_PINMUX0_PINMUX0_19_16 | \, b" ~. d& j# v3 W; [
                         SYSCFG_PINMUX0_PINMUX0_15_12 | \# H% h' A: R) r1 n5 y
                         SYSCFG_PINMUX0_PINMUX0_11_8 | \( B- U2 {/ |. r; p# r7 t! K. d! r
                         SYSCFG_PINMUX0_PINMUX0_7_4 | \
3 l0 W+ Z( A( m1 k/ U8 C6 V                         SYSCFG_PINMUX0_PINMUX0_3_0);2 A4 \1 D3 E" u! S
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \* v6 @2 ^  G, N5 M# ]9 E
         (PINMUX0_MCASP0_AMUTE_ENABLE | PINMUX0_MCASP0_AHCLKX_ENABLE | \
$ X* b, C' C- {- u  ^          PINMUX0_MCASP0_AHCLKR_ENABLE | PINMUX0_MCASP0_AFSX_ENABLE | \
; p( [  b8 v" X          PINMUX0_MCASP0_AFSR_ENABLE | PINMUX0_MCASP0_ACLKX_ENABLE | \
6 I: G. N' q; a# U          PINMUX0_MCASP0_ACLKR_ENABLE | savePinMux);
8 O: I8 A- k( P5 f/ e    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & \
( M7 ~6 {' G+ z, C4 u8 y                       ~(SYSCFG_PINMUX1_PINMUX1_19_16 | \
4 `9 l  S6 @( T9 J2 T5 I0 Q                         SYSCFG_PINMUX1_PINMUX1_15_12 | \
$ m7 M  f1 C+ N+ L5 J                         SYSCFG_PINMUX1_PINMUX1_11_8  | \
5 ~: ~/ C) G, r* J/ [0 M+ @                         SYSCFG_PINMUX1_PINMUX1_7_4   | \# o! `" p8 Z5 d* ~6 M: s
                         SYSCFG_PINMUX1_PINMUX1_23_20 | \
+ b* W0 N  Y! E7 ^$ o                         SYSCFG_PINMUX1_PINMUX1_27_24 | \; [9 a% R# ~" X7 W6 u8 w( t
                         SYSCFG_PINMUX1_PINMUX1_31_28
+ c  K5 E4 E6 y# _- Y: J' f                         );; U; b9 c7 @( x2 h
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = \0 J9 T& k' ?2 r, w  q% J! K2 N
         (PINMUX1_MCASP0_AXR11_ENABLE | \
$ W0 s; W8 U% ^; P6 t3 M  T          PINMUX1_MCASP0_AXR12_ENABLE | \
* O" L4 v: S7 h  i$ L          PINMUX1_MCASP0_AXR13_ENABLE | \
3 l! s3 K) s) {          PINMUX1_MCASP0_AXR14_ENABLE | \
! n/ V' y" e3 H. D2 R' [          PINMUX1_MCASP0_AXR8_ENABLE  | \- J& t  D( ^/ N. C" U
          PINMUX1_MCASP0_AXR9_ENABLE  | \
4 d3 }, i6 b+ y4 V& [9 \5 D          PINMUX1_MCASP0_AXR10_ENABLE | \
9 F& n7 r' M1 u9 J          savePinMux);
6 F3 R+ G& ^- [. U7 c}  l! Q9 y% k+ q' F) h* ^
9 d! M2 e- G9 u1 K' T
1.McASPI2SConfigure(); McASP的配置程序如下:) c5 U4 x- s$ o# g
static void McASPI2SConfigure(void)2 h: B+ B0 {/ x& I2 ]6 t. i2 `
{
; S1 C+ q5 I, g+ h    McASPRxReset(SOC_MCASP_0_CTRL_REGS);  x- r: G' z3 z1 u- E* I& R
    McASPTxReset(SOC_MCASP_0_CTRL_REGS);6 C+ ^7 b, w# q) s( k* j/ V, f

) s$ r- ?# u7 h# \    /* Enable the FIFOs for DMA transfer */
2 O! M4 Q' o- c/ [: a; W9 T+ X//    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 6, 1);0 o* m! a( Q- P- z- h
//    McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 E" G3 k/ @' r
! E8 e& ]* n3 J3 l: Q    /* Set I2S format in the transmitter/receiver format units */2 U2 L0 S5 Y. w/ J$ L$ \
    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" h, q* q% Y# W( C4 y7 F& }      MCASP_RX_MODE_NON_DMA);
) |# n; F! D- M! e    McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 Q6 S  c8 R. \+ ~
      MCASP_TX_MODE_NON_DMA);/ U8 q. X6 N+ r! G% Q$ i6 {% B

. t3 I; j/ ^3 b5 }+ L4 \2 [( ^7 c    /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; Y% T7 a9 c2 x( H! w2 Y' b    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 J3 \3 R6 Q0 F" I7 s+ ~( u- e                        MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' @$ U% _8 }7 B    McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * c1 ~' H8 D2 O
                        MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);
" c. B* j- z" P1 I2 \0 `8 Z; j6 g. T# N
    /* configure the clock for receiver */
! g; x( K8 f$ S, B9 |//    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 16u, 16u);; A1 Y+ t7 o% G1 F* Q  |* [% L% _
    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& }: N6 i3 V2 S    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
$ a* `* Q4 p0 `7 W/ K* J    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,  {( N8 o8 \$ r3 y
                          0x00, 0xFF);
4 y; g0 D" H/ _  l8 U
6 q8 m1 p, H" I! M; r! D    /* configure the clock for transmitter */' D1 b" U( V! m* r
//    HWREG(0x01D000A0) = (0x00001F00);& i* ]) I: X9 C9 Z4 G: L0 X: ?- E
//    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 16u, 16u);
9 g; e/ t0 E! A0 w* X) r    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);
; F; u* H8 b4 [' U    McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);3 W$ n  o5 z/ y
    McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( h6 g& a2 y7 \. S, J& w+ Q
                            0x00, 0xFF);
# I: |4 i4 U. \6 K7 U1 {! {# E
8 w+ R' n/ v: d1 o7 _  L: X3 M    /* Enable synchronization of RX and TX sections  */  
+ P  u: t4 r. Q, g  G9 y; r    McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);; s4 l4 V% V, `3 k2 C% ^

) [$ h' U! v- y+ X    /* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 `9 G" D6 C: P) x    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 e: k( N/ }7 l( h
    McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. ]7 q4 x& Q# w/ |: y
# b( h4 `/ Y! i$ ~6 T0 C6 Y    /*
6 W3 L- {% Q- }/ j    ** Set the serializers, Currently only one serializer is set as0 O, Z. |+ q, n; F; w! h4 O
    ** transmitter and one serializer as receiver.
% q+ y5 J. e/ N' M    */
5 W9 y. h8 v& P4 j$ j    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 m5 o# [0 O% h: Y% Q; K
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 13u);
# \$ D' u1 X' o- l: X+ M" b    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 14u);$ z% V# \8 c: O+ r
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 8u);& C) Z, m  g. F4 a7 X
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 10u);8 Y% ]/ h. d% w4 n! ?1 X
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 11u);/ A+ g& Q5 }2 k( F9 s

/ I* C5 V( U" w+ H7 O    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
5 R; R' u8 g8 i, z" R7 g% e6 ?, C7 ?6 R+ N4 w9 T
    /*4 g8 J& `: W; ?  ^
    ** Configure the McASP pins
+ f6 J- g# B' s; ~0 z1 _    ** Input - Frame Sync, Clock and Serializer Rx
' g+ M# a0 Q- o! Y$ C0 p2 }/ \    ** Output - Serializer Tx is connected to the input of the codec
, p1 t6 j  v, c/ t3 ?4 M! I    */9 o( q8 `' c- ]1 {
    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; b; E, y4 |- ]9 S2 \0 w. D    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,; j" L* w6 ^& o! A8 k
                                           MCASP_PIN_AXR(MCASP_XSER_TX)
& K; I' `* `2 @                                         | MCASP_PIN_AMUTE7 W, a- J- m1 M9 w% P
                                         );
, W2 P9 z* V! f    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS,6 B9 ~* }' W$ O9 J% I
                                           MCASP_PIN_AFSX, R0 t  d* g, J9 `4 G
                                   | MCASP_PIN_AFSR
6 F" M" W- s8 r/ a: j; v                 | MCASP_PIN_AHCLKX5 r# P) _' n, @! g$ ^9 {
                       | MCASP_PIN_AHCLKR0 Z* p! z4 ?: b8 i' u4 M; P% c
                       | MCASP_PIN_ACLKX
" x/ J& o, O: G, e5 U                       | MCASP_PIN_ACLKR
' L" U% P6 M. ?* m  c                                               | MCASP_PIN_AXR(MCASP_XSER_RX). i, b  C" @. A; k# U5 q8 j) v: D
                                               | MCASP_PIN_AXR(1u<<(13u))
+ b; T1 \5 s$ Z/ d/ x2 l8 i& b                                               | MCASP_PIN_AXR(1u<<(14u))
% T. n, v, M, Q, r, i: I                                               | MCASP_PIN_AXR(1u<<(8u))
5 Y3 o! ^. h5 n( s9 ]' K2 F                                               | MCASP_PIN_AXR(1u<<(10u))
  y) h" }- U  g: A  C) L( U                                               | MCASP_PIN_AXR(1u<<(11u))- c8 \5 _9 _9 D/ c5 j
                                               );
1 G2 e  i  t* M( q, W& t" k
, \& r) ^# m/ {5 \" X    /* Enable error interrupts for McASP */
1 g0 Q4 Z" C( o8 y. u2 S    McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS,
& p. \! E  z2 J! n5 h  w: Q0 P                                        MCASP_TX_DATAREADY
5 W7 J5 q" V; k                                            | MCASP_TX_CLKFAIL ! e- X! @" w6 O9 A2 F- Z
                                            | MCASP_TX_SYNCERROR
) E7 R, ?; |8 x. ^) m                                            | MCASP_TX_UNDERRUN);
+ {8 U9 V* o$ r  W7 D6 {8 P8 }' P/ ]& n' I4 c
    McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS,
/ e5 L& A% F  G) m% e  P3 `8 [                                        MCASP_RX_DATAREADY! q2 `, H  \( R2 U
                                            | MCASP_RX_CLKFAIL: D& _$ }: w1 w% I
                                            | MCASP_RX_SYNCERROR
8 a& V* u1 E' B- q                                            | MCASP_RX_OVERRUN);7 F: W: e4 R: W8 J  u9 k: N
//MCASP_RX_DMAERROR MCASP_TX_DMAERROR0 H$ \# d- n1 G! W& ]! |  J

- R6 ~4 H4 O. C/ a% k$ h3 U}% K9 S  a$ u/ X& L1 J3 P

) s- v$ o; v/ j- G2.运行完上述配置后激活发送接受I2SDataTxRxActivate(); 遇到这个问题:程序无法跳出红色部分的语句
/ l. W' s9 @$ Z  {! V4 ?# K- ^static void I2SDataTxRxActivate(void)
3 ]6 ]% b+ R) B{: K* N) f; o& h$ L/ }
    /* Start the clocks */& _6 n* b& |8 }1 x
    McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
( O* m3 k$ ?7 T6 S    McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);
* ~' A8 @, L0 f5 s; ^! V
/ K8 i4 t" w: Z3 y- G4 ^& ]    /* Enable EDMA for the transfer */
; R8 c& v( ~4 y3 O9 X9 E8 G9 s$ D//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; t1 M8 U& H3 ~( {2 @//                        EDMA3_TRIG_MODE_EVENT);# V- X: h7 |* \5 \8 d2 K6 ^/ n
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,* p( t& i/ F. t# {9 w) H' t
//                        EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
, \1 \# U8 I1 I: Y6 g    /* Activate the  serializers */
, G5 ~$ X" q+ P    McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 p; r4 r* k( Y6 j( X    McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 F. h, Z& C/ d* O
    /* make sure that the XDATA bit is cleared to zero */4 L, w# i+ v2 L/ t) _! t) w# w) {6 s
    while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);- c- I, |6 j8 W' _- v
    /* Activate the state machines */. H* {$ |, A& C- b
    McASPRxEnable(SOC_MCASP_0_CTRL_REGS);( J5 j+ ]# p* T4 k( t( d
    McASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 _" m% G( }8 ]8 U1 F/ i
    McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX, 0);
! S7 N: X' h2 s/ V/ h}
- @. r' g% p- d7 X6 h6 a) C
) n0 J) P' |  y1 l- p: G
作者: Lewis    时间: 2015-10-29 17:26
音频例程的McASP的所有时钟都由外部芯片提供:
; b4 {* T( i9 |% `在音频例程里,
; B' f% E" d6 I' w, |, ~( BMcASP_AHCKLX 外部输入24.576M的时钟,
6 {9 G+ e5 N+ pMcASP_CLKX由外部输入1.536M的时钟,' y2 _- K' G/ i# b' i; M
McASP_AFSX有外部输入48k时钟。8 |4 ?! ^# D5 U
不能激活McASP是由于McASP_CLKX没有时钟输入,在此引脚提供任意时钟即可通过激活函数。
作者: Ming    时间: 2015-10-31 11:40
Lewis 发表于 2015-10-29 17:26
( R% P5 s$ }" O5 u5 m5 W/ ^  v音频例程的McASP的所有时钟都由外部芯片提供:
3 y: e% d/ E; y7 R- f5 \在音频例程里,  _( R- [. O% x. V6 @/ L
McASP_AHCKLX 外部输入24.576M的时钟,
+ W4 C% M$ c( @, v1 P7 B) }
谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死循环判断。没法通过,这又是什么原因?
作者: Ming    时间: 2015-10-31 11:41
Ming 发表于 2015-10-31 11:405 N3 u0 T0 e) c, Z+ a; |- U
谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死 ...
. \4 \: j2 u) W0 E( e
就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26" i( k8 C0 }) L9 N" C6 c  `8 w
音频例程的McASP的所有时钟都由外部芯片提供:% v& A# M! s& E4 h0 [1 _
在音频例程里,' c, ]* m2 a8 k! P6 y" ~0 V
McASP_AHCKLX 外部输入24.576M的时钟,

' g, \: i- K3 v0 ~- Y就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26
1 Y! ]6 B/ r( D) C% T, R音频例程的McASP的所有时钟都由外部芯片提供:" v( Y" g- ~- O( V! u
在音频例程里,3 ]) u! r' ^# y# f: V* {, I
McASP_AHCKLX 外部输入24.576M的时钟,
8 e8 v3 m( b( H6 I, M' G# i
这句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Lewis    时间: 2015-10-31 21:13
1、
( Z/ v6 f& G3 p: v+ M+ dMcASP_CLKX 和 McASP_AFSX的时钟倍数要正确8 b; X3 H2 p) e% p
2、McASP不支持仿真停止信号,如果加上了软件中断,则后面不能通过此函数。
4 M  S" p# e( v9 }[attach]502[/attach]* y% y6 o+ O: W9 u$ Y* a





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