|
我的McASP配置分别如下:
+ l% y8 ?! \4 P8 z8 W管脚的复用设置是:
- T- [6 [: D" `% r+ n+ s! nvoid McASPPinMuxSetup(void)1 s0 v+ Y/ Y c5 P# r A9 l
{3 {3 F4 i! X6 S# D3 O" r- |
unsigned int savePinMux = 0;) n! \2 k% I5 U1 N* o# {( e
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) & \
. M% r* v8 [3 k. ?0 D# A ~(SYSCFG_PINMUX0_PINMUX0_27_24 | \
$ `# t2 ?8 T! z! X SYSCFG_PINMUX0_PINMUX0_23_20 | \
& a- s+ q. K. L# S' {- ` SYSCFG_PINMUX0_PINMUX0_19_16 | \
+ B2 n" g" n- q% i SYSCFG_PINMUX0_PINMUX0_15_12 | \- g y+ c3 ^, I0 s
SYSCFG_PINMUX0_PINMUX0_11_8 | \
2 L2 g: c- O# ^( ^1 r( k SYSCFG_PINMUX0_PINMUX0_7_4 | \
! d# {- O# m1 @& |+ v8 j SYSCFG_PINMUX0_PINMUX0_3_0);% ^. O. i8 n3 P# j6 I
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = \$ K' ? N/ [+ O# ^3 e
(PINMUX0_MCASP0_AMUTE_ENABLE | PINMUX0_MCASP0_AHCLKX_ENABLE | \
4 f: _" V3 w5 M- J PINMUX0_MCASP0_AHCLKR_ENABLE | PINMUX0_MCASP0_AFSX_ENABLE | \2 b' f! Y) K2 E3 W
PINMUX0_MCASP0_AFSR_ENABLE | PINMUX0_MCASP0_ACLKX_ENABLE | \
2 O$ B: I( P: o/ w/ n( G/ T- N6 \ PINMUX0_MCASP0_ACLKR_ENABLE | savePinMux);; ~, J& Q; I$ o- b" n
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & \
& B3 {, M8 u3 s+ s+ j1 Z% z7 x ~(SYSCFG_PINMUX1_PINMUX1_19_16 | \0 K& Y! ^+ P7 c# _+ t
SYSCFG_PINMUX1_PINMUX1_15_12 | \& x M' T; y* `
SYSCFG_PINMUX1_PINMUX1_11_8 | \
" v/ o% a* J1 T% Y6 a5 _' c SYSCFG_PINMUX1_PINMUX1_7_4 | \/ `0 }- w! D0 z
SYSCFG_PINMUX1_PINMUX1_23_20 | \/ A! }# @0 j6 r
SYSCFG_PINMUX1_PINMUX1_27_24 | \
5 ~. }8 S6 E. W/ @ N% B* O SYSCFG_PINMUX1_PINMUX1_31_28
, l% U6 s+ |: Z, B$ m5 }* g0 @ );
- S9 z1 _$ ~2 u0 s' ]+ i7 T HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = \
2 _) S) u) `8 {" ~& O (PINMUX1_MCASP0_AXR11_ENABLE | \, d* D" S1 ^3 z3 D( ?* [
PINMUX1_MCASP0_AXR12_ENABLE | \
& Q& v0 V' `+ t5 n PINMUX1_MCASP0_AXR13_ENABLE | \
0 ?7 w7 J+ g% F7 ^* B PINMUX1_MCASP0_AXR14_ENABLE | \
9 i3 U/ g% |, V0 \. e9 m H PINMUX1_MCASP0_AXR8_ENABLE | \
, L9 b+ h; K& T5 _( q PINMUX1_MCASP0_AXR9_ENABLE | \
, U7 }6 H+ F: d8 g. c8 @. c. O) o PINMUX1_MCASP0_AXR10_ENABLE | \
: F9 r' b; _1 L2 c savePinMux);* c' ?9 B* }( m$ p8 [0 \
}
) S- Y3 ?' d7 w1 T) K/ |& W: m) Q' r5 l9 M
1.McASPI2SConfigure(); McASP的配置程序如下:! `6 F# H6 Q7 l# `4 Q/ G% ?
static void McASPI2SConfigure(void)# ?4 z5 L7 ^9 J7 ^. Y" \8 _
{
- f+ N D- F5 G McASPRxReset(SOC_MCASP_0_CTRL_REGS);" N) ~4 M2 O" S3 o+ ]/ S
McASPTxReset(SOC_MCASP_0_CTRL_REGS);, ~) v) j* l/ o# B, F
) Q- o& \7 y) Q U( q
/* Enable the FIFOs for DMA transfer */5 X- b. D( h1 v% E
// McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 6, 1);
4 _" h$ G. z$ h" S9 E8 Z6 I// McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 y* H, n( X4 l3 n
! ^4 |9 j0 w" }7 y /* Set I2S format in the transmitter/receiver format units */4 }2 |* d5 z) k2 [* g! A: Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; s4 l( h S7 x6 _) \0 g4 ~5 h1 b; Y MCASP_RX_MODE_NON_DMA);
! H$ z9 G7 x+ V' y# A. B, m# n! m McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 _; u7 g. N; m) s. r/ C
MCASP_TX_MODE_NON_DMA);
o4 J+ a6 W# W) u
6 v! d2 t5 w; ~) e7 k1 t /* Configure the frame sync. I2S shall work in TDM format with 2 slots */ @! b& L2 ~) K8 K- i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 D& o* D. o, B4 Y4 y* U MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( g+ b, h, F0 N- j
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ I( b/ R9 ?. V( C2 U- `! K1 V
MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);
' G. e; S' C% B; W! S. a
k0 H# I9 D. C7 k3 E% x /* configure the clock for receiver */
- k0 y+ i' E5 a% G// McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 16u, 16u);
5 w1 ?) J* b" ]- ?1 i+ J, s$ r McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! s; Z+ h. @" z9 U- d McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);6 [( D) n6 \" p1 D; n8 r' H
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 I9 e6 p7 z( h% [& ^+ R5 l% a, ` 0x00, 0xFF);
- |) o5 {" k: H1 V" c% T. }. J( H' R
/* configure the clock for transmitter */" a* j. b2 Z1 R( [
// HWREG(0x01D000A0) = (0x00001F00);. @, D+ g$ E6 S' E
// McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 16u, 16u);2 l( O7 s O; F6 \0 h3 d. g
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);
$ t( t# M) Q. j( P2 @ McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);# j0 |; F \8 } A/ s4 d
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
t. _1 l& D' C* Q: n 0x00, 0xFF);7 N/ Q' x. Y, F/ a0 q$ L' S
, J$ S5 N7 i. V h. ~ x1 a
/* Enable synchronization of RX and TX sections */
8 q- P: f( ^& l1 D% W McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
* o! Y& W6 [- e% s, v1 |3 x5 r( N# d9 k0 w, S$ P5 X+ v
/* Enable the transmitter/receiver slots. I2S uses 2 slots */1 M6 g: |: M8 n. g
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 Y+ I& w, G9 s) R+ S) J9 ?
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, f% G& k& U. G7 Z9 F4 u- ]- n m
: q0 u9 z j8 t: w& {: j /*
4 J- x& p; J+ B ** Set the serializers, Currently only one serializer is set as
4 F' o2 n4 H; ^8 P4 g ** transmitter and one serializer as receiver.
, L3 n: ?0 H- b9 E */5 B0 r8 b3 m# C Z, w. A4 p, ?
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 L& U) S8 |1 x' t8 | McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 13u);, j2 a+ E. C: H* g6 z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 14u);3 D+ c7 q. ]7 x5 t# L# k
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 8u);
\ @4 D2 R& d4 L6 o* P$ M Z McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 10u);
! H" z4 d! r! Q McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 11u);3 I0 |% Q; \: `9 |, w2 Q* B4 J
: w) B5 ?% A. v4 A- f$ p/ z- Y McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);: U0 {% ~0 y5 A8 e" P
" D, T j/ M5 V+ k- L* a9 D4 x t /*- q' [( x' {+ ~* @
** Configure the McASP pins % D2 ?6 ~; Q, k6 G
** Input - Frame Sync, Clock and Serializer Rx
2 J* L( Z1 U, _! O) c3 v3 `3 U ** Output - Serializer Tx is connected to the input of the codec 1 |$ w6 z, j, p4 @( u, E8 b; h
*/
% p' t4 y; q+ r# |: \ McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 C# Z' }9 O4 e/ e4 a: H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,
& {$ I; f" n1 l2 x* E MCASP_PIN_AXR(MCASP_XSER_TX)
* G9 C5 A" y4 y' h- x) ^ | MCASP_PIN_AMUTE- g) t* J5 X+ T! _9 C1 @
);4 ^' Q' [( f5 M
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS,
5 b+ z# p( _2 ~* S- ]5 u MCASP_PIN_AFSX0 l7 W/ i# g% t s$ C5 R
| MCASP_PIN_AFSR
3 G# U6 q* e1 u# z5 B* k& V | MCASP_PIN_AHCLKX/ J: C( ~& u6 T+ E: \0 ?9 Y. I9 p
| MCASP_PIN_AHCLKR# |$ _+ l6 a L
| MCASP_PIN_ACLKX
: a5 t; }7 R {9 ]8 `+ R6 ] | MCASP_PIN_ACLKR
/ [. w' B1 ?2 B& ^# J) ^4 \# w | MCASP_PIN_AXR(MCASP_XSER_RX)
: I! p4 N$ _; X | MCASP_PIN_AXR(1u<<(13u))
: v. E- `/ B& a, t | MCASP_PIN_AXR(1u<<(14u))
. g, r7 S" M7 b$ b9 W! B | MCASP_PIN_AXR(1u<<(8u))8 Z: w {2 j6 V+ N1 b
| MCASP_PIN_AXR(1u<<(10u))" Q" K) [. T, w; {/ e& W: a
| MCASP_PIN_AXR(1u<<(11u))5 K2 `! h; f, ]" X4 @$ e
);! v7 m0 O+ c; E% H
6 L! P2 |) U; v2 O$ \% G' [! G
/* Enable error interrupts for McASP */- {, ~4 r+ W* u( }5 v
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS,
1 @* Z0 \1 C( R, R( l3 D5 S7 j9 ] MCASP_TX_DATAREADY
" I; n+ s' B" Y9 Y3 Z | MCASP_TX_CLKFAIL : G+ _5 {0 ~% W" V: H# [) W
| MCASP_TX_SYNCERROR
2 c* r5 x, U' w- F4 K4 X+ E | MCASP_TX_UNDERRUN);) C1 ]% [: E6 F/ d2 F# X$ O
$ L( c8 l! L$ q: p
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS,0 ]! S/ K8 F3 x' z
MCASP_RX_DATAREADY
1 G7 q- Z0 d3 y& l6 L7 ^ | MCASP_RX_CLKFAIL
( J! O0 L" p( O( z! H" s) ]% m( P/ z7 r | MCASP_RX_SYNCERROR
( s! p3 n9 b3 T | MCASP_RX_OVERRUN);
% P( X, \4 O! w8 |0 ]; h//MCASP_RX_DMAERROR MCASP_TX_DMAERROR# N$ W6 ~ b0 h- [! A' Z! ?
5 K3 W; P8 L, {' \) f}* v4 q8 Z& ~3 e) I% T
& n. P8 f! b8 o& h
2.运行完上述配置后激活发送接受I2SDataTxRxActivate(); 遇到这个问题:程序无法跳出红色部分的语句
) Q, [- H Y! ~0 f) S" bstatic void I2SDataTxRxActivate(void)
3 F+ _7 Y, s$ ]. k; H/ q M( n{
! {+ n" N1 F7 c /* Start the clocks */
% z; L/ Z$ m3 {) @3 O5 z: M0 u McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* ?9 c$ j0 R$ d0 q& J
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);+ t7 L/ R" u8 b% D8 O
- @6 v0 v% u% T& {1 ?5 d" u8 ` /* Enable EDMA for the transfer */& y: B$ M( t* i& ]. t" b) `
// EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ }0 ^$ V) K. p; x* C: E( ~// EDMA3_TRIG_MODE_EVENT);% A" Z) I3 i7 O' m6 q- K
// EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* z: e) l6 {( Y0 ?) H' o6 h8 R0 P// EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
1 A0 z8 s+ h; \ /* Activate the serializers */+ Q8 n1 h1 Y1 f# c; _
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ `/ G G( R1 b" j0 H2 M McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ T' {( [! o8 h) O3 `- ?0 | /* make sure that the XDATA bit is cleared to zero */
1 v. q9 I T. H1 i3 F4 P while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
0 }" V& S1 V8 d: N, N) b& k /* Activate the state machines */" ]. _# o/ f |
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ Y0 m( V) Y9 C- s+ @5 [% { McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- O: Q: ~; O& t+ ~! M1 A! o- f McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX, 0);4 Q/ z2 b* h. H' F- L; G; F" Q% A
}+ m( g6 r% l2 Q) J/ q: F1 Z& j& F
6 r$ L$ D7 z$ m: M7 o+ m
|
|