你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【原创】STM32F103的SPI2的配置函数,DMA发送和接收!

[复制链接]
wjandsq 发布时间:2015-6-22 22:22
本帖最后由 wjandsq 于 2015-6-25 14:12 编辑
' D# {/ j  ^3 H. K
& w6 }0 E  X- K5 [6 E! N# y/*; ?2 \3 a+ s6 u6 }$ ~$ p
* spi2.c
1 ~  k: n. @* }" n& E9 p9 d *! p6 c1 {5 z; }! a8 L
*  Created on: 2015年6月22日
8 `7 F) D8 i4 A5 C  w7 S. Z. s* l/ U1 A% ? *      Author: WJ
7 d4 Q, K' d; Y% x; c1 e) P2 g */
% j/ u: Q$ D4 `2 C  R& Z
+ n& y+ S/ l2 E: i" `, A9 y8 @, k1 G0 ^7 _0 X+ ]1 S% c6 C+ E: D
/* Includes ------------------------------------------------------------------*/
2 w) z; b& _5 r4 m" W) `#include "stm32f10x_conf.h"
- D8 |( w5 U" d# e& ^) M, n3 O: I% R( q/ q9 e
#define SPI_Flash_CS_Low()  {GPIO_ResetBits(GPIOC, GPIO_Pin_13);}
" G0 N( a0 D& _/ S' B! U2 G#define SPI_Flash_CS_High() {GPIO_SetBits(GPIOC, GPIO_Pin_13);}& w- d$ W6 L1 l, B3 e5 l: J

1 f  I  i$ ?6 c& fuint8_t SPI2_Rx_Buf[4096];8 N* }/ F! q' x6 N! \* ?
uint8_t SPI2_Tx_Buf[4096];) K: S- O- ~: v

% `4 F2 A4 w  @3 J; Bextern uint16_t Flag_DMA_Rxd_Finished;
# j+ i+ N; R  E+ {5 ?( m4 K1 O7 G" n: e, N: z6 I
extern uint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte);$ |. Y- z2 [& y8 j

) K& e. r2 [/ e5 T/**
4 R2 D: L% q5 T0 i( \. \  * @brief  Configures the SPI2 Peripheral.
: R" Q% m# X) y6 |  * @param  None2 B2 j( X% E. t2 G6 x7 G8 S2 @
  * @retval None! M9 z8 m* y' l
  */* V2 n! {- {- ~* V2 o! I
void SPI2_Config(void){
1 _  ^5 L2 y3 t( V        GPIO_InitTypeDef GPIO_InitStructure;
; w2 L4 m2 Y2 ~/ s2 _- p8 i        SPI_InitTypeDef  SPI_InitStructure;. I* S  Q7 h  u: C& {- X
        DMA_InitTypeDef  DMA_InitStructure;
0 y( e" l7 f, Q8 A/ Q        NVIC_InitTypeDef NVIC_InitStructure;7 C& C" Y. [# Z$ K, B- X) ~( {- H/ @
1 w4 e8 K! g5 A! G, r: n* f
        /* Forces or releases High Speed APB (APB2) peripheral reset --------------*/8 T3 g" q9 |) i! ^4 i% `
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);
- [# [& B1 m/ h+ Q& ^/ F/ H        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE);# t9 x7 _, ^( U  T" I8 k3 m
7 H1 [$ W$ E+ x
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);+ B- g- A5 C$ C
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);
) v' d" |6 C0 ?4 q; E5 d' e/ o, m- @; l# Y" H" D& i$ O  Y
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
1 F5 k- Y" \/ N) ~& t( T        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);( m/ g* d" [" |, Y

% h7 f  A6 W/ q) ]5 h& f' P* R0 C        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);) C4 e/ }8 K' c; \) o5 ^
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);
  W+ w% }3 J9 T, ]  @  F: P& ^+ d! P, S
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
& B6 Q8 n7 \( J( n8 ?5 e        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);+ j9 I" V1 \8 J/ a& l- Z
        /* Peripheral Clock Enable -------------------------------------------------*/
1 T$ S3 L2 R9 |) O, J- l) R        /* DMA1 clock enable */
0 h: R) A+ H9 ?' d        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);: P& B. Q0 V! n9 p6 c; m1 I1 H
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
) j7 v* {* U2 D& J# j        /* Enable GPIO clocks */+ R3 u) C1 B+ y8 P+ s) V
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
# c( u, \/ N  N/ K        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);. U* z; {7 I! M: r$ ^/ N
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/ {; l, l3 }+ T- v
+ D* a+ z' V1 o! K; {' e        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
% R& R0 C4 d" W4 u! C% g) E; v* {        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);! r) s( d/ T; q
        /* SPI GPIO Configuration --------------------------------------------------*/
  E0 i" v' a# B* T7 l7 i        /*
2 `& T! ^; a- B! H         * PB13 --> SPI1 SCK         Mode: GPIO_Mode_AF_PP
6 `% B+ m0 ?* R" R& Z2 V: ~3 g& D         * PB15 --> SPI1 MOSI Write  Mode: GPIO_Mode_AF_PP' F' a' ~# }  r# X
         * PB14 --> SPI1 MISO Read   Mode: GPIO_Mode_IPU
; I/ q  D% X! P! g1 o- q0 X5 J         * PC13 --> SPI1 CS5 `( s0 W- }/ `* j9 Y* [
         */
8 J4 E% Q; Q/ s
& Y) D! `0 ?7 o        GPIO_DeInit(GPIOB);
* P0 A: {1 f; n) T: m4 I  y% f! U        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;- V( V6 Y3 r$ h& [! |
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
. T4 l3 s% \  e8 W& W0 a        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
9 A# |& g! I  `7 ~        GPIO_Init(GPIOB, &GPIO_InitStructure);0 S& ?) ?$ r" {3 j2 y
        GPIO_SetBits(GPIOB, GPIO_Pin_15);
