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

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

[复制链接]
wjandsq 发布时间:2015-6-22 22:22
本帖最后由 wjandsq 于 2015-6-25 14:12 编辑 * k* {& K0 h; O% |; K

7 Y1 a8 a; n0 `7 H# i/*
6 C6 ^" e5 H5 R7 p& c * spi2.c
4 I2 y! ~1 E3 ]' G, }8 O0 A *; O+ h' ?) j  F( K8 ?
*  Created on: 2015年6月22日% M: C5 e) }1 r5 ~
*      Author: WJ
5 [* |& O: a- d9 S */
! n! T5 \6 R4 L3 n% q- t1 e1 d
5 `6 w( v1 f+ t7 v! a& ?
/* Includes ------------------------------------------------------------------*/* n1 Q9 V, U: f
#include "stm32f10x_conf.h"- m6 e: U/ D# X. b; f$ p

- v: Y! r5 Q/ S#define SPI_Flash_CS_Low()  {GPIO_ResetBits(GPIOC, GPIO_Pin_13);}" [' Z3 B. k% V- j+ p3 v/ z4 K1 r( U/ [
#define SPI_Flash_CS_High() {GPIO_SetBits(GPIOC, GPIO_Pin_13);}
* G( ]' O1 ]3 X
- h/ A/ p0 B2 n# Y* G" j. ?uint8_t SPI2_Rx_Buf[4096];& Y' l# W  A" z+ r% J
uint8_t SPI2_Tx_Buf[4096];# a$ U3 h; q7 q0 k- I* S1 ^" J/ J! K+ G
0 _& s+ T  a( H/ B4 o- r, w& `4 y
extern uint16_t Flag_DMA_Rxd_Finished;8 N) X1 R& Z9 C4 K8 \$ Y' {1 l
- ^* X4 a% A  R7 T7 H
extern uint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte);
" Y2 S3 y: X$ k9 z& o2 `
- M0 e& w, a6 t9 \) r/**
0 L- r0 W& [) i2 Y) Z/ o' a  * @brief  Configures the SPI2 Peripheral.( B" j3 p% E5 w! {
  * @param  None- }$ ~, ?* K2 y' C
  * @retval None. S/ v. h7 {$ ]
  */  @# F, e1 o/ u- p7 t8 Z1 O
void SPI2_Config(void){7 C/ Y9 E7 Y$ j; X0 Z4 L7 k
        GPIO_InitTypeDef GPIO_InitStructure;  m! H' b, C9 A' A, k- |" H7 y! c
        SPI_InitTypeDef  SPI_InitStructure;
0 }4 i1 @2 U" A  H3 l- W( w" }        DMA_InitTypeDef  DMA_InitStructure;/ A" f! x8 b0 ^1 g# A4 f+ [! W9 d* k
        NVIC_InitTypeDef NVIC_InitStructure;1 o! {3 ?2 g, g
+ E" p& ^9 ~% r& A, ^
        /* Forces or releases High Speed APB (APB2) peripheral reset --------------*/
/ X1 ]  ?+ U7 S* I, \        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);- {4 \$ C9 {3 t/ v/ p" I
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE);
# M5 X/ n4 u, Y" w) a4 k* Q3 s! l% ^+ d9 L( g; \; h4 K
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);, O, B/ I: A' J2 c6 K
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);; I# D% Z1 Q& q* P) U

- j- m$ f& @% f3 f$ ]        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);8 d  C6 ]( J4 V
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);8 l5 v; l; g! }$ h! S

