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

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

[复制链接]
wjandsq 发布时间:2015-6-22 22:22
本帖最后由 wjandsq 于 2015-6-25 14:12 编辑
  a! T) y6 W% u" H, O
4 H/ h! y% A3 Z8 I# P; L0 e/*
* j7 Z4 z4 b* g1 w1 X: k$ o" D: [3 g * spi2.c% F5 s8 Y: M2 H+ y3 h
*8 ~/ u# Y4 U0 P' H5 n% I8 C0 O
*  Created on: 2015年6月22日9 p8 k1 P* \3 p2 _' O4 E
*      Author: WJ2 D, y1 Q0 S* a: X, N$ l; Z
*/) b9 z7 [3 A; r3 U/ c7 C

5 h; k1 s9 B; \& R" k
2 B+ |' w0 s4 \0 X, n- u/* Includes ------------------------------------------------------------------*/
: J+ Y' M+ O% m. t$ n5 N2 H#include "stm32f10x_conf.h"& s* K/ Q1 \8 {) w& d

. A0 p. x* ?. [0 y* K  C# o#define SPI_Flash_CS_Low()  {GPIO_ResetBits(GPIOC, GPIO_Pin_13);}
% s( e, `# }3 r: \. u4 @4 Z#define SPI_Flash_CS_High() {GPIO_SetBits(GPIOC, GPIO_Pin_13);}, A: q0 l7 X( ?: f# M2 z( j

8 ^  Q; A  d& X+ j' }& `uint8_t SPI2_Rx_Buf[4096];
4 h- V2 g/ U+ ~6 f3 a4 J9 c; K, Ruint8_t SPI2_Tx_Buf[4096];
- _; V* J1 Y& ]& \4 w0 P  z$ W5 W0 U2 q4 O! J
extern uint16_t Flag_DMA_Rxd_Finished;
& |+ e9 A: L; D' o, W7 y7 T1 h& K/ _! A
extern uint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte);1 @# v& ~9 I1 s8 R9 D

; p' _# F0 m& k; g& R0 g; x% V$ ~) D/**. @. C  r# q3 @7 S
  * @brief  Configures the SPI2 Peripheral.
# `# W2 f9 X4 l) S( N$ ]  * @param  None
6 Z' k: w5 u1 Z/ R) n7 C  * @retval None; q! e) X6 E9 b! r
  */
( ~* u7 J. W4 Ivoid SPI2_Config(void){
6 e) D6 W/ [& Y: P; e+ t0 |        GPIO_InitTypeDef GPIO_InitStructure;4 S& k- L) d8 F6 A3 _; ?
        SPI_InitTypeDef  SPI_InitStructure;! m  |4 I1 s9 f- z3 b) {
        DMA_InitTypeDef  DMA_InitStructure;
' `% w/ s+ T* [! X# Y5 R        NVIC_InitTypeDef NVIC_InitStructure;
0 }9 R4 V5 q2 O
, b, [" R6 F9 y. t5 \% M. e, V  \        /* Forces or releases High Speed APB (APB2) peripheral reset --------------*/
) q9 o9 l( }0 E# {3 }) M        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);7 H' z1 Q1 ^7 C" I
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE);
! x) B6 ]; P7 Z8 e" g; O: N% h" Y: l5 A, J: l, E$ ~: d/ {
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);! O5 h  s5 g0 I  z. [; Z
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);: Z( ]/ B: m3 f' D* ^" W; a