$ t2 \8 r* P7 e# \( }4 h/ l
4 M- v, r2 E- B; _        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;, J3 r' G8 C- t6 o# {! I- ?
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
1 b3 A1 ?4 C# i  m        GPIO_Init(GPIOB, &GPIO_InitStructure);
: k3 {3 E- i. h, x        GPIO_SetBits(GPIOB, GPIO_Pin_14);4 I& d6 k; y$ ]$ Y3 ~5 U

  U: @$ O; Y- b2 z7 Q. @" I8 O        GPIO_DeInit(GPIOC);3 {% c0 A" d( j$ p# W% R
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;, m4 E6 _. O3 c* a7 Q% _
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
# k) w; J7 q2 l+ q; ?- o: N        GPIO_Init(GPIOC, &GPIO_InitStructure);/ {7 |  Z$ k1 I) M6 v
        GPIO_SetBits(GPIOC, GPIO_Pin_13);
: g" ~$ u  G& @& `) L7 Z: C! D$ t* _) V$ u
        SPI_Cmd(SPI2, DISABLE);
7 G8 a' F5 \; ~2 S        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;( m8 O/ u# s4 }1 ]6 O
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
4 h: y) L$ r3 u& S6 d  F. t        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
( A% n$ m& z- {0 `( O6 m        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
4 D% z% B5 S" D2 L        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;3 A6 y, b2 p$ B5 l6 `
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;6 m" N# @5 p8 W4 A7 |/ o
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;: ~* v- I* @0 _9 ]
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;6 A+ t: r8 J* g1 y
        SPI_InitStructure.SPI_CRCPolynomial = 7;
8 c! k7 w7 @6 C# m) P        SPI_Init(SPI2, &SPI_InitStructure);# ?7 w/ S; I$ \. X
        if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) != RESET){
; d2 R# S* A' {3 V9 }) ^" x8 x                SPI_I2S_ReceiveData(SPI2);2 E5 N: s+ D: h! X2 u
                SPI_I2S_ClearFlag(SPI2, SPI_FLAG_CRCERR);* Z- n, \( d2 R, V
        }  P" N1 |: y. c, m

8 {/ m9 U; J/ n* H( W        /* DMA1 Channel4 Configures for SPIS Receive */" _0 z1 X: _. ~5 B8 J: Q
        DMA_DeInit(DMA1_Channel4);# u6 U3 Y. C. ]- G  X
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);
0 L# _$ O: U7 G0 A        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Rx_Buf;
- L( W6 @* L! y6 Z# r3 [        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
3 F+ d3 z6 B- P1 z& w+ d        DMA_InitStructure.DMA_BufferSize = 0;/ \( y3 S: {! V
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;& i8 T1 f+ J, _; g8 A+ n
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
6 r# r9 D. E# z0 y( g% n        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;8 }$ ]7 Q: @# _' P) p
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;9 C5 X! C7 t& ~% `8 d
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;+ h, M5 s- Q/ G3 \
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;- z8 |5 O4 ~2 S, `
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;- E  U! ]+ i2 I3 x( j( H2 ~
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);
2 }2 l, J3 Y" Q
3 Z" @* I& R. O% @. `, S        if(DMA_GetITStatus(DMA1_IT_TC4)!= RESET){; K7 o: g$ B9 z7 P1 |9 Y
                DMA_ClearITPendingBit(DMA1_IT_TC4);
8 r- M/ W9 G/ D, P9 _" b        }/ {  U- m, Y( ?
        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
' U' j: `" T5 N8 B2 B        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);4 i+ u8 c$ [5 f8 N8 }; F

4 `' \' M1 a9 A% B# R1 [        /* Enable DMA1 Channel4 SPI2_RX */
; a; _- H" C; X3 e* G( L        DMA_Cmd(DMA1_Channel4, DISABLE);
0 W* A/ u8 _' \8 I& _6 O' q/ i' o8 R* r) g5 C. E
        /* DMA1 Channel5 Configures for SPI2 Send */
3 h$ _  Y! Z  x        DMA_DeInit(DMA1_Channel5);# K; E; h- M1 s! Z
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);
) p$ }7 K% ~8 Y# b        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Tx_Buf;3 G! v% P8 |% m5 {+ ^
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;% }& ^. N$ T6 L  Q6 T
        DMA_InitStructure.DMA_BufferSize = 0;% M/ m. J" D" ^5 N
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
3 h; P. h. @: g$ h+ l" J/ d2 ~        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;. u- C6 i& D+ B/ R8 o1 O
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
* `: a' D7 F! }. g2 G        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;6 k; x9 y, R. e2 c: {
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
+ Y: C* [8 F' a# ^3 [; C7 @        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;) ]3 |- e4 I2 R+ w1 j+ ^/ z
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
! V" u. z. O2 Y6 h' S        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
! H' h/ ^7 u- h8 C
3 F, j3 z4 N& v! g( z6 p        if(DMA_GetITStatus(DMA1_IT_TC5)!= RESET){8 T, ]0 V$ i( j$ h5 A# U
                DMA_ClearITPendingBit(DMA1_IT_TC5);  [& o1 X4 L7 e. S
        }
1 R- k# c7 X/ c; {; y  q        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);2 Q5 R- a) k  x9 ]1 R% y
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
; K6 w- h: O1 I; t. h  J( M& ]/ C. \  S" g0 P8 I
        /* Enable DMA1 Channel5 SPI1_TX */
6 ~% k! B: a2 n( Z        DMA_Cmd(DMA1_Channel5, DISABLE);5 ^: V" o1 O, }/ E1 ^
: m* `* `( N0 K- p2 N6 n, @" d9 O
        /* Enable the DMA1_Channel4、DMA1_Channel5 Interrupt */
2 y7 i7 e7 R8 ?        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;" n2 W, I8 K! u3 Q4 Q$ u* R
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
9 A: V; ]8 t0 b) w/ h8 a        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
7 M- A1 E) j" r: Z" W, a! V% z- Y. {        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;7 v* {5 p8 u6 E, T# Q/ S
        NVIC_Init(&NVIC_InitStructure);, o" W; @+ J# H" z
, P3 t0 }; c' `; d0 n; G% `8 R
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
, \1 Y2 a5 u% D; P( i        NVIC_Init(&NVIC_InitStructure);! }3 n# n7 t/ s

& e$ P; R% w+ j8 Z! w2 A        /* Enable SPI2  */# b/ m7 W6 A( ], v  l4 x
        SPI_Cmd(SPI2, ENABLE);
3 O8 Z; c3 a. ^/ |, h  ^4 v+ N; p}( C/ t8 U; l. \* s* ]# f
/**4 ^$ G' e' M" E  U& T" D
  * @brief  SPI1_DMA_Start- O& i$ z4 i7 B+ T
  * @param  len <= 4096
/ N. g1 @; r9 u7 y  m% Q  * @retval None
) h5 s- C' Y1 u' N! m9 K  */
$ D& }2 O! @, Q" J0 @
" S1 t, n" V% d" U0 o: j# m! S, gvoid SPI2_DMA_Read_Write(uint16_t len) {3 b5 E) n' P& v! e: i; v
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
* ]' L/ d7 N4 J2 _5 T        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);" f' W# B; V, @% o+ R! f
        DMA1_Channel4->CMAR  = (uint32_t)SPI2_Rx_Buf;
2 _: E; M- E: q! P! z        DMA1_Channel5->CMAR  = (uint32_t)SPI2_Tx_Buf;
+ j( ?* |1 v7 q2 s- U3 {9 q* z        DMA1_Channel4->CNDTR = len;
; a- J. v6 T- J' \3 c. o        DMA1_Channel5->CNDTR = len;& V9 ?" q0 A: x( N7 W# B5 K+ V# t8 [
        DMA_Cmd(DMA1_Channel4, ENABLE);
4 W9 S1 l0 ?+ A7 N1 G        DMA_Cmd(DMA1_Channel5, ENABLE);4 X; e+ q0 e) f' k) ~/ k
        SPI_Cmd(SPI2, ENABLE);
3 c8 w. \- w  F" A5 G2 y' S+ C}
6 d  a/ a& ]  e& s: z5 k) U  _+ g! D" c- Y/ q: y5 v2 d4 k- g
/**
0 }8 L3 W# Q) d. u4 ?8 [3 V  * @brief  SPI2_Set_Speed4 }8 b" N3 q: i$ W
  * @param  SPI2 CR1 bit 9 8 7, |3 Z1 j, k( [
  *          SPI_BaudRatePrescaler_2   ---> 0007 R4 S' n' y" u5 ^5 s
  *          SPI_BaudRatePrescaler_4   ---> 001
" G9 t- J* l4 b+ e8 L! _  *          SPI_BaudRatePrescaler_8   ---> 010  B* R$ l( n) w2 ~
  *          SPI_BaudRatePrescaler_16  ---> 011  s- g' q* L* s" u' Q5 Y
  *          SPI_BaudRatePrescaler_32  ---> 100' B2 q9 B; ~& K5 G8 B5 y2 j
  *          SPI_BaudRatePrescaler_64  ---> 101# c% ]$ g' W; w$ H8 t7 ?9 f
  *          SPI_BaudRatePrescaler_128 ---> 1106 J% j$ X9 k' T* I, Z* F1 k2 Y
  *          SPI_BaudRatePrescaler_256 ---> 111
% z  V2 x! X4 o  * @retval None- w1 c; q& P3 {/ w9 n
  */) h8 R: f& W. j8 \% w
* {1 ~+ n! e9 R5 {- k: ^
void SPI2_Set_Speed(uint8_t BaudRatePrescaler) {
. L) f5 b: p! l) W        SPI2->CR1 &= 0xFFC7; /* Clear BaudRatePrescaler Value (bit 9 8 7) */3 |. U) O% {% @1 f4 K
        SPI2->CR1 |= BaudRatePrescaler;
6 {+ G" p. N9 M: ]% m9 Y6 ?/ w        SPI_Cmd(SPI2,ENABLE);- P: e9 W2 X9 k$ h" \6 S, o
}
7 |/ z  ?. \* |7 x9 d2 q2 y# X5 R8 T  C
/**0 Y4 [/ y) D9 s- o. u1 s7 [
  * @brief  SPI1_Byte_Read_Write& J2 j7 @8 ~+ T  R  ~5 n3 ?# E/ S: q
  * @param  None1 r2 D* G+ H# f/ \6 ]- T0 h9 }
  * @retval None
9 N0 _; ~) G* ]  F  */- N# Q' F3 R% o1 K
uint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte) {& \# y+ a; j# O6 R1 u! k7 k$ ]1 W
        // 发送一字节
  I  f8 B" J6 {        while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
$ S$ B, V, N2 Z5 L# W4 F        SPI2->DR = SPI_Byte;
" m$ m  O( m% t5 t5 o$ b7 K& n        // 接收一字节
; Y! q& p8 l6 S/ @5 d4 ~        while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);( |) w6 W9 M( ~" H
        return(SPI2->DR);
* r1 W, f) W6 A1 {4 @! X}$ Y5 t% D$ [- B, r5 s. J& N- H
" f  c8 Q0 z, J
/*
3 F$ w( g' O7 C) C# X* q5 \ * Function Name  : DMA1_Channel4_IRQHandler# ]! e$ O7 n& s: T4 y) z7 W
* Description    : None
( K8 A* y  A! P. J5 z' t * Input          : None5 j+ V. `* c+ D  y4 I/ z6 ~
* Output         : None
9 I$ o' m( [4 Y5 n8 N/ d * Return         : None
6 O) }' v: B7 F( K9 {% X* x6 I */
" I% s  s" ]/ p8 e# c& Rvoid DMA1_Channel4_IRQHandler(void) {) v( s: V( A7 O7 _
        if (DMA_GetITStatus(DMA1_IT_TC4))  {4 D4 ?' E; Q3 ]% @% p/ M
                SPI_Flash_CS_High();
4 G6 a# }. v5 c" U$ `                DMA_Cmd(DMA1_Channel4, DISABLE);+ R" r  V, h7 R) O& `) _0 b
                DMA_ClearITPendingBit(DMA1_IT_TC4);
6 z. K# A0 J, t                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);9 G/ M5 @9 G4 v5 ^" a$ ~/ _
                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE);( A2 P: P( {: T& Y4 P/ `; b) T( a) f1 R, o
                Flag_DMA_Rxd_Finished = 1;( M& F' m4 I& x! n6 g5 I2 K
        }
6 O* s6 y( G: A! ^}+ x" J! _* o/ Z, b, g

% t" l  O7 \" H/*
0 M/ n* N/ {; f" V0 K  k' J * Function Name  : DMA1_Channel5_IRQHandler2 y6 u) a6 y, x0 V% i8 Q
* Description    : None, A9 j; T6 R: }0 J
* Input          : None& w+ x* P: z4 g: c( K$ s. U. s
* Output         : None
8 ^5 F: d* k7 A" K* L/ H * Return         : None# y) j: p& F, g) D
*/
, ^1 F7 D4 }, A$ h$ `2 Dvoid DMA1_Channel5_IRQHandler(void) {
' L2 a+ Y, a2 K5 Z3 S        if (DMA_GetITStatus(DMA1_IT_TC5)) {4 M4 r9 [1 k- ]' x# q! d! x
                DMA_Cmd(DMA1_Channel5, DISABLE);
( G5 x6 c8 u2 s& ]$ h, w' z                DMA_ClearITPendingBit(DMA1_IT_TC5);
+ I. V( [$ S+ h5 i  y# `        }
5 q8 ^6 [9 T( Q2 F* M}# i9 J& s! w- H- J+ y

5 ?! G( D, L' X. [
: g2 I# m5 M4 e; j7 O, A6 }5 o6 m+ S% M. v) Y  R" B/ A& e9 W  j
1 收藏 4 评论6 发布时间:2015-6-22 22:22

举报

6个回答
Paderboy 回答时间:2015-6-23 06:53:11
多谢分享,支持个
wjandsq 回答时间:2015-6-23 08:51:16
本帖最后由 wjandsq 于 2015-6-23 08:57 编辑 - s) S6 {" |' I6 _" n

1 d5 x$ L  a5 w9 N8 D命令字节发送和接收, 可以使用SPI2_Byte_Read_Write, 也可以使用SPI2_DMA_Read_Write,4 k2 T. H3 I9 H2 ~' b+ T% V
这里使用SPI2读写SPI_Flash, SPI2_DMA_Read_Write 可以按照下面的方法使用:# o3 i  F. a2 L* A
+ [9 X/ t1 k- p
SP2_Tx_Buf_load();            // 数据装入发送缓冲
+ I/ g+ L% T* R* g2 R0 dSPI2_Flash_CS_Low();         // 片选使能
( V" ~. p) D" W: L- k6 pSPI2_DMA_Read_Write(6);   // 启动发送和接收, 在DMA传输完毕中断里片选关闭" |! D% ?3 A, h! K  y( O* V( C. _
while(Flag_DMA_Rxd_Finished==0) {
% c) B) s& ?% L// 使用DMA连续收发时, 可以利用这个空闲做一些事情
5 C0 f. v  m% z$ t// 如果是用SPI2_Byte_Read_Write, 单字节收发就没有多少空闲时间了) J. K% ]$ L. a' K' j
;; F* B% n, R" f4 y9 S" p; g! d  v, l
}; V. [8 h" }6 F) |0 P
Flag_DMA_Rxd_Finished = 0; // DMA收发完毕,标志清0
0 X; e4 I0 }; n1 Y3 E
# u7 ^0 x. Q% q8 B* x1 K
; O( V; M! A: _4 p8 p
5 X) c! P: ~3 X7 Y1 w
2 k& f: Q* b( ?0 Z5 [$ [! A2 t8 `, F9 k) K( W' f/ h. P
stary666 回答时间:2015-6-23 10:02:01
看看,,,,,,,,,,,
☞❤安❤☜ 回答时间:2015-10-23 16:21:32
楼主这个问题解决了吗,我也遇到这个问题求指教
jcx0324 回答时间:2015-12-24 16:49:37
mark下,下次需要研究下
SPDF 回答时间:2024-7-22 12:07:50

研究,研究

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版