STM32SPI通信技术调制

本文详细介绍了在STM32F4上配置SPI通信的过程,包括SPI的中断发送和接收。作者通过手抄官方代码并逐步调试,经过一周的努力,成功理解了SPI中断的工作原理。文章主要涉及SPI的GPIO配置、中断设置以及关键函数的实现,适合想要深入理解STM32 SPI通信的读者参考。
摘要由CSDN通过智能技术生成


研究STM32F4的SPI有一阵子了,进步很缓慢,前几天终于鼓起勇气,用手抄了一遍官方的代码,然后自己一个字字的敲进去,然后再调试。历时大约一个星期,终于把SPI的中断发送和中断接收给整清楚了。在没有正确运行出结果之前,一切都是辣么痛苦。此文鼓励我继续往前进步。

先说主机端,首先当然是写SPI驱动文件,也就是SPI的配置,具体文件如下:

SPI.c

  1. #include <stm32f4xx.h>  
  2. #include "usart.h"  
  3. #include "spi.h"  
  4.    
  5.   
  6.   u8 Master_Temp =0;  
  7.   extern SPI_InitTypeDef  SPI_InitStructure;  
  8.   
  9.  u8 Slave_Temp=0;  
  10.  static __IO uint32_t TimingDelay;  
  11.   
  12.  void SPI_Config(void)  
  13. {  
  14.   GPIO_InitTypeDef GPIO_InitStructure;  
  15.   NVIC_InitTypeDef NVIC_InitStructure;  
  16.       
  17.   /* Peripheral Clock Enable -------------------------------------------------*/  
  18.   /* Enable the SPI clock */  
  19.   SPIx_CLK_INIT(SPIx_CLK, ENABLE);  
  20.     
  21.   /* Enable GPIO clocks */  
  22.   RCC_AHB1PeriphClockCmd(SPIx_SCK_GPIO_CLK | SPIx_MISO_GPIO_CLK | SPIx_MOSI_GPIO_CLK, ENABLE);  
  23.   
  24.   /* SPI GPIO Configuration --------------------------------------------------*/  
  25.   /* Connect SPI pins to AF5 */    
  26.   GPIO_PinAFConfig(SPIx_SCK_GPIO_PORT, SPIx_SCK_SOURCE, SPIx_SCK_AF);  
  27.   GPIO_PinAFConfig(SPIx_MOSI_GPIO_PORT, SPIx_MOSI_SOURCE, SPIx_MOSI_AF);  
  28.   GPIO_PinAFConfig(SPIx_MISO_GPIO_PORT, SPIx_MISO_SOURCE, SPIx_MISO_AF);  
  29.   
  30.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
  31.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
  32.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
  33.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;  
  34.   
  35.   /* SPI SCK pin configuration */  
  36.   GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN;  
  37.   GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStructure);  
  38.   
  39.   /* SPI  MOSI pin configuration */  
  40.   GPIO_InitStructure.GPIO_Pin =  SPIx_MOSI_PIN;  
  41.   GPIO_Init(SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure);  
  42.       
  43.   /* SPI  MISO pin configuration  */  
  44.   GPIO_InitStructure.GPIO_Pin =  SPIx_MISO_PIN;  
  45.   GPIO_Init(SPIx_MISO_GPIO_PORT,&GPIO_InitStructure);  
  46.    
  47.   /* SPI configuration -------------------------------------------------------*/  
  48.   SPI_I2S_DeInit(SPIx);  
  49.   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  
  50.   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  
  51.   SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;  
  52.   SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;  
  53.   SPI_InitStructure.SPI_NSS  = SPI_NSS_Soft;  
  54.   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;  
  55.   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  
  56.   
  57.   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  
  58.   SPI_InitStructure.SPI_CRCPolynomial = 7;  
  59.     
  60.  /* Configure the Priority Group to 1 bit */                  
  61.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
  62.     
  63.   /* Configure the SPI interrupt priority */  
  64.   NVIC_InitStructure.NVIC_IRQChannel = SPIx_IRQn;  
  65.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
  66.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  67.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  68.   NVIC_Init(&NVIC_InitStructure);  
  69.   
  70. }  
