基于STM32F407实现w25q128 的SPI通讯

基于STM32F407实现w25q128 的SPI通讯

前言

W25Q128是比较常见的flash 芯片,由于之前的板子重新设计更换管脚后一直没有正常工作,所以重新进行了编码和调试,用于寻找原因(代码已实现flash读写,之前由于管脚配置模式不对导致不能读写)。

W25Q128 说明

这是W25Q128的手册介绍:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是W25Q128的管脚定义,比较重要的是SPI通讯中需要使用的MISO,MOSI,NSS,CLK,分别对应芯片管脚中的DO,DI,CS,CLK;本文不使用RESET脚,置高保持HOLD状态;WP使用时需要置高;
原理图如下:
在这里插入图片描述
STM32F407上使用spi2总线:管脚对应如下:

SPI2PIN
MISOPC2
MOSIPC3
NSSPB9
CLKPB10
WPPE4

代码设计

本文基于rt-thread的框架,采用Easyflash控制存储功能;
rt-thread spi API参考官方文档:
链接: rt-thread spi 设备.
链接: Easyflash 教程.

参考代码如下:

#include "drv_flash.h"
#include <easyflash.h>
#include "drv_spi.h"
// IO 初始化
void spi2_io_init(void)
{
/* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_SPI2_CLK_ENABLE(); 
    __HAL_RCC_GPIOB_CLK_ENABLE();
	__HAL_RCC_GPIOC_CLK_ENABLE();
    /**SPI2 GPIO Configuration    
    PB10    ------> SPI2_SCK
    PC2     ------> SPI2_MISO
    PC3     ------> SPI2_MOSI 
    */
    GPIO_InitStruct.Pin = SPI2_SCK_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
    HAL_GPIO_Init(SPI2_SCK_GPIO_Port, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = SPI2_MOSI_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
    HAL_GPIO_Init(SPI2_MOSI_GPIO_Port, &GPIO_InitStruct);
	
  	GPIO_InitStruct.Pin = SPI2_MISO_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(SPI2_MISO_GPIO_Port, &GPIO_InitStruct);	

	GPIO_InitStruct.Pin = GPIO_PIN_4;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
	HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); 
}
// STM32F407 与 W25Q128 建立通讯
rt_spi_flash_device_t w25q128;
int rt_hw_spi_flash_init(void)
{
	//__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOA_CLK_ENABLE();
	//rt_hw_spi_device_attach("spi1", "flash", GPIOA, GPIO_PIN_4);
	rt_hw_spi_device_attach("spi1", "flash", GPIOA, GPIO_PIN_4);
	w25q128 = rt_sfud_flash_probe("W25Q128", "flash");
	if (RT_NULL == w25q128)
	{
		return -RT_ERROR;
	}
	return RT_EOK;
}
// 读写测试
uint8 flash_test()
{
	uint8 ip[4] = {192,168,1,1};
	uint8 len = 0;	
	ef_set_env_blob("ip", ip, sizeof(ip));
	rt_memset(ip,0,sizeof(ip));
	len = ef_get_env_blob("ip", ip, sizeof(ip) , NULL);
	return len;
}
//主函数
int main()
{
    rt_hw_spi_flash_init();
    easyflash_init();
    flash_test();
    while(1)
    {
    }
}

每ri

个人理解:~~

W25Q128 SPI2 STM32F407xx rt_thread 你好!spi, 给建个通讯? 片选了吗,四线吗? 准备好了! 老大,有连接! 起来干活! easyflash来管这个事 !! W25Q128 SPI2 STM32F407xx rt_thread
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用STM32F407SPI2来驱动W25Q64闪存。首先,确保你已经正确连接了W25Q64和STM32F407SPI2引脚。然后,按照以下步骤进行驱动配置: 1. 初始化SPI2: 使用CubeMX或手动配置SPI2,并设置合适的时钟、模式、数据大小等参数。 2. 配置GPIO引脚:将SPI2的NSS、SCK、MISO和MOSI引脚连接到W25Q64上的对应引脚。 3. 编写读写函数:根据W25Q64的数据手册,编写读取和写入函数。这些函数将使用SPI2进行通信,并发送相应的指令和地址来读取或写入数据。 以下是一个简单的示例代码,用于向W25Q64写入一个字节数据: ```c #include "stm32f4xx_hal.h" SPI_HandleTypeDef hspi2; void SPI2_Init(void) { /* 初始化SPI2 */ hspi2.Instance = SPI2; hspi2.Init.Mode = SPI_MODE_MASTER; hspi2.Init.Direction = SPI_DIRECTION_2LINES; hspi2.Init.DataSize = SPI_DATASIZE_8BIT; hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; hspi2.Init.NSS = SPI_NSS_SOFT; hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi2.Init.CRCPolynomial = 10; HAL_SPI_Init(&hspi2); /* 启用SPI2外设 */ __HAL_SPI_ENABLE(&hspi2); } void W25Q64_WriteByte(uint8_t byte, uint32_t address) { /* 等待SPI2空闲 */ while ((SPI2->SR & SPI_SR_BSY) != 0); /* 选择W25Q64 */ HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, GPIO_PIN_RESET); /* 发送写入指令和地址 */ HAL_SPI_Transmit(&hspi2, &WRITE_ENABLE, 1, HAL_MAX_DELAY); HAL_SPI_Transmit(&hspi2, (uint8_t*)&address, 3, HAL_MAX_DELAY); /* 发送数据 */ HAL_SPI_Transmit(&hspi2, &byte, 1, HAL_MAX_DELAY); /* 取消选择W25Q64 */ HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, GPIO_PIN_SET); } ``` 这只是一个简单的示例代码,你还需要根据W25Q64的具体指令和寄存器来编写其他功能的读写函数。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值