7 `3 h' G; R0 p        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);# N/ V' |: O7 L" j7 t# a
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);; V; h- z& B' P2 X; M

! ]! o: m+ d! M0 B6 z        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);# U& B8 }6 z9 }. ?
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);
  H8 N) A' q+ f9 G- H" \( o4 I6 c( Q+ L
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
  o3 K. F4 H1 J6 u% Q6 Z        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);" e; P0 R9 j, t5 F/ v6 R4 D
        /* Peripheral Clock Enable -------------------------------------------------*/
5 I6 Q' y- L) [& h& B+ v        /* DMA1 clock enable */
* k* H0 X5 z' ~2 c/ L6 N        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);; r3 ~- ~% o, D- G5 d3 c; n6 a& \
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
( ^. |3 O1 X. O/ c. \; ?7 _: Y5 A        /* Enable GPIO clocks */7 u- I' m& G/ b: i, q
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);" ?5 R! k! @( l6 m: N7 \1 i
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/ N2 V/ N6 n( f  Z( r7 {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  b! S( J6 H7 M! a
0 x- l) k2 h% s/ U3 x, z, ^
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
, p# m- o( \$ J1 S& W* b        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
. k3 j8 a+ ~% @; t; ^) M! s        /* SPI GPIO Configuration --------------------------------------------------*/3 T4 ^! V/ k$ [3 k% O/ Y
        /*. v$ w  _' l1 n" n" ]
         * PB13 --> SPI1 SCK         Mode: GPIO_Mode_AF_PP* m, P! ], Q6 `( G2 d- L# j
         * PB15 --> SPI1 MOSI Write  Mode: GPIO_Mode_AF_PP' }( ?. V) q9 o0 `  `3 t4 f
         * PB14 --> SPI1 MISO Read   Mode: GPIO_Mode_IPU
4 ?; o" u, T. I% J0 Y' Q2 Y& N         * PC13 --> SPI1 CS
& N& M  D  l. S6 q+ V         */
* M$ x  M0 A  e1 d% b. Y& n* i/ b/ a1 ^1 C4 U
        GPIO_DeInit(GPIOB);
& e8 q, M$ f. |  h, d4 c        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
: }* B+ Q( Y/ S; ?# Y        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
; G! O/ N( b# M$ c+ O        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;2 @4 i  D. y8 V: o! a, w- C: @
        GPIO_Init(GPIOB, &GPIO_InitStructure);- R: y) W1 C! }  u) Q* |7 |
        GPIO_SetBits(GPIOB, GPIO_Pin_15);! I- }0 J8 ]6 W! e% ^+ a+ x

# q: k2 x$ V, ?        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
7 n  Z. X# L) }! F* M' M* a& ^        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;# E! n  F: o# O1 x  z0 h& b! k
        GPIO_Init(GPIOB, &GPIO_InitStructure);* O0 Z2 b+ g. o
        GPIO_SetBits(GPIOB, GPIO_Pin_14);