#include <stm32f4xx.h>
#include "usart.h"
#include "spi.h"
 

  u8 Master_Temp =0;
  extern SPI_InitTypeDef  SPI_InitStructure;

 u8 Slave_Temp=0;
 static __IO uint32_t TimingDelay;

 void SPI_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
	
  /* Peripheral Clock Enable -------------------------------------------------*/
  /* Enable the SPI clock */
  SPIx_CLK_INIT(SPIx_CLK, ENABLE);
  
  /* Enable GPIO clocks */
  RCC_AHB1PeriphClockCmd(SPIx_SCK_GPIO_CLK | SPIx_MISO_GPIO_CLK | SPIx_MOSI_GPIO_CLK, ENABLE);

  /* SPI GPIO Configuration --------------------------------------------------*/
  /* Connect SPI pins to AF5 */  
  GPIO_PinAFConfig(SPIx_SCK_GPIO_PORT, SPIx_SCK_SOURCE, SPIx_SCK_AF);
  GPIO_PinAFConfig(SPIx_MOSI_GPIO_PORT, SPIx_MOSI_SOURCE, SPIx_MOSI_AF);
  GPIO_PinAFConfig(SPIx_MISO_GPIO_PORT, SPIx_MISO_SOURCE, SPIx_MISO_AF);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

  /* SPI SCK pin configuration */
  GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN;
  GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStructure);

  /* SPI  MOSI pin configuration */
  GPIO_InitStructure.GPIO_Pin =  SPIx_MOSI_PIN;
  GPIO_Init(SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure);
	
  /* SPI  MISO pin configuration  */
  GPIO_InitStructure.GPIO_Pin =  SPIx_MISO_PIN;
  GPIO_Init(SPIx_MISO_GPIO_PORT,&GPIO_InitStructure);
 
  /* SPI configuration -------------------------------------------------------*/
  SPI_I2S_DeInit(SPIx);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS  = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  
 /* Configure the Priority Group to 1 bit */                
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* Configure the SPI interrupt priority */
  NVIC_InitStructure.NVIC_IRQChannel = SPIx_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

}

  1. <span style="white-space: pre;">    </span>SPI.H  
