嵌入式开发者社区

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

作者: Ming    时间: 2015-10-29 09:47
标题: McASP无法通过McASPSeriActivate(); 请帮忙看看问题所在?
我的McASP配置分别如下:: J+ @4 b! N3 A; m1 @8 {' D0 q9 |
管脚的复用设置是:5 [" A% h4 i9 O, y5 T9 F
void McASPPinMuxSetup(void)
: k, J: y$ t' H" R! T{
6 F: c8 g& A  y1 T. ~. R    unsigned int savePinMux = 0;6 e$ O1 v: y# z7 l+ i5 D0 q
    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \
+ q. `  O# R6 m; W) S$ X                       ~(SYSCFG_PINMUX0_PINMUX0_27_24 | \" W) J; u4 t! E
                         SYSCFG_PINMUX0_PINMUX0_23_20 | \1 `5 k) J) i! @; O# K
                         SYSCFG_PINMUX0_PINMUX0_19_16 | \1 Z5 U3 L- a7 c( s: E$ p
                         SYSCFG_PINMUX0_PINMUX0_15_12 | \
" M# Q* J, b6 z! P0 W- X                         SYSCFG_PINMUX0_PINMUX0_11_8 | \
! i+ x( H9 {, z' }# _2 W' Q, u                         SYSCFG_PINMUX0_PINMUX0_7_4 | \
2 v( n! b8 a$ K; ]' ^% B' v                         SYSCFG_PINMUX0_PINMUX0_3_0);
( `# j% ]; s7 K. l; f" {8 B    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \
, c. _4 C9 g. M" Z( O         (PINMUX0_MCASP0_AMUTE_ENABLE | PINMUX0_MCASP0_AHCLKX_ENABLE | \  N  b& c# [& I9 r) y
          PINMUX0_MCASP0_AHCLKR_ENABLE | PINMUX0_MCASP0_AFSX_ENABLE | \
6 O9 H# m- P$ x          PINMUX0_MCASP0_AFSR_ENABLE | PINMUX0_MCASP0_ACLKX_ENABLE | \
, @# j0 x1 [( Z1 D) v  F          PINMUX0_MCASP0_ACLKR_ENABLE | savePinMux);' [3 B3 F# U1 }- D0 N; e6 r$ A1 Q, I
    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & \* p6 {: {' N7 E' P! `/ e5 _
                       ~(SYSCFG_PINMUX1_PINMUX1_19_16 | \
  _5 `* q- o/ I, C1 `) ~7 Q                         SYSCFG_PINMUX1_PINMUX1_15_12 | \
: E2 }3 \- O( s) C) Z, C                         SYSCFG_PINMUX1_PINMUX1_11_8  | \
7 ^! B4 T8 \( Q# j5 o                         SYSCFG_PINMUX1_PINMUX1_7_4   | \& L1 [/ M7 @6 h1 }
                         SYSCFG_PINMUX1_PINMUX1_23_20 | \! |3 z; {( J5 S, v2 _' [
                         SYSCFG_PINMUX1_PINMUX1_27_24 | \
  j" g# Y! c. W# O+ \8 f                         SYSCFG_PINMUX1_PINMUX1_31_289 ~$ r6 Y- z& ~9 I9 e9 K/ N
                         );* u' w' v6 ]6 p- W; G# s
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = \
% T7 u7 T3 y* Y2 b         (PINMUX1_MCASP0_AXR11_ENABLE | \
; d0 l$ ~2 r! D; \+ b7 h          PINMUX1_MCASP0_AXR12_ENABLE | \9 d$ Q. ?- `& G  X- \$ o, F
          PINMUX1_MCASP0_AXR13_ENABLE | \% f  D5 ?0 y& r, A* z* R/ J8 F: J
          PINMUX1_MCASP0_AXR14_ENABLE | \* _2 d! R2 O, P. ~8 F
          PINMUX1_MCASP0_AXR8_ENABLE  | \
$ x$ u" |' ^* Q* p; w, l4 Z* @          PINMUX1_MCASP0_AXR9_ENABLE  | \( r! A* j0 O/ _$ c: j' Q' I' I4 H
          PINMUX1_MCASP0_AXR10_ENABLE | \
* F+ |0 w1 }: _0 {          savePinMux);4 b( M& X6 U, m7 h7 i
}
9 A, p+ C0 W% c! f$ ]  v
6 Q  @* N- w0 }, C1.McASPI2SConfigure(); McASP的配置程序如下:
4 s, [* f0 b* ]2 v$ T2 Qstatic void McASPI2SConfigure(void)
2 _: u8 O- I6 \3 t{3 b/ \: ]3 p* T: W9 m; u- ?
    McASPRxReset(SOC_MCASP_0_CTRL_REGS);+ c7 `- _3 v. M: J
    McASPTxReset(SOC_MCASP_0_CTRL_REGS);2 d, V+ H3 t7 A! i6 l6 ~

% _/ X( T: F  o: i! e    /* Enable the FIFOs for DMA transfer */5 ]/ I" B; ]2 B# E* w" c' j
//    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 6, 1);
1 i4 H/ m6 s" V0 O: f. @2 ^//    McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! Q# K/ W3 k5 c8 d6 ~* Q0 ~& N
( r( [- O: C% c
    /* Set I2S format in the transmitter/receiver format units */
/ ^; V5 m% t/ P) A4 N( ~+ j; \; N: |9 |    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 o6 t' X( r6 i, S, v      MCASP_RX_MODE_NON_DMA);4 C% ~. }3 F( u; T' n
    McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- M+ B) o0 h6 B  K" P) }      MCASP_TX_MODE_NON_DMA);- _4 `  q9 V* v! G. ]- T9 s

  F7 ^* A' {6 d$ C* B0 f    /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 |8 w3 ^2 P1 l6 ~  P
    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: X/ C) Q2 y: t3 q0 J" M4 j; g' ?  s                        MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 l( T8 Y4 y2 H. f) y/ C    McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 {7 Q( w, J* S  C" ^                        MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);8 q% Y7 e: A2 O0 J8 q; b+ U
3 R7 I* Z# R2 @
    /* configure the clock for receiver */
; s/ b3 U, A. L' }//    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 16u, 16u);7 e% r. d- q0 x! f  v9 H7 N5 ?# C
    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
  S9 m, ?7 i2 y; O% N5 O    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);# O6 r' o) y( {8 ^
    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,. T$ l' g& h0 t' {/ W4 D5 G
                          0x00, 0xFF);( {! c1 |0 T! a# p( O* V0 C

1 h$ i; k4 V; K% c- c: @    /* configure the clock for transmitter */2 U& f: ?1 }; G
//    HWREG(0x01D000A0) = (0x00001F00);+ E4 c# x7 b$ W" Z5 I: H4 e6 `" e
//    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 16u, 16u);% q6 _( D- b( w
    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);7 |0 ~8 Z- t5 ^- Y1 A
    McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);, X5 P( d0 |8 p& Z& }# d# a
    McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 l3 b; d( _4 d1 i2 |
                            0x00, 0xFF);
