嵌入式开发者社区

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

作者: Ming    时间: 2015-10-29 09:47
标题: McASP无法通过McASPSeriActivate(); 请帮忙看看问题所在?
我的McASP配置分别如下:0 ]/ u2 k0 i% }, z9 v* D
管脚的复用设置是:
( z: N+ t+ b6 X1 x" xvoid McASPPinMuxSetup(void)7 a6 @$ ~* V! `& z5 |
{
5 K$ _6 X* {' r2 Q/ i: ?" J1 T    unsigned int savePinMux = 0;
0 E# M$ n( q% p  ~    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \9 `# {1 S; o' b) u3 ^) x
                       ~(SYSCFG_PINMUX0_PINMUX0_27_24 | \1 f3 Q  |& X. @" X/ f) o
                         SYSCFG_PINMUX0_PINMUX0_23_20 | \: {' |) S5 h9 T, N$ X$ m: p8 b2 k
                         SYSCFG_PINMUX0_PINMUX0_19_16 | \; i4 O8 {* F, g
                         SYSCFG_PINMUX0_PINMUX0_15_12 | \
# h. b0 X# P' ~- r6 i8 ^% C# o, q                         SYSCFG_PINMUX0_PINMUX0_11_8 | \# J4 L/ s" m/ i% M- r7 K4 d6 ~
                         SYSCFG_PINMUX0_PINMUX0_7_4 | \  |. j5 h5 l: l! K( u( R
                         SYSCFG_PINMUX0_PINMUX0_3_0);" x: H2 g& M# L
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \
' Y* I- j3 V+ E+ y! f. @* e; ^         (PINMUX0_MCASP0_AMUTE_ENABLE | PINMUX0_MCASP0_AHCLKX_ENABLE | \
* s+ s3 u% R5 {, e/ _8 Y! I          PINMUX0_MCASP0_AHCLKR_ENABLE | PINMUX0_MCASP0_AFSX_ENABLE | \7 ]! d; Y  g6 H* l4 Q
          PINMUX0_MCASP0_AFSR_ENABLE | PINMUX0_MCASP0_ACLKX_ENABLE | \* P( e) z  }3 v; \5 ?
          PINMUX0_MCASP0_ACLKR_ENABLE | savePinMux);8 J5 H  S0 g% W: b
    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & \
1 h4 J" G  ~$ h( I8 L                       ~(SYSCFG_PINMUX1_PINMUX1_19_16 | \8 e' U" m9 W$ V
                         SYSCFG_PINMUX1_PINMUX1_15_12 | \+ @, |% ~4 \0 e5 W6 a1 \
                         SYSCFG_PINMUX1_PINMUX1_11_8  | \4 i0 C$ H( j% h, Y
                         SYSCFG_PINMUX1_PINMUX1_7_4   | \
. V. J1 V$ |' e/ g                         SYSCFG_PINMUX1_PINMUX1_23_20 | \
( w  u* V9 g/ e                         SYSCFG_PINMUX1_PINMUX1_27_24 | \
# @) j% h* _3 C- U/ T; e$ U                         SYSCFG_PINMUX1_PINMUX1_31_28+ @* G$ G& g3 i) E! }$ R& s. `% {
                         );
$ S9 n1 ]1 O+ _+ Z6 a  Z. Z$ [8 S* {    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = \
# e2 F% j# G$ d) A8 V0 O  l, S" [6 i         (PINMUX1_MCASP0_AXR11_ENABLE | \
( M& T4 H+ S- U. E3 H3 f8 i          PINMUX1_MCASP0_AXR12_ENABLE | \- U/ E8 ^. P0 m& r: S6 Y
          PINMUX1_MCASP0_AXR13_ENABLE | \  b/ c. P& a- b) p* M7 h( l) P6 _
          PINMUX1_MCASP0_AXR14_ENABLE | \6 `, r: G. i- J+ o$ n7 ]6 P  T
          PINMUX1_MCASP0_AXR8_ENABLE  | \" p* N* H% }1 y9 X4 k) U  |9 U
          PINMUX1_MCASP0_AXR9_ENABLE  | \
: {+ ^: A7 f/ ?          PINMUX1_MCASP0_AXR10_ENABLE | \
% c8 Q$ g/ \/ R3 I! d3 K          savePinMux);
" R% }, g! w( F% b% W' P; W}
* D9 C: D& D6 g' ~9 {6 W( C( u: E
6 M, c  D* O. C; B5 X5 |, g0 y1.McASPI2SConfigure(); McASP的配置程序如下:
$ i& ^+ X2 V' D. S, a& `  jstatic void McASPI2SConfigure(void)( m$ F; e+ J3 V0 c5 ~5 b2 K8 [0 Z
{
  r( u" k* Z9 C" |1 p% x( s- J    McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 M& S( k. V9 G* }' O. P# o) J" m    McASPTxReset(SOC_MCASP_0_CTRL_REGS);( J: K. C! a7 ]& L1 j
& p9 @7 R7 ~5 M
    /* Enable the FIFOs for DMA transfer */3 U2 d1 t8 n) S0 ~! [
//    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 6, 1);
4 l; D/ q, ]0 u% A! `5 X- ]# }//    McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 }1 Z# x/ T5 a7 c- S

5 Q8 K5 L: Y3 Q* O1 ~, n; b    /* Set I2S format in the transmitter/receiver format units */
( [  ]( d# u5 q( P    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 j) q5 f6 h4 f) X8 h  E. l% b
      MCASP_RX_MODE_NON_DMA);; e1 \  N- I+ V" c/ W* \0 q# g
    McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,  }, F6 b& Y: Y$ \# k
      MCASP_TX_MODE_NON_DMA);
- m  d& g. x- b8 Y  Y) f3 C. v! g* I! v. s
    /* Configure the frame sync. I2S shall work in TDM format with 2 slots */! t$ u# i8 ~3 Z* L& U: Q
    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - A8 Z( k; K7 @
                        MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 |  |: N  y3 N0 r/ q% h' r% ~
    McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! q9 ?; f, ~2 u
                        MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);
# D" m) t8 M; d6 W& H( S, K7 R% K- h7 U0 H# B, E! t
    /* configure the clock for receiver */3 r9 f* T1 H" a
//    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 16u, 16u);6 e2 r* k7 D3 p
    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# U6 e; B, Q6 x; q# t7 L
    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);8 }( S6 m% w1 m! k
    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 p' _% ^3 |% q) G: ~
                          0x00, 0xFF);9 J% ?  Q- M; w  k$ L: u
7 g9 [( L% }3 [: p8 t3 s
    /* configure the clock for transmitter */
. |  f) s& m! k3 z2 c//    HWREG(0x01D000A0) = (0x00001F00);
' A/ b; N% m8 L5 _# f//    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 16u, 16u);
* N7 w4 |& r  b" |( k    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);' s5 v7 Q7 I9 f
    McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);- [4 X4 y  J5 @7 {% H1 f
    McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 o2 \7 E6 `( ~9 S4 ]
                            0x00, 0xFF);
: ~% e& v* \' u7 L2 B : m7 Y" p% r1 X& Q+ k% }
    /* Enable synchronization of RX and TX sections  */  
. }  @$ r2 \- Y1 i( b, w  _    McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);$ h# u- i+ W3 K/ T, \- _9 v" G

# E% C' D4 S6 f( K& k5 X! W" y    /* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ `' K; n3 [/ o3 z5 p    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, b/ N( T5 p0 Q2 J0 |* a' ?    McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
8 `6 O- U2 |) M) q& \+ S- }4 }( D; {+ v* Y4 g" X; T0 p
    /*% C9 @- k8 d  B% W! B
    ** Set the serializers, Currently only one serializer is set as
8 {3 n* V0 L0 i1 `    ** transmitter and one serializer as receiver.# L0 k8 a' I/ C* n
    */
( X! w$ T: c1 a1 C    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);- b& O  ]% {# z9 \, E
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 13u);
0 [: {! F. F  _, q+ X( c' X    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 14u);  {+ W( D! L( j1 G% v
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 8u);) k2 W- S* F3 W$ {8 D- N+ a6 W- ^
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 10u);; I" O5 g- F+ h+ r) @# r4 e9 J4 W
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 11u);
$ }- G* L6 u8 D: d
- d% O9 F2 K+ s. I7 P    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);7 b% [( q7 @1 A& S1 D. W

$ N; j1 Y: A" X- a- p2 f    /*
% L: E5 D; f2 {  Y9 A* F    ** Configure the McASP pins
3 v* E- x" f- u" u3 `' \    ** Input - Frame Sync, Clock and Serializer Rx: W3 A: ]6 ?8 }3 _& w9 }
    ** Output - Serializer Tx is connected to the input of the codec
0 L1 O( _; I: A2 Z% i( ^) c- R; }    */$ i( o0 E" Z. r5 _0 l# C
    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 V" M$ V8 G6 w) ]7 C' v
    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,
7 d( s8 v) V  C! M5 O( L5 n                                           MCASP_PIN_AXR(MCASP_XSER_TX)
2 J4 N" h0 o) q% X                                         | MCASP_PIN_AMUTE  t. k' x1 X6 V# u  u" j' F
                                         );3 a- U  o. E: y# i% T% b8 u7 @
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS,
% l# F6 c2 {% ?                                           MCASP_PIN_AFSX7 s! Y# i* `5 ~3 M
                                   | MCASP_PIN_AFSR6 k+ X6 A  j3 z' j# \/ `5 k+ _* u, k
                 | MCASP_PIN_AHCLKX
/ H: y" T: X* o' l( L. z                       | MCASP_PIN_AHCLKR
  F& Z& o  g1 `+ H8 K' L                       | MCASP_PIN_ACLKX
) d- d& L0 I, o% u, n$ r! B                       | MCASP_PIN_ACLKR: p2 u5 i, L; ^! x# W$ p
                                               | MCASP_PIN_AXR(MCASP_XSER_RX)$ J6 V3 t1 N+ w1 t5 g$ n" P
                                               | MCASP_PIN_AXR(1u<<(13u))
) U/ e. Q/ _6 I. b/ \% ?* Q                                               | MCASP_PIN_AXR(1u<<(14u))
/ G% m* b/ ~8 O2 y; H$ U' A                                               | MCASP_PIN_AXR(1u<<(8u))  b) E6 f) z' _) @! L# l
                                               | MCASP_PIN_AXR(1u<<(10u))
! ]. m# o/ G9 p* L* {                                               | MCASP_PIN_AXR(1u<<(11u))
+ ~- W8 Z/ e5 P) U" i/ |                                               );. U$ p6 d5 J" a* L4 P" @% X1 V
2 ^; e. P- H1 ?8 D+ y
    /* Enable error interrupts for McASP */
& I. Q# r' S- l0 s5 M* \" }- u+ K    McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS,8 p6 _) _7 Q, b3 A
                                        MCASP_TX_DATAREADY$ D, X# \2 Q# r0 x! d0 w
                                            | MCASP_TX_CLKFAIL
" m+ k& p$ C1 G* s                                            | MCASP_TX_SYNCERROR
* ^3 l8 C* o+ _/ U9 G! S                                            | MCASP_TX_UNDERRUN);
8 _+ `* D& o9 d, B! u4 a4 X6 F2 J& J7 ?" L$ r+ q$ }
    McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS,
* T& b/ Y2 q; j4 m2 Q                                        MCASP_RX_DATAREADY/ l# S5 s- E  F0 S
                                            | MCASP_RX_CLKFAIL
' n. D# o& h: g! X6 e# U0 Z2 S                                            | MCASP_RX_SYNCERROR
# _: M/ o8 P1 f0 H" o+ P                                            | MCASP_RX_OVERRUN);. E* u/ C8 W+ \" {
//MCASP_RX_DMAERROR MCASP_TX_DMAERROR
! b) u; U( l5 L( X* y2 m* `+ ]. g7 {. r7 v3 X, v7 Z' y
}, a$ ~- n0 a2 F6 X6 l9 @
3 \& \6 A. _. u& g
2.运行完上述配置后激活发送接受I2SDataTxRxActivate(); 遇到这个问题:程序无法跳出红色部分的语句$ n" c; [5 a* O4 }5 {) P, O1 I7 u
static void I2SDataTxRxActivate(void)
8 y/ I/ c! O& Q  p. e0 P$ X{
9 ~2 I; R9 j/ G* g2 y7 s+ n# j3 ~    /* Start the clocks */
3 L) {$ U6 w/ W3 h  ]- x  O    McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' o/ d0 Q6 R6 _    McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);1 k5 P% l$ v, ?( U5 i
; \: _. U* k- t- y* t& b
    /* Enable EDMA for the transfer */
- H# j, y2 ?5 r: Z//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) B; q& e; G0 Z, }% L) R& T//                        EDMA3_TRIG_MODE_EVENT);
& J- B; i  _5 @5 P& p9 z, S6 G6 |( M//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
/ i1 s6 i8 ]9 S8 S//                        EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
4 O8 ?% \; [' V5 J    /* Activate the  serializers *// V  j" i3 d1 k- s
    McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* W$ i4 T- c3 ?2 G
    McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);

% G- s) g5 y; s0 M* s    /* make sure that the XDATA bit is cleared to zero */% A6 k5 ]" W, \  Y
    while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);: i  }) O' z! L0 o' ?& C
    /* Activate the state machines */9 \# X! k9 w. n
    McASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ L8 L) a; \* A
    McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 h6 g" [# a1 [+ G+ H    McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX, 0);
% d  [" N2 k% D}
8 z6 h' n' }/ m# ?- J7 _# l; J3 B: `' ^& y/ q

作者: Lewis    时间: 2015-10-29 17:26
音频例程的McASP的所有时钟都由外部芯片提供:
+ O7 C5 B, `, l5 P在音频例程里,
  k0 Y4 \) y' C4 e$ p1 b% NMcASP_AHCKLX 外部输入24.576M的时钟,
' A, z8 k9 p0 H8 W+ d! S% T/ ]McASP_CLKX由外部输入1.536M的时钟,
: {. {  g: L# M& fMcASP_AFSX有外部输入48k时钟。
' D" t( [# S8 \* W; \% L  ?不能激活McASP是由于McASP_CLKX没有时钟输入,在此引脚提供任意时钟即可通过激活函数。
作者: Ming    时间: 2015-10-31 11:40
Lewis 发表于 2015-10-29 17:26
: H( R5 h2 a8 z) Y3 |  L, q5 @: t, Z音频例程的McASP的所有时钟都由外部芯片提供:- D( w) n. S7 F( t, V9 d( {+ v( Y
在音频例程里,, f% R, h+ P( j. V) Y' s4 Y
McASP_AHCKLX 外部输入24.576M的时钟,

8 _: y! |" K* c! P" V" }# Y, F谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死循环判断。没法通过,这又是什么原因?
作者: Ming    时间: 2015-10-31 11:41
Ming 发表于 2015-10-31 11:40! a+ U3 [/ b, R+ t; g' g0 Q
谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死 ...

1 F9 G/ ^& b$ n( v) |2 l- c就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26
% Z' w2 u- O7 b% w音频例程的McASP的所有时钟都由外部芯片提供:0 Q4 v# Y0 {9 G" F2 [6 g  l  D
在音频例程里,1 \. U  ]# V3 q( K5 M+ p: Z8 f
McASP_AHCKLX 外部输入24.576M的时钟,

, P2 W( K$ y$ G2 ]$ V3 T就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26
4 p9 D) k- ^* o+ w+ }1 Z. c* N音频例程的McASP的所有时钟都由外部芯片提供:7 m) @/ |9 w& ]
在音频例程里,
; n4 \/ L# }" w0 x+ d2 f' OMcASP_AHCKLX 外部输入24.576M的时钟,

2 C, J4 w/ |3 K这句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Lewis    时间: 2015-10-31 21:13
1、4 q+ }0 h$ z2 T5 |# t0 @! Q/ u
McASP_CLKX 和 McASP_AFSX的时钟倍数要正确* B3 W1 ^; v. J4 @- M
2、McASP不支持仿真停止信号,如果加上了软件中断,则后面不能通过此函数。
& y# Z* x6 N& N1 s$ }# f[attach]502[/attach]( }8 X0 D6 K; {& x- C. o+ X: K0 ~* B





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