<span style="white-space: pre;">	</span>SPI.H
  1. /** 
  2.   ****************************************************************************** 
  3.   * @file    SPI/SPI_TwoBoards/DataExchangeInterrupt/main.h 
  4.   * @author  MCD Application Team 
  5.   * @version V1.0.0 
  6.   * @date    30-September-2011 
  7.   * @brief   Main program body 
  8.   ****************************************************************************** 
  9.   * @attention 
  10.   * 
  11.   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 
  12.   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 
  13.   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 
  14.   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 
  15.   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 
  16.   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 
  17.   * 
  18.   * <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2> 
  19.   ******************************************************************************   
  20.   */  
  21.   
  22. /* Define to prevent recursive inclusion -------------------------------------*/  
  23. #ifndef __SPI_H_  
  24. #define __SPI_H_  
  25.   
  26. #ifdef __cplusplus  
  27.  extern "C" {  
  28. #endif   
  29.   
  30. /* Includes ------------------------------------------------------------------*/  
  31. #include "stm32f4xx.h"  
  32. #include "stm324xg_eval.h"  
  33. #include "stm324xg_eval_ioe.h"  
  34.   
  35.   
  36. /* Exported typedef -----------------------------------------------------------*/  
  37. #define countof(a)   (sizeof(a) / sizeof(*(a)))  
  38. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;  
  39.   
  40. /* Exported define ------------------------------------------------------------*/  
  41. /* Uncomment the line below if you will use the SPI peripheral as a Master */  
  42.  #define SPI_MASTER  
  43. /* Uncomment the line below if you will use the SPI peripheral as a Slave */  
  44. //#define SPI_SLAVE    
  45.   
  46. /* USER_TIMEOUT value for waiting loops. This timeout is just guarantee that the 
  47.    application will not remain stuck if the USART communication is corrupted.  
  48.    You may modify this timeout value depending on CPU frequency and application 
  49.    conditions (interrupts routines, number of data to transfer, baudrate, CPU 
  50.    frequency...). */   
  51. #define USER_TIMEOUT                    ((uint32_t)0x64) /* Waiting 1s */  
  52.   
  53. /* SPIx Communication boards Interface */  
  54. #define SPIx                           SPI2  
  55. #define SPIx_CLK                       RCC_APB1Periph_SPI2  
  56. #define SPIx_CLK_INIT                  RCC_APB1PeriphClockCmd  
  57. #define SPIx_IRQn                      SPI2_IRQn  
  58. #define SPIx_IRQHANDLER                SPI2_IRQHandler  
  59.   
  60. #define SPIx_SCK_PIN                   GPIO_Pin_1  
  61. #define SPIx_SCK_GPIO_PORT             GPIOI  
  62. #define SPIx_SCK_GPIO_CLK              RCC_AHB1Periph_GPIOI  
  63. #define SPIx_SCK_SOURCE                GPIO_PinSource1  
  64. #define SPIx_SCK_AF                    GPIO_AF_SPI2  
  65.   
  66. #define SPIx_MISO_PIN                  GPIO_Pin_2  
  67. #define SPIx_MISO_GPIO_PORT            GPIOI  
  68. #define SPIx_MISO_GPIO_CLK             RCC_AHB1Periph_GPIOI  
  69. #define SPIx_MISO_SOURCE               GPIO_PinSource2  
  70. #define SPIx_MISO_AF                   GPIO_AF_SPI2  
  71.   
  72. #define SPIx_MOSI_PIN                  GPIO_Pin_3  
  73. #define SPIx_MOSI_GPIO_PORT            GPIOI  
  74. #define SPIx_MOSI_GPIO_CLK             RCC_AHB1Periph_GPIOI  
  75. #define SPIx_MOSI_SOURCE               GPIO_PinSource3  
  76. #define SPIx_MOSI_AF                   GPIO_AF_SPI2  
  77.   
  78. #define TXBUFFERSIZE   (countof(TxBuffer) - 1)  
  79. #define RXBUFFERSIZE   TXBUFFERSIZE  
  80.   
  81.   
  82. /* Define numbers of bytes to transmit from TxBuffer */  
  83. #define CMD_RIGHT_SIZE                   0x01  
  84. #define CMD_LEFT_SIZE                    0x05  
  85. #define CMD_UP_SIZE                      0x14  
  86. #define CMD_DOWN_SIZE                    0x1E  
  87. #define CMD_SEL_SIZE                     TXBUFFERSIZE  
  88.   
  89.   
  90.   
  91. /* Exported types ------------------------------------------------------------*/  
  92. /* Exported constants --------------------------------------------------------*/  
  93. /* Exported macro ------------------------------------------------------------*/  
  94. /* Exported functions ------------------------------------------------------- */  
  95. #ifdef SPI_MASTER  
  96.  uint8_t GetVar_NbrOfData(void);  
  97. #endif  
  98.   
  99. #ifdef __cplusplus  
  100. }  
  101. #endif  
  102.   
  103. void SPI_Config( void);  
  104. void SysTickConfig(void);  
  105. void Fill_Buffer(__IO uint8_t *pBuffer, uint16_t BufferLength);  
  106.   
  107. #endif /* __MAIN_H */  
  108.   
  109. /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/  
/**
  ******************************************************************************
  * @file    SPI/SPI_TwoBoards/DataExchangeInterrupt/main.h
  * @author  MCD Application Team
  * @version V1.0.0
  * @date    30-September-2011
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************  
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SPI_H_
#define __SPI_H_

#ifdef __cplusplus
 extern "C" {
#endif 

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值