- V+ v& r8 l8 G% ~- l) @
4 j6 c/ E: `" K- |1 T3 u3 M3 k    /* Enable synchronization of RX and TX sections  */  " _( l2 p$ Y2 A" p( z
    McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);; Q! B( ?  a2 p/ ]9 u6 ^+ h
) x+ z/ p! s" r
    /* Enable the transmitter/receiver slots. I2S uses 2 slots */" I) i, s( a) x7 q) Y
    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 U- J" ]4 x, W7 v
    McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% r7 r  K, H  w" f  j* X, _( M' D3 G& ^2 ]4 \0 j
    /*/ P5 \: O! {0 Z- I. G' N) \' l
    ** Set the serializers, Currently only one serializer is set as
, x% m3 ]' r% h0 Q: M- d9 z5 G5 I    ** transmitter and one serializer as receiver.4 R5 Q* e) W# ]8 I
    */! K$ O; b" ^: t! @0 x
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, {! r* T  x2 }5 ]1 P  \) n' F; Q8 C9 w
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 13u);
* F3 Q# V) _  V/ M& W8 T1 B6 r    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 14u);% d7 v2 O  h* u. ?! s" L# `
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 8u);
- n0 b0 o& u" U# F( X6 t( U# a$ D    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 10u);
' I- O) s6 Q4 L$ |# K    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 11u);& ^4 p. P: W) `7 Z& m1 ]7 R

  E( C: I  c0 t! `, r+ B4 C, Z2 ^: k    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);6 h) D/ ~% ^" W. ^( x4 u6 j# y
; t! I  `/ d* V5 q) l: N0 S0 W
    /*! w' Y1 {" Y: \
    ** Configure the McASP pins
3 ?; R/ K; ?# K' B) G5 w    ** Input - Frame Sync, Clock and Serializer Rx
6 w1 M  C  o  m; F( z    ** Output - Serializer Tx is connected to the input of the codec
! |, T6 O- h$ S: r1 j    */
* S! e. Z7 t4 J  `    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
, r( B7 Q) X8 w# p6 f    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,9 C# t& h: R% F
                                           MCASP_PIN_AXR(MCASP_XSER_TX); ^5 ?7 ]! J/ E
                                         | MCASP_PIN_AMUTE
0 g  d# U; H" Z6 ]8 B  J                                         );+ k) @& G$ k- `, a- G" L6 B
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS,) v" D7 m" Q2 V* E+ N7 V% Q
                                           MCASP_PIN_AFSX* `; {2 k. Z! g7 ?6 K8 g6 f
                                   | MCASP_PIN_AFSR
! j- j! s. v. v( K5 _9 U2 H, @                 | MCASP_PIN_AHCLKX
4 H  l5 O' v; u                       | MCASP_PIN_AHCLKR
- J* H, s$ P) t) \6 I                       | MCASP_PIN_ACLKX
+ Y9 o4 B/ W: c$ ^) f' E+ [6 j                       | MCASP_PIN_ACLKR# b+ k* E$ r9 U5 T5 n' N
                                               | MCASP_PIN_AXR(MCASP_XSER_RX)4 a9 @2 H8 u. p$ g, G
                                               | MCASP_PIN_AXR(1u<<(13u))( m. I( x/ c0 Z- I3 P% I6 a
                                               | MCASP_PIN_AXR(1u<<(14u))
6 P5 E) j8 K) l3 k5 b1 e                                               | MCASP_PIN_AXR(1u<<(8u))
4 R8 |3 f7 I/ F+ ^7 b                                               | MCASP_PIN_AXR(1u<<(10u))5 n  W8 Z5 d! l* V$ X
                                               | MCASP_PIN_AXR(1u<<(11u))
, T) t% {# V- b2 S& _                                               );
$ m1 j1 u. S* g) U3 A# a# e  s% h& D# o! f, `3 [9 B+ d
    /* Enable error interrupts for McASP */9 _( P& u5 d0 M  {+ c8 X
    McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS,
2 `  T/ z# X- W5 Y" b& x                                        MCASP_TX_DATAREADY7 r  g8 E6 i2 C
                                            | MCASP_TX_CLKFAIL
6 q4 ?( _! i0 o1 a* n+ _                                            | MCASP_TX_SYNCERROR
/ B2 y) H9 {# C" ?# Z                                            | MCASP_TX_UNDERRUN);
' C- W5 \6 z$ Q( z3 @) a& x. i& _
9 v8 [2 ^" L, k& k; u$ `    McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS,' ~/ s  q% T) v0 o/ p* x4 ?
                                        MCASP_RX_DATAREADY. Z6 ]% R1 M9 u7 J) ^0 J
                                            | MCASP_RX_CLKFAIL" X. Q6 a% H5 G
                                            | MCASP_RX_SYNCERROR ) B+ X5 B# X* B) v7 d1 j
                                            | MCASP_RX_OVERRUN);
) U3 U: Z4 F$ \; u# U3 E& T//MCASP_RX_DMAERROR MCASP_TX_DMAERROR% b- s8 a: J/ f. {5 u" v3 i
) _' n/ V! x3 t: c
}
% f0 I8 _* p2 W/ e. B2 a$ W
! _6 f! Q3 _) a9 Q7 i3 V% a8 |3 M; v2.运行完上述配置后激活发送接受I2SDataTxRxActivate(); 遇到这个问题:程序无法跳出红色部分的语句
9 H9 u  ?% A7 G! [static void I2SDataTxRxActivate(void)8 u0 V/ h1 R; j8 q4 |6 w
{8 y7 t- O9 j; L' O7 E6 n
    /* Start the clocks */
* r7 p: z- \6 h  d* _2 {    McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, c+ E8 S7 i. R; N3 _. i
    McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);1 y9 f7 T  M# n
1 c, k5 P$ K( |# j
    /* Enable EDMA for the transfer */
* u4 E+ g5 [8 v//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, R- Z$ l9 @7 o- t4 d& W6 K, [//                        EDMA3_TRIG_MODE_EVENT);3 _5 R5 J+ b+ @) J
//    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% z/ _) x3 e! g: N3 \; x, O$ L+ c//                        EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
* p9 g9 \5 j. n    /* Activate the  serializers */+ {: L5 A: j3 a2 P
    McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 a7 [- A' g( q) u# w  x. W
    McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 `# u# x; l6 s4 v7 D6 v3 I7 q
    /* make sure that the XDATA bit is cleared to zero */
4 e. K- H% a, g4 Y- U    while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);1 f1 M+ ], G) c; t' o3 q# ^, j
    /* Activate the state machines */
2 D  I' o9 V( l- f# M" f/ Y    McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. m2 ^2 l0 I: O2 [    McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" ?1 a" U# i. G- X8 q    McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX, 0);4 a, p. i6 \: e/ a2 j
}
( o/ u/ m' D) J5 b, k2 C. O0 q+ ?6 }! a: J$ n# z) ?

作者: Lewis    时间: 2015-10-29 17:26
音频例程的McASP的所有时钟都由外部芯片提供:
7 A1 g8 A% e" W* V- ^在音频例程里,
7 Z/ e" w/ K3 \/ \: f4 @9 lMcASP_AHCKLX 外部输入24.576M的时钟,
; \) J5 [/ ?% [; H: YMcASP_CLKX由外部输入1.536M的时钟,
4 G2 N8 G- Z& S$ O# WMcASP_AFSX有外部输入48k时钟。* |; Q+ e4 C6 W  H8 p: l
不能激活McASP是由于McASP_CLKX没有时钟输入,在此引脚提供任意时钟即可通过激活函数。
作者: Ming    时间: 2015-10-31 11:40
Lewis 发表于 2015-10-29 17:264 v/ U0 C! W$ @  k  P# r+ y- V
音频例程的McASP的所有时钟都由外部芯片提供:8 [5 a% }9 v0 Q/ A
在音频例程里,  ^! \( M3 d6 |* U/ i1 \
McASP_AHCKLX 外部输入24.576M的时钟,

4 Q" }* P: w' j1 P# }) h! U/ y谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死循环判断。没法通过,这又是什么原因?
作者: Ming    时间: 2015-10-31 11:41
Ming 发表于 2015-10-31 11:40
6 {- W( _& v8 S1 D) P) F9 o谢谢啊,应该是你说的原因。我接上外部时钟,激活是通过了。现在到了判断XSTAT里面的状态那里,一直在死 ...
2 y' w# C2 o' E3 {$ m) x- `. c4 U
就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:26, b, U4 s+ U/ a/ X/ a
音频例程的McASP的所有时钟都由外部芯片提供:) J. A2 T5 ^" K7 z& o. Z; @
在音频例程里,
$ C3 w- ?# t0 D% I' G2 E8 BMcASP_AHCKLX 外部输入24.576M的时钟,
; ^' z& }8 T0 p6 F! N$ h
就是这一句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Ming    时间: 2015-10-31 11:42
Lewis 发表于 2015-10-29 17:260 b* x  |" s4 j0 t4 U
音频例程的McASP的所有时钟都由外部芯片提供:
' j- o" I1 X, V7 ]! U5 A在音频例程里,
# U4 b4 M; X5 d* e) EMcASP_AHCKLX 外部输入24.576M的时钟,

$ E, j5 p+ K8 B& @! \这句while( !(McASPRxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_RX_STAT_DATAREADY));无法通过
作者: Lewis    时间: 2015-10-31 21:13
1、+ e" k2 [6 C2 Z# W/ j
McASP_CLKX 和 McASP_AFSX的时钟倍数要正确, d5 u# l" r, i& _
2、McASP不支持仿真停止信号,如果加上了软件中断,则后面不能通过此函数。
5 S* s9 a0 u$ |* ?[attach]502[/attach]+ Y& s4 q& ^7 b4 |: Y





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