1 L5 M2 E& {1 b- a( L9 c" L& [9 u. p5 i# d
        GPIO_DeInit(GPIOC);
# ~) L! m# |" N0 H& F# M, s9 [. e        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
( q6 {" `! T+ o- P        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
0 O5 n% @" w) F8 r3 }9 ~) t2 ~        GPIO_Init(GPIOC, &GPIO_InitStructure);
" b4 u. L7 X9 C3 j# k, v        GPIO_SetBits(GPIOC, GPIO_Pin_13);
! ^$ [8 r  K. P9 S
) w7 ?" s" T5 H9 C        SPI_Cmd(SPI2, DISABLE);
( B: G2 a- F: S& \! @        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
" v+ E$ R0 k! `& V' M: j' P        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;. T0 X3 t( h$ R( S' i
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
' ?7 G/ [% n- J        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;3 r5 }7 v5 e/ E' V: ?4 |# Y
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;) A% j( y8 t; E  W2 a- D& s& p1 @
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;% O3 ~6 m+ V: z
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
3 v2 e( R- u6 `& x" U        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
+ M! f; I( ^! o        SPI_InitStructure.SPI_CRCPolynomial = 7;
) }% a) `$ j+ J% ^1 T4 r        SPI_Init(SPI2, &SPI_InitStructure);
2 J' u  Y! r. V2 d' G1 c        if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) != RESET){3 q6 C: ?  {7 Y5 x. n
                SPI_I2S_ReceiveData(SPI2);& t, H* A, h8 V$ J/ \* `" y
                SPI_I2S_ClearFlag(SPI2, SPI_FLAG_CRCERR);
' n9 g* p# ?4 _( s$ M        }+ H, M, x+ a( k' D/ v' ~' Z

9 O3 O8 z; k  h  O) [4 O        /* DMA1 Channel4 Configures for SPIS Receive */
- D1 _$ f; i& @& y        DMA_DeInit(DMA1_Channel4);: _8 i+ Z0 {$ e6 L- q& e2 w
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);3 Q' q+ d% {4 Z8 [
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Rx_Buf;
* c6 w% U- b5 {; K4 n$ w        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;) W+ O& B3 w# V; o
        DMA_InitStructure.DMA_BufferSize = 0;2 b9 I3 c% E5 d! X% O: A8 [
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
1 X: k, }$ a2 Q        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- N& \5 E( s/ L; |3 [" k* }        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;1 O: N  p9 m5 U$ S
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
" i8 _( f' Y9 H; R7 ?        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;5 x4 r# t0 x) @' K4 |# _5 v
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;4 g7 a  @, U9 S+ t! f- D0 r& T
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;! F6 r! {* }+ w- ?$ ]
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);
, Z9 A: W7 x2 `, E# z4 G/ ~5 I. Z, u' N2 |/ s" ^  A. ]
        if(DMA_GetITStatus(DMA1_IT_TC4)!= RESET){/ r2 e' f8 q- M& H( r
                DMA_ClearITPendingBit(DMA1_IT_TC4);% _9 O/ L* {4 X- R, X
        }
! D2 X# j0 d( t* B, A        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);* \6 _' x" O, Q6 O
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);. G& z5 r0 i+ w. R$ Y* D) _4 X# ?
2 o. B9 I! o% e& z: O2 o" h
        /* Enable DMA1 Channel4 SPI2_RX */
1 c- f; ^! R" A        DMA_Cmd(DMA1_Channel4, DISABLE);! M/ {$ V- d& [7 H" m& {9 q. h1 D
4 b$ A9 Q# s, y3 r* l/ `/ ~
        /* DMA1 Channel5 Configures for SPI2 Send */
& q2 N, ^( E* d9 c. q        DMA_DeInit(DMA1_Channel5);
1 G# L' j6 s' Q& ^0 i+ z' y+ b        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);0 h" u2 P6 n, `
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Tx_Buf;
! ~$ [1 P4 x0 n7 R        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
8 N: I- ]  j& F5 E        DMA_InitStructure.DMA_BufferSize = 0;/ ~) ~$ `- m: P1 q5 N  z. K* M
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;* x1 k3 O, O0 T. x0 ]3 W
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;. s. }  P6 R( s. I# r9 d
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;1 P4 Z9 Y. N! q$ b
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- B/ K! K2 m. i: {        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;' I0 V) w$ N% W  G
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
( L! h$ ~1 K4 f3 [" A9 j        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
' ]1 B! A( |6 }% G: L9 z        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
1 |- c+ X6 k3 z! h3 [' Z3 i; M, ?" K9 N/ H* @% G
        if(DMA_GetITStatus(DMA1_IT_TC5)!= RESET){
& [; U. e# b* t" y! M; {                DMA_ClearITPendingBit(DMA1_IT_TC5);: {! F  t; T3 i* ], u' V; y
        }
! i  D# \. V3 N7 t, s        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);4 j) N5 Y- C/ z/ n" f3 R
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
  g- @2 m9 u- r3 P( `
# X* s1 E9 B. q        /* Enable DMA1 Channel5 SPI1_TX */+ t, `1 X, G4 p8 Z
        DMA_Cmd(DMA1_Channel5, DISABLE);
3 {! r" M5 }/ @8 e- h7 K# E8 E$ w& [9 ]$ v* g9 i& D* Y' |2 m
        /* Enable the DMA1_Channel4、DMA1_Channel5 Interrupt */- i' j$ p4 }! T2 w; l) u
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;6 x! U) c+ V3 k1 q! r
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
2 j6 I- n" r& s  K        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
* k" y: C: e5 d7 a7 _2 U        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
2 P& U3 I/ x. E4 c        NVIC_Init(&NVIC_InitStructure);+ `5 b! z) J. U4 L: M

4 K, J  [! Q8 {- }6 Y/ w/ N: @        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
5 c8 w/ P" l2 U* G$ \        NVIC_Init(&NVIC_InitStructure);
$ L; j8 I+ Z7 O  T: g; H. p9 M$ G+ o, r+ b1 A6 I
        /* Enable SPI2  */0 S- z! V% B' I1 H
        SPI_Cmd(SPI2, ENABLE);
0 `5 d0 _0 o+ @, @3 D4 \}
2 P  D) U3 X4 G+ U8 d1 ?# U7 P/**
# P" t9 P6 b& s9 F3 Z* q- y7 _  D  * @brief  SPI1_DMA_Start
/ e6 p) c5 o% j) U) s  * @param  len <= 4096
, ]! Y- @6 h3 j$ [! g  * @retval None
* f1 {& H& V! I) N  */5 \% k8 \7 F" o' w5 o' X! u
) |6 @2 F- r2 w6 E& ^% T3 i/ F
void SPI2_DMA_Read_Write(uint16_t len) {5 P: B4 Z7 b) x" f
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
& F3 w$ K: V4 G+ E        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);+ w* \3 R$ I6 J  p8 u$ z0 \% l# J
        DMA1_Channel4->CMAR  = (uint32_t)SPI2_Rx_Buf;5 k8 z( y6 V# p- |) g0 G9 {
        DMA1_Channel5->CMAR  = (uint32_t)SPI2_Tx_Buf;
/ g' }3 Z; y4 @) E0 q9 @        DMA1_Channel4->CNDTR = len;
- `: \  m3 u  J, P+ T  J; E        DMA1_Channel5->CNDTR = len;3 A- t2 m; ^7 a
        DMA_Cmd(DMA1_Channel4, ENABLE);
$ q4 x' t3 V+ r  W; p6 C6 b        DMA_Cmd(DMA1_Channel5, ENABLE);
9 s0 Y& B$ z( {0 j% ]        SPI_Cmd(SPI2, ENABLE);8 `1 l" U' g/ k+ t9 G8 T3 A
}
4 v. _4 e' [0 N; O* u: _0 l( l: a8 Z8 ]& B7 l# I5 c
/**  d# ^, o1 N: z" O. r* ^
  * @brief  SPI2_Set_Speed
0 z  s9 ]' M( ^1 }# k* p% A  * @param  SPI2 CR1 bit 9 8 7
- O/ H1 X; L6 D8 f7 \. V" o! X$ w  *          SPI_BaudRatePrescaler_2   ---> 000/ p( C3 M7 t, A8 E8 E2 k
  *          SPI_BaudRatePrescaler_4   ---> 0018 z0 n( v' {' V' x7 }* f& k
  *          SPI_BaudRatePrescaler_8   ---> 010
. X. `+ W( i5 }4 ~  *          SPI_BaudRatePrescaler_16  ---> 0118 ?! H% M+ a- x- t, P
  *          SPI_BaudRatePrescaler_32  ---> 100
0 A  `3 R) m6 x* y  *          SPI_BaudRatePrescaler_64  ---> 101
( I/ j3 F4 O. R6 B3 ?, w8 l  *          SPI_BaudRatePrescaler_128 ---> 110# ]0 S2 Z2 n  x& X' ?, g" Q# V1 L
  *          SPI_BaudRatePrescaler_256 ---> 111
4 n. E( |" k2 U0 F9 n  * @retval None
! I7 t3 w* w3 y9 {" F  */* s% t" W6 q' G+ u
5 E6 c( x8 Z* N( W! O
void SPI2_Set_Speed(uint8_t BaudRatePrescaler) {( c* j6 f1 X4 U! p: y. Z) ?
        SPI2->CR1 &= 0xFFC7; /* Clear BaudRatePrescaler Value (bit 9 8 7) */
* G1 U" @0 `/ D8 j. q" ^        SPI2->CR1 |= BaudRatePrescaler;
& }1 i3 x2 a) z$ o3 s  y- `        SPI_Cmd(SPI2,ENABLE);
& g) Y: P4 E8 Y) p  a1 L( Y7 l}
8 d% _* z4 ]: V: x3 p, |3 ?
( e7 S7 `6 s4 c# z1 e* |$ s# A9 C/**2 Z  F1 T" {2 _
  * @brief  SPI1_Byte_Read_Write3 X. v0 r3 |( D4 b/ s& t
  * @param  None
+ O$ u4 }6 x, [% T  * @retval None
4 z% ^% ]2 q5 R4 _$ I7 \  */
+ K; |) w+ F) Q! {# d1 H' S9 o. Muint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte) {
& g+ m, l/ s) F8 U7 M: `/ u        // 发送一字节% a5 a+ Q: p+ T( V2 M1 {
        while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
/ }; D. V+ N2 X0 e# |% _  k( x* ^        SPI2->DR = SPI_Byte;! h3 E% p. L  s
        // 接收一字节2 p& y, q# d4 H, m- N, v' q
        while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);( z" \% R% }4 N0 o
        return(SPI2->DR);$ X4 i& G& i' s7 o  G9 K
}
: S" X" f- X" I; A+ ^  B5 {8 T0 X
/*: j6 b  t0 |. h# i' u, }
* Function Name  : DMA1_Channel4_IRQHandler$ Y& s$ z* l+ w
* Description    : None
! k' J6 l/ X; v( [8 V * Input          : None
, i" H) p9 I2 c8 m, p- m5 o * Output         : None
7 D4 j) z5 L  d* k- y * Return         : None' c7 v2 N( E; ?8 p5 w/ f; _2 ^
*/
- Q. g& c' e7 `) Q- _: T1 ~void DMA1_Channel4_IRQHandler(void) {
2 E/ O! K; m  l: h        if (DMA_GetITStatus(DMA1_IT_TC4))  {
$ y& x5 {$ O  \5 D                SPI_Flash_CS_High();
* `* P$ W" \& S- |                DMA_Cmd(DMA1_Channel4, DISABLE);
( M3 |* S& Y& E/ w9 P4 }" {" W% n                DMA_ClearITPendingBit(DMA1_IT_TC4);2 [. {- I0 V: _' a5 a
                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);4 j% v7 r" j( W6 q9 H
                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE);  D0 N' i1 x, a! D
                Flag_DMA_Rxd_Finished = 1;
' e" d# a( ^, C; c        }, _7 D% q8 x7 E2 G9 J2 T5 N  s
}
1 {" _" X4 s+ I
' y3 ]2 Q8 ]7 M, q% F/ m) i$ D1 k/*' f, i+ m6 |5 H8 K
* Function Name  : DMA1_Channel5_IRQHandler" ?1 Z6 d/ O% k5 j  t4 y+ m/ s* t
* Description    : None- m* x; f( X. `0 S
* Input          : None& e! m' s  t( W. I* }
* Output         : None2 i% I( V, A' A) x
* Return         : None. j1 e) ?4 Q! M
*/
- |% ]* C# a) gvoid DMA1_Channel5_IRQHandler(void) {5 B- C7 a! b6 n( q2 ?7 }6 B% ^8 {) x
        if (DMA_GetITStatus(DMA1_IT_TC5)) {; v, P! z+ P2 e  S0 g
                DMA_Cmd(DMA1_Channel5, DISABLE);
& u4 B1 T, B# a! v$ Y                DMA_ClearITPendingBit(DMA1_IT_TC5);- z( R9 T2 U0 S$ R6 b- X
        }
5 ~" \2 s! C! [& f}: x) y% D+ p: p: h0 x( q

* f! @0 L/ F* a
' E5 h/ ^9 j/ Y$ T1 P' r# \% W/ c$ d2 S! p1 j2 _0 o) {
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 编辑
7 P3 g2 K0 u  K% y0 M! n  G+ k2 v4 _2 Q4 T6 X; |5 @/ j/ ^: C
命令字节发送和接收, 可以使用SPI2_Byte_Read_Write, 也可以使用SPI2_DMA_Read_Write,8 G* X3 S2 K7 C2 r5 r5 P9 N
这里使用SPI2读写SPI_Flash, SPI2_DMA_Read_Write 可以按照下面的方法使用:
2 ~3 ^/ |/ ~) g0 ]
' ^  L4 L) x$ d+ SSP2_Tx_Buf_load();            // 数据装入发送缓冲
/ |$ h1 I& A+ P" g. ]0 |& gSPI2_Flash_CS_Low();         // 片选使能1 J4 S9 t' }; z
SPI2_DMA_Read_Write(6);   // 启动发送和接收, 在DMA传输完毕中断里片选关闭
) o- o- R$ d0 h  ]& F( W/ t/ ]while(Flag_DMA_Rxd_Finished==0) {2 b* C0 u& K7 k9 s& t, l0 m! z
// 使用DMA连续收发时, 可以利用这个空闲做一些事情8 H" G- t4 g( n- F" z
// 如果是用SPI2_Byte_Read_Write, 单字节收发就没有多少空闲时间了
3 a. r0 o0 z! s  j/ z9 w;& m& p+ u7 k+ G- w- Y- h2 ~
}
' m/ `' q' l0 VFlag_DMA_Rxd_Finished = 0; // DMA收发完毕,标志清0$ m9 T1 }3 N3 g  A, N
* z' f/ D# ?- G1 c. Y$ Q, ?+ b! \

2 Z2 F" y' G9 g& i
1 t/ I0 M  Y6 `3 K" R* i1 }& n* g7 D$ [& D1 J
6 e0 |7 s; z" x6 N' x6 B
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 手机版