《STM32从零开始学习历程》——SPI读取FLASH ID

《STM32从零开始学习历程》@EnzoReventon

SPI读取FLSAH ID

相关链接:
SPI物理层及FLASH芯片介绍
SPI协议层
SPI特性及架构

参考资料:
[野火EmbedFire]《STM32库开发实战指南——基于野火霸天虎开发板》
[正点原子]STM32F4开发指南-库函数版本_V1.2
[ST]《STM32F4xx中文参考手册》
SPI协议及总线协议介绍
W25Q128产品数据手册

1 实现功能

本实验为学习SPI的入门实验,主要功能是实现使用SPI发送读取FLASH ID的指令来读取FLASH ID。

2 硬件设计

本文使用的外设为SPI1(正点原子F4探索者开发板)、FLASH以及USART1。
USART用来调试程序,我们还是使用USART1,因此将PB9,PB10与TX,RX相连接即可。

查阅正点原子F4探索者开发板硬件手册,了解SPI引脚与GPIO的对应情况。
在这里插入图片描述
在这里插入图片描述
由上图可以看出:SPI的SCK,MISO,MOSI分别与芯片的PB3,PB4,PB5连接,片选信号F_CS与PB14相连接,因此在后面程序配置的时候需要注意不能配置错引脚。

3 软件设计流程

① 使能SPIx和IO口时钟
RCC_AHBxPeriphClockCmd() / RCC_APBxPeriphClockCmd();
② 初始化IO口为复用功能
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
③ 设置引脚复用映射:
GPIO_PinAFConfig();
② 初始化SPIx,设置SPIx工作模式
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);
③ 使能SPIx
void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);
④ 编写字节发送函数:uint8_t SPI_FLASH_ByteWrite(uint8_t data)

  • 发送数据(指令):void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);

  • 接收返回的数据:uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) ;

⑤ 查看SPI传输状态
SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE);

⑥ 编写SPI发送函数
控制片选引脚:GPIO_ResetBits()、GPIO_SetBits();
⑦ 主函数调用
⑧ 优化程序(超时函数、宏定义)

4 代码分析

  1. 宏定义
/*宏定义*/

/*SPI GPIO 接口*/
#define FLASH_SPI                          	SPI1
#define FLASH_SPI_CLK                       RCC_APB2Periph_SPI1
#define FLASH_SPI_CLK_INIT					RCC_APB2PeriphClockCmd

#define FLASH_SPI_SCK_PIN                  	GPIO_Pin_3                 
#define FLASH_SPI_SCK_GPIO_PORT            	GPIOB                       
#define FLASH_SPI_SCK_GPIO_CLK             	RCC_AHB1Periph_GPIOB
#define FLASH_SPI_SCK_SOURCE               	GPIO_PinSource3
#define FLASH_SPI_SCK_AF                   	GPIO_AF_SPI1

#define FLASH_SPI_MOSI_PIN                  GPIO_Pin_5                
#define FLASH_SPI_MOSI_GPIO_PORT            GPIOB                       
#define FLASH_SPI_MOSI_GPIO_CLK             RCC_AHB1Periph_GPIOB
#define FLASH_SPI_MOSI_SOURCE               GPIO_PinSource5
#define FLASH_SPI_MOSI_AF                   GPIO_AF_SPI1

#define FLASH_SPI_MISO_PIN                  GPIO_Pin_4                
#define FLASH_SPI_MISO_GPIO_PORT            GPIOB                       
#define FLASH_SPI_MISO_GPIO_CLK             RCC_AHB1Periph_GPIOB
#define FLASH_SPI_MISO_SOURCE               GPIO_PinSource4
#define FLASH_SPI_MISO_AF                   GPIO_AF_SPI1

#define FLASH_SPI_CS_PIN                  	GPIO_Pin_14               
#define FLASH_SPI_CS_GPIO_PORT           	GPIOB                      
#define FLASH_SPI_CS_GPIO_CLK             	RCC_AHB1Periph_GPIOB

/*等待超时时间*/
#define SPIT_FLAG_TIMEOUT         ((uint32_t)0x1000)
  1. 初始化时钟、GPIO、引脚复用
==
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EnzoReventon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值