问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32硬件实现与W25Q64通信

创作时间:
作者:
@小白创作中心

STM32硬件实现与W25Q64通信

引用
CSDN
1.
https://blog.csdn.net/bachelores/article/details/145403327

本文将介绍如何使用STM32F103C8T6微控制器与W25Q64 SPI Flash进行通信。通过STM32CubeMX配置硬件引脚和SPI参数,并提供具体的代码实现,帮助读者完成基本的读ID操作。

使用的型号为STM32F103C8T6与W25Q64。

STM32CubeMX配置与引脚衔接

根据STM32F103C8T6引脚手册,采用B12-B15四个引脚与W25Q64连接,实现SPI通信。

W25Q64
STM32F103C8T6
SCK(CLK)
PB13
MOSI(DI)
PB15
MISO(DO)
PB14
CS
PB12

STM32CubeMX配置

这里对于时钟相关的配置就不做赘述了,由于是练习所以将系统时钟配置成了72MHz,主要是配置引脚。

在引脚配置将PB12配置为推挽输出,默认电平为高。PB13,PB14,PB15均使用硬件的SPI。可以在系统核心的GPIO中的SPI中看到这三个配置。

然后到SPI2中将参数配置,采用高位优先,波特率为18MB/s,若不是则需要调整Prescaler分频到18MB/s,传输以字节为单位。这里先不开启中断,所以NVIC setting里面的中断没有选上,做好基础配置后就可以生成代码,点击GENERATE CODE。在Src中就会出现spi.c文件

查看PB13和PB15应该是默认配置为复用推挽,PB14为浮空输入。

spi2的stm32cubemx生成的默认配置如下。

配置完成后代码实现与W25Q64通信

接下来就是实现与W25Q64的通信,先测试能不能获取到W25Q64的厂商ID和设备ID。

对SPI的收发函数进行了封装,通过

HAL_SPI_TransmitReceive()

函数,将

byte

发送给w25q64,并将收到的数据放入

rByte

。该函数第一个参数为句柄的指针,由于才用spi2,句柄为

hspi2

,第二个参数为要发送的字节,第三个为接受的字节,第四个为大小(以字节为单位),第五个为超时时长,以ms为单位。

uint8_t SPI_SwapByte(uint8_t byte)
{
 uint8_t rByte = 0;
 HAL_SPI_TransmitReceive(&hspi2, &byte, &rByte, 1, 1000);
 return rByte;
}
void W25Q64_ReadID(uint8_t *mid, uint16_t *did)
{
 // 读取ID
 // 开启片选信号
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
 // 发送读取ID命令
 SPI_SwapByte(0x9f);
 // 读取制造商id
 *mid = SPI_SwapByte(0xff);
 // 读取设备id
 *did = 0;
 *did |= SPI_SwapByte(0xff) << 8; // 高8位
 *did |= SPI_SwapByte(0xff) & 0xff; // 低8位
 // 关闭片选信号
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
 // 发送调试信息到串口
 char debugMsg[50];
 int msgLength = snprintf(debugMsg, sizeof(debugMsg), "Manufacturer ID: 0x%02X, Device ID: 0x%04X\r\n", *mid, *did);
 HAL_UART_Transmit(&huart1, (uint8_t *)debugMsg, msgLength, HAL_MAX_DELAY);
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号