, l  _7 O* ~; `, r6 Q% m        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);- d  X( [% ?1 q, u6 F
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);
- M0 ?/ W  J8 u4 s$ I" g& m
' |3 c4 V" F" _0 k  l- o# {! ]' }' O        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);6 m6 m/ o1 b. x" y
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);1 r0 y; U5 w8 W
        /* Peripheral Clock Enable -------------------------------------------------*/2 h0 C+ l9 S0 {( _3 \
        /* DMA1 clock enable */
! l2 I6 {6 F# ]! L8 X4 J        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);
$ ^2 m2 t$ n7 V* v- K% }  i( f        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);$ U/ d4 q  v5 r( v  l
        /* Enable GPIO clocks */, Q% O! K5 E) j) W- N
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);4 A' z5 K& B; y7 U1 V, @8 j
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);8 L. e7 L3 [" L" g" n& B* _
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
& m. K3 S* k' a( R/ {% G
+ J8 Z% M) M8 S7 w' E4 P        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
7 K: S. U2 @7 ^7 U, \        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);* f7 Y; u# w1 V
        /* SPI GPIO Configuration --------------------------------------------------*/
/ r8 m- {0 L0 E8 [' N0 k        /*
' V+ y- |# d# p         * PB13 --> SPI1 SCK         Mode: GPIO_Mode_AF_PP
5 g( P0 H4 ~+ t: l' T+ l3 E         * PB15 --> SPI1 MOSI Write  Mode: GPIO_Mode_AF_PP
6 @8 N* c; g1 ]; p         * PB14 --> SPI1 MISO Read   Mode: GPIO_Mode_IPU- }: R5 p9 d( i3 D) i
         * PC13 --> SPI1 CS
6 _$ X( p) @1 ^1 L# l( O         */. C/ w2 x9 `; U/ b% W" d# F
9 A/ ]: ?' @; ]* q7 M0 x
        GPIO_DeInit(GPIOB);
  L+ _0 T- S: ]& g0 x        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;) Z! n8 F, T; X' i
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;& E( e8 G; T% o) b& `( y
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;& C6 ^) d: I& D( ]% n$ v4 Q9 I
        GPIO_Init(GPIOB, &GPIO_InitStructure);3 \' G2 a( L* O9 J8 F0 A5 u
        GPIO_SetBits(GPIOB, GPIO_Pin_15);
) U. g- L' x+ c4 X4 L+ ~" a3 m* C7 A7 U) V- p
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
1 {) Z) Z/ J9 k        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;7 u" a* v$ j  U" g* E1 e, t; P
        GPIO_Init(GPIOB, &GPIO_InitStructure);
( S) |* k. K* |- r        GPIO_SetBits(GPIOB, GPIO_Pin_14);# k; M0 L  ?5 ]7 ]9 k# A
# H. d. Y) z# W; u, c$ e
        GPIO_DeInit(GPIOC);
7 _1 O- f9 t2 Q        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
$ F0 _7 S7 l: h4 ?7 h        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
% _3 Y6 I/ o& l, n& X9 \, c, L        GPIO_Init(GPIOC, &GPIO_InitStructure);  l/ \9 K+ o4 _; w6 ~2 [7 d) v3 B
        GPIO_SetBits(GPIOC, GPIO_Pin_13);8 ?1 p- p* [* K; ~, s
& ]8 `+ {" `2 q4 n3 E
        SPI_Cmd(SPI2, DISABLE);- a/ G9 L4 o! }; i# C7 m& U5 C9 i
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
' V8 ]: l+ B: q7 X' J8 a) E        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  c7 R8 _5 p8 F- K
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
: E' ~( Z3 d/ A! x        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;0 `7 v) X, Y' u" u! t
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
3 M* U- A, a2 s2 w  O8 N$ s        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;7 L$ w3 N5 ~/ C( d
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;- T7 R5 a3 d: P! f* M7 f
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;9 u% {7 D' z, O5 v6 ]7 j# B
        SPI_InitStructure.SPI_CRCPolynomial = 7;4 V$ ^) m3 l, Q# x. @" W
        SPI_Init(SPI2, &SPI_InitStructure);
. V9 S1 ?6 i5 d3 [2 V        if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) != RESET){
, f% [6 Q$ X5 h/ y4 O- E                SPI_I2S_ReceiveData(SPI2);8 L" c: ~  {6 d+ t' [. {& p
                SPI_I2S_ClearFlag(SPI2, SPI_FLAG_CRCERR);  K( N' p2 B+ |5 g7 W9 {1 m* {" {
        }5 [/ Q" `! Y' R+ I% T8 h$ w, z- q

! y8 m3 Q6 q; A( k        /* DMA1 Channel4 Configures for SPIS Receive */% f2 M& G' Q- d
        DMA_DeInit(DMA1_Channel4);, d2 f  @2 g0 x1 X0 b: c1 p' ]! ]% \
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);' D  M  e. G, f5 _$ S8 v( l
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Rx_Buf;5 U" O5 a6 B: o. g5 |  k6 S
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;( G( I( r' `5 A( ^
        DMA_InitStructure.DMA_BufferSize = 0;# f- Z( ~* L( [3 z
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
& n2 d8 Y. k8 A9 N8 G$ e$ J3 }        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;' I, t1 G' B# `3 a3 _3 j9 `
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
1 C5 ^2 ?  w3 `$ ~        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
: }! J! x1 `" O6 W9 R' A1 s0 I( f        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
; g1 K+ t* b- T' g        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;# \( C  y" ^+ i- M3 p
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
) |9 H: J; k3 X) ^# E. E$ i+ C        DMA_Init(DMA1_Channel4, &DMA_InitStructure);
/ S0 i( ?; }6 k+ P, E+ x4 O: }0 r
6 i6 B3 v( ?0 n1 [9 [        if(DMA_GetITStatus(DMA1_IT_TC4)!= RESET){
; J, G# }5 Y1 j1 O                DMA_ClearITPendingBit(DMA1_IT_TC4);
3 V: v5 `7 L3 M5 p        }# L7 e- l2 z6 d, ~: P$ W' j
        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);* K3 O. [4 e/ |( \- j6 E3 F  m
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
: {) E5 h9 C7 W$ Y7 P
( v0 I! M: [. y8 R& ~        /* Enable DMA1 Channel4 SPI2_RX */. j( x, m" C8 a  o* _7 k4 z
        DMA_Cmd(DMA1_Channel4, DISABLE);
7 @8 e8 ~+ S" ]
. a; L6 D: D* T3 G# i* N$ J        /* DMA1 Channel5 Configures for SPI2 Send */
' P% T5 s& k4 X( P1 m9 R: y        DMA_DeInit(DMA1_Channel5);4 H6 E* o1 L( [+ V8 f
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);
1 v/ u  A( |/ K* t7 {8 q1 c$ o        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Tx_Buf;
& D6 Y9 O' y. ~& T! e        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
" d! w- L+ W8 A9 X) z0 U- e1 c1 q        DMA_InitStructure.DMA_BufferSize = 0;
5 E0 b' b) e) k0 m        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;2 ~5 i% \8 y7 {/ P: V
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
: ?% c4 \% P% ^2 {6 n  H  g        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;; b- Q  E! o* S! v" C* F0 [( ]
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;- K4 C+ P0 C2 N8 T; K8 y) a. m
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
( r3 G+ ~% C( J0 X        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;' A; S8 V# {5 F1 K
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
# R0 b- M* F: S0 U4 v5 q        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
' J* J3 W! c- L; b1 v+ [9 K6 y
! T: C) v( ]: B6 O' j$ n        if(DMA_GetITStatus(DMA1_IT_TC5)!= RESET){/ k5 n" D0 {( X  l: f6 T8 c( y
                DMA_ClearITPendingBit(DMA1_IT_TC5);
! f% z. m5 k. n" p7 T        }  D# Z) j6 T) P3 N+ D) ?
        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
& \0 W& ]! C# a- q  q6 U        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);, W8 ~! @; E8 ]0 z& H
5 `( }+ m. {5 O- b. H) n
        /* Enable DMA1 Channel5 SPI1_TX */
5 x0 Z8 s- |% {% ~        DMA_Cmd(DMA1_Channel5, DISABLE);
. p$ Q6 A7 H! d# j# k7 w0 e# F9 L: r" m3 g2 p- U
        /* Enable the DMA1_Channel4、DMA1_Channel5 Interrupt */
8 D- D! e, r$ o9 @        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;! o/ G3 n, M9 r0 _; ^- F: g
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;! H3 C, P$ y4 H" q* i% o, W7 h5 n
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
. W) c; k, Q# a, @" ?        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;% {% ~  E4 a, i8 X5 F
        NVIC_Init(&NVIC_InitStructure);
% R% a5 E" d2 s9 ?3 ~0 K
3 a5 w( ~  ]! n5 ]2 S# _        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
/ s8 f) ?8 w) L  X        NVIC_Init(&NVIC_InitStructure);
2 b4 M5 n- E$ w2 o
  M& s& c4 q8 [( Z7 M1 k0 N$ c3 Z7 Y        /* Enable SPI2  */
/ T9 d1 k: T- u# b        SPI_Cmd(SPI2, ENABLE);
9 ]9 m  `! [3 u5 f4 ]}
) W: ~( i8 w" G# ^3 `$ L8 G* a/**9 I! W$ g+ w% N$ w% d0 x
  * @brief  SPI1_DMA_Start
. l) V$ O4 A' j8 |8 I/ N* I  * @param  len <= 4096
  \  J7 `3 D3 o2 o/ R6 g  * @retval None
, D9 E( ~  X. D  */. K3 a2 e8 j  ?' C9 g# c5 k
- q7 b; Z  E; D, b: j8 n9 |
void SPI2_DMA_Read_Write(uint16_t len) {
  P4 L1 r" j' b5 g7 J2 O* G        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
( L( C- I, N% w        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);; J7 L0 |- G8 u$ e; M" i+ l$ H
        DMA1_Channel4->CMAR  = (uint32_t)SPI2_Rx_Buf;% a( k! }- B' R/ P  b; ?# E2 ?9 h
        DMA1_Channel5->CMAR  = (uint32_t)SPI2_Tx_Buf;4 y* i1 a0 q+ L- J6 |
        DMA1_Channel4->CNDTR = len;
) u: }% ^  y: h  K! f        DMA1_Channel5->CNDTR = len;! w3 \& r. f& _* i  J
        DMA_Cmd(DMA1_Channel4, ENABLE);' A. U- p4 c: n7 o. [/ v" D4 ~
        DMA_Cmd(DMA1_Channel5, ENABLE);
8 s% \* i: R7 _. L" |        SPI_Cmd(SPI2, ENABLE);
- q& G; @% z/ s+ [: Y* r}6 {& A* l- w. v! i' e" H
* B: N. K/ w. ]+ J7 ?( b
/**& K* h3 N. G, ]2 f2 L1 d
  * @brief  SPI2_Set_Speed
: t- W0 x* ~! d. [  * @param  SPI2 CR1 bit 9 8 72 }7 L2 Q  Q' l1 x$ J
  *          SPI_BaudRatePrescaler_2   ---> 000! S. U" Q1 [: q
  *          SPI_BaudRatePrescaler_4   ---> 0018 F4 _+ M0 F7 P) l7 g! d6 ^
  *          SPI_BaudRatePrescaler_8   ---> 010: @) }" V' I+ f; e" T& E1 I5 y
  *          SPI_BaudRatePrescaler_16  ---> 011
5 C* g6 V5 e! Q. j1 Q  *          SPI_BaudRatePrescaler_32  ---> 100- m5 p, `' R9 A. \. x# ?, {2 c& k
  *          SPI_BaudRatePrescaler_64  ---> 101
4 s; j4 `# w5 o% G+ b  *          SPI_BaudRatePrescaler_128 ---> 110
) A1 P4 w/ t. m" }% z  *          SPI_BaudRatePrescaler_256 ---> 111
$ Y) G% F3 a' B" V' h* m5 n6 Q  * @retval None
6 D$ Y, T& R6 `% N7 F  */
: s, Q& E. |% L* n5 F# A) ^  d2 E1 ?0 c
void SPI2_Set_Speed(uint8_t BaudRatePrescaler) {, k5 ^* `6 g1 X
        SPI2->CR1 &= 0xFFC7; /* Clear BaudRatePrescaler Value (bit 9 8 7) */8 p7 H  p. u0 n8 j: ?2 q% U- t$ l
        SPI2->CR1 |= BaudRatePrescaler;. }6 a: |) _' s6 `1 L4 r1 ~
        SPI_Cmd(SPI2,ENABLE);
3 V8 @* l$ |% z( t}* n! O7 ]* q  y- p' H4 [( e

( a0 f: n* E3 o5 D* ], w* Q# S! B/**. L0 R2 s* j0 B
  * @brief  SPI1_Byte_Read_Write% D, Y: g3 o, ^) Q. r2 }# l: |
  * @param  None% ?7 ~5 e% _, n; b6 d
  * @retval None
3 L1 ~0 Z9 M$ F: {+ j: e. j* r  */+ B1 H$ Z8 e, C7 c  W
uint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte) {) T5 ^  o# D( N
        // 发送一字节
# M+ u, g2 d3 T        while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
8 Q6 P7 g+ s1 U+ v        SPI2->DR = SPI_Byte;
8 r* o" ?: S- Z! ?" n+ W        // 接收一字节4 P9 D% e" n, z8 d
        while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
' L8 B9 F0 l- _1 B5 C2 a        return(SPI2->DR);
5 _# `0 M: ~$ V: m/ w3 @}! G' N5 N' f% a; i
3 H$ p. B1 }% l9 s! x; q
/*
7 K: ?  c7 O$ z" s4 k * Function Name  : DMA1_Channel4_IRQHandler. ^) g8 U; D/ p1 v. h7 B5 u3 E) Z
* Description    : None4 m  v" G2 G* L+ I
* Input          : None$ S& ~/ }. k- I! m, T
* Output         : None4 v! N% m8 L9 }4 a; V
* Return         : None
3 A' `7 O5 @. ^& h  T */3 j: ]; y% W" V
void DMA1_Channel4_IRQHandler(void) {
6 y9 D  w4 t8 v: R        if (DMA_GetITStatus(DMA1_IT_TC4))  {! c8 ?' ~& h# @! X& S) ]" S
                SPI_Flash_CS_High();
9 z% Q" f2 ~! M! Z1 N. t                DMA_Cmd(DMA1_Channel4, DISABLE);
( F& k+ j5 c' }8 D                DMA_ClearITPendingBit(DMA1_IT_TC4);! j: X) b" l- |8 @! t) c$ z
                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);9 U0 s" q+ x% m1 h
                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE);2 I7 \1 B) T& M8 n
                Flag_DMA_Rxd_Finished = 1;
: R+ T5 N- Y4 z4 I  c8 ?        }
2 N; Z0 A  ?/ j5 W}
: b! y) ~$ h9 L( W9 G: v6 B0 V
! _9 J  o* S6 v& t& k1 I! k/*
; Q0 ]9 i2 g3 ]4 H# k/ f * Function Name  : DMA1_Channel5_IRQHandler
+ m; F$ D- g4 a$ P! j * Description    : None
) [/ F3 ]. w9 T+ a* [# B% M0 H: i8 l * Input          : None
& R1 H9 r$ P5 m, [% M9 L# L * Output         : None
) c# s% g+ c0 i0 o# ?1 m' p * Return         : None
9 |) _. }- m1 Z+ m7 w* T/ R */' R5 m0 Z) v2 G) E& @! h
void DMA1_Channel5_IRQHandler(void) {
7 q* `/ f' O5 J0 ]6 I        if (DMA_GetITStatus(DMA1_IT_TC5)) {
0 w* R6 c1 i0 g9 c. \. D! ~0 q                DMA_Cmd(DMA1_Channel5, DISABLE);/ R" Z( X+ k2 T  e! @# z* n* N/ t
                DMA_ClearITPendingBit(DMA1_IT_TC5);: J0 y- m; @# Q6 b' J: F
        }$ b- {; T& l1 |% D: s  w
}
1 ~3 Y5 A% R- A# g
' K' x5 ~8 u9 f5 T9 g5 ~' S, N3 M7 F4 E: v* Y  u

( q: A) w2 v7 R7 v: W+ S9 F4 ]
赞 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 编辑
" W# M. T2 e7 |5 B) I9 ]) V+ x% N2 |& P( k6 j0 i
命令字节发送和接收, 可以使用SPI2_Byte_Read_Write, 也可以使用SPI2_DMA_Read_Write,9 `3 [6 T5 r' K4 E! u  K) M8 ^4 U
这里使用SPI2读写SPI_Flash, SPI2_DMA_Read_Write 可以按照下面的方法使用:2 H* S1 B: U* B$ `

$ o" M" @, ~7 N. l6 ESP2_Tx_Buf_load();            // 数据装入发送缓冲
7 Z% f/ U3 Y& }. ^9 }: l6 V- `SPI2_Flash_CS_Low();         // 片选使能  Z& q/ a& x9 A0 B" M0 M- H6 S1 ?
SPI2_DMA_Read_Write(6);   // 启动发送和接收, 在DMA传输完毕中断里片选关闭
# A, @% i6 P4 R0 V; }8 N* g4 Rwhile(Flag_DMA_Rxd_Finished==0) {
/ w/ K2 l2 C; O- D// 使用DMA连续收发时, 可以利用这个空闲做一些事情
+ u! V7 h$ w( K3 F, M3 w' g// 如果是用SPI2_Byte_Read_Write, 单字节收发就没有多少空闲时间了& i- @" Q0 M, X! _( Z0 A1 y8 k
;
8 K9 u4 L7 Y6 z: e/ q% |}% ^0 W1 Q6 E4 [- ^
Flag_DMA_Rxd_Finished = 0; // DMA收发完毕,标志清0, [  J8 u- l7 z' e

( d, X- k/ f# ^/ o
2 L9 _7 o+ w$ a$ z3 `9 B3 a9 F$ ]- b: ?$ g7 E. n  _: `
+ H( s& t  j4 |# W1 N6 b8 e

" D* f8 U& P& h! ?- i
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版