SPI FLASH扇区擦除

这篇具有很好参考价值的文章主要介绍了SPI FLASH扇区擦除。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、扇区擦除  Sector Erase  指令 (20h)

         1、步骤

                a、扇区擦除前,必须解锁FLASH,也就是写使能       (06h)

                b、FLASH进行扇区擦除,看第一个图                         (20h)

                c、检查是否擦除 状态寄存器 (05h or 35h)

                d、对FLASH上锁,禁止写入数据        (04h)

        2、编写代码

二、页编程     Page Program   指令(02h)

        1、步骤

        2、编写代码


一、扇区擦除  Sector Erase  指令 (20h)

flash扇区擦除,STM32硬件,fpga开发,嵌入式硬件

flash扇区擦除,STM32硬件,fpga开发,嵌入式硬件

         1、步骤

                a、扇区擦除前,必须解锁FLASH,也就是写使能       (06h)

flash扇区擦除,STM32硬件,fpga开发,嵌入式硬件

 cs拉低之后,直接发送(06h),再将cs拉高,完成写使能。

                b、FLASH进行扇区擦除,看第一个图                         (20h)

cs拉低之后,发送(20h),再发送一个24位地址,cs拉高,完成扇区擦除。

                c、检查是否擦除 状态寄存器 (05h or 35h)

05h表示状态寄存器1,35h表示状态寄存器2 

flash扇区擦除,STM32硬件,fpga开发,嵌入式硬件

 这里我们主要用状态寄存器1,因为状态寄存器1包含一个BUSY位,在S0最低位上,如果BUSY位为1,表示还在繁忙中,如果BUSY位为0,表示已经操作完毕(很重要 !!!)下图就是状态寄存器1

flash扇区擦除,STM32硬件,fpga开发,嵌入式硬件

                d、对FLASH上锁,禁止写入数据        (04h)

flash扇区擦除,STM32硬件,fpga开发,嵌入式硬件

  cs拉低之后,直接发送(04h),再将cs拉高,完成上锁。

        2、编写代码

//写使能
void w25qxx_write_enable(void)
{
	//片选引脚拉低
	W25QXX_SS=0;
	
	//发送0x06
	SPI1_SendByte(0x06);

	//片选引脚拉高	
	W25QXX_SS=1;
}

//读状态寄存器1
uint8_t w25qxx_read_status1(void)
{
	uint8_t status=0;
	
	//片选引脚拉低
	W25QXX_SS=0;
	
	//发送0x05
	SPI1_SendByte(0x05);

	//发送任意参数,读取状态寄存器的值
	status=SPI1_SendByte(0xFF);
	
	//片选引脚拉高	
	W25QXX_SS=1;
	
	return status;
}

//写失能
void w25qxx_write_disable(void)
{
	//片选引脚拉低
	W25QXX_SS=0;
	
	//发送0x04
	SPI1_SendByte(0x04);


	//片选引脚拉高	
	W25QXX_SS=1;
}

//擦除
void w25qxx_erase_sector(uint32_t addr)
{
	uint8_t status=0;

	//执行写使能指令
	w25qxx_write_enable();
	
	//延时一会儿,让片选引脚能够给保持高电平一段时间,让w25qxx识别
	delay_us(1);

	//片选引脚拉低
	W25QXX_SS=0;
	
	//发送0x20
	SPI1_SendByte(0x20);
	
	//发送24bit的地址
	SPI1_SendByte((addr>>16)&0xFF);
	SPI1_SendByte((addr>>8)&0xFF);
	SPI1_SendByte( addr&0xFF);

	//片选引脚拉高	
	W25QXX_SS=1;
	
	//延时一会儿,让片选引脚能够给保持高电平一段时间,让w25qxx识别
	delay_us(10);
	
	//检查当前是否已经擦除成功
	while(1)
	{
		status=w25qxx_read_status1();
		
		if((status & 0x01) ==0)        //判断最低为是否为0,为0表示操作完毕,退出。
			break;
	
		//每隔1毫秒进行查询
		delay_ms(1);
	
	}
	
	//开启写保护
	w25qxx_write_disable();
}

二、页编程     Page Program   指令(02h)

一次最高只能写入256字节,原因是缓冲区最大接受256个字节

        1、步骤

                a:写使能        (06h)

                b:页写入指令        (02h)

flash扇区擦除,STM32硬件,fpga开发,嵌入式硬件

 这里的24位地址是任意地址,不是扇区地址,和(20h)不一样。发送完后cs拉高。

                c:检测是否编程完毕,使用状态寄存器1,和上面红字区域一样。

                d:写失能。

        2、编写代码

uint8_t SPI1_SendByte(uint8_t byte)
{
	/*!< Loop while DR register in not emplty ,等待发送缓冲区为空*/
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

	/*!< Send byte through the SPI1 peripheral ,通过SPI1发送字节*/
	SPI_I2S_SendData(SPI1, byte);

	/*!< Wait to receive a byte ,由于是同步通信,等待接收字节*/
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

	/*!< Return the byte read from the SPI bus ,成功接收从机的字节并返回*/
	return SPI_I2S_ReceiveData(SPI1);
}

//写使能
void w25qxx_write_enable(void)
{
	//片选引脚拉低
	W25QXX_SS=0;
	
	//发送0x06
	SPI1_SendByte(0x06);

	//片选引脚拉高	
	W25QXX_SS=1;
}

//读状态寄存器1
uint8_t w25qxx_read_status1(void)
{
	uint8_t status=0;
	
	//片选引脚拉低
	W25QXX_SS=0;
	
	//发送0x05
	SPI1_SendByte(0x05);

	//发送任意参数,读取状态寄存器的值
	status=SPI1_SendByte(0xFF);
	
	//片选引脚拉高	
	W25QXX_SS=1;
	
	return status;
}

//写失能
void w25qxx_write_disable(void)
{
	//片选引脚拉低
	W25QXX_SS=0;
	
	//发送0x04
	SPI1_SendByte(0x04);


	//片选引脚拉高	
	W25QXX_SS=1;
}

//写数据,一次最高256字节
void w25qxx_write_page(uint32_t addr,uint8_t *pbuf,uint32_t len)
{
	uint8_t status=0;

	//执行写使能指令
	w25qxx_write_enable();
	
	//延时一会儿,让片选引脚能够给保持高电平一段时间,让w25qxx识别
	delay_us(10);

	//片选引脚拉低
	W25QXX_SS=0;
	
	
	//发送0x02
	SPI1_SendByte(0x02);
	
	//发送24bit的地址
	SPI1_SendByte((addr>>16)&0xFF);
	SPI1_SendByte((addr>>8)&0xFF);
	SPI1_SendByte( addr&0xFF);
	
	//发送数据
	while(len--)
		SPI1_SendByte(*pbuf++);

	//片选引脚拉高	
	W25QXX_SS=1;
	
	//延时一会儿,让片选引脚能够给保持高电平一段时间,让w25qxx识别
	delay_us(10);
	
	
	//检查当前是否已经写入成功
	while(1)
	{
		status=w25qxx_read_status1();
		
		if((status & 0x01) ==0)
			break;
	
		//每隔1毫秒进行查询
		delay_ms(1);
	
	}
	
	//开启写保护
	w25qxx_write_disable();
}

验证代码片段文章来源地址https://www.toymoban.com/news/detail-703359.html

int main(void)
{
    //spi flash初始化
	w25qxx_init();
	
	
	//打印id信息
	printf("w25qxx spi flash id=%04X\r\n",w25qxx_read_id());
	
	//从地址0进行扇区擦除,每次擦除4KB字节
	printf("w25qxx spi flash erase sector at addr 0\r\n");
	w25qxx_erase_sector(0);
	
	
	//从地址0写入64字节数据,写入数据位1~64
	for(i=0; i<64; i++)
		buf[i]=i+1;
	printf("w25qxx spi flash write data at addr 0,data is 1~64\r\n");
	w25qxx_write_page(0,buf,64);
	
	
	//从地址0读取64字节数据
	memset(buf,0,64);
	printf("w25qxx spi flash read data at addr 0:\r\n");
	w25qxx_read_data(0,buf,64);
	
	
	
	for(i=0; i<64; i++)
	{
		printf("%02X ",buf[i]);
	
	}

	printf("\r\n");

    while(1)
    {

    }

}

到了这里,关于SPI FLASH扇区擦除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)

    本人开发stm32g030和g070都遇到过擦除flash失败的问题,HAL库中按照例程方式擦除存在擦除失败问题。例程基本流程如下: 按照这种方式其实很容易擦除失败。网上多数是说中断问题等,还有些是看门狗喂狗问题。 以上问题之外,本人遇到的是FLASH_FLAG_CFGBSY一直被置位,导致擦除

    2024年02月10日
    浏览(43)
  • 【STM32 CubeMX】SPI_Flash_W25Q64的操作方法

    在嵌入式系统开发中,使用外部 SPI Flash 存储器可以为 STM32 微控制器提供额外的存储空间,以存储程序代码、配置数据等。W25Q64 是一款常见的 SPI Flash 存储器,具有64Mb容量和SPI接口。本文将介绍如何使用 STM32 CubeMX 结合 SPI 库与 W25Q64 SPI Flash 进行集成,以便在 STM32 微控制器上

    2024年02月22日
    浏览(33)
  • stm32基于HAL库驱动外部SPI flash制作虚拟U盘

    📌参考文章: https://xiaozhuanlan.com/topic/6058234791 🎞实现效果演示: 🔖上图中的读到的 FLASH_ID 所指的是针对不同容量,所对应的ID。 🔖在电脑端,支持对虚拟出来的存储器进行读写操作。 ✨如果设计成一块PCB,可以制作成一个微小容量的移动U盘。 🌿基于STM32F103,HAL库生成

    2024年02月11日
    浏览(30)
  • 【STM32】SPI初步使用 读写FLASH W25Q64

    (1) SS( Slave Select):从设备选择信号线,常称为片选信号线,每个从设备都有独立的这一条 NSS 信号线,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI通讯。所以 SPI通讯以 NSS 线置低电

    2024年02月10日
    浏览(38)
  • STM32单片机初学8-SPI flash(W25Q128)数据读写

            当使用单片机进行项目开发,涉及大量数据需要储存时(例如使用了屏幕作为显示设备,常常需要存储图片、动画等数据),单靠单片机内部的Flash往往是不够用的。         如STM32F103系列,内部Flash最多只能达到512KByte,假设要储存240*240分辨率、64K彩色图片,

    2024年02月03日
    浏览(33)
  • 【FPGA】SPI读写flash

    SPI是同步全双工通信,通信原理以主从方式工作,通常有一个主设备和一个或多个从设备,需要4根线连接:MISO(主设备数据输入)、MOSI(主设备输出)、SCLK(时钟)、CS(片选)。通常拉低对应从机的片选来收发数据。 MISO:主设备输入,从设备输出 MOSI:主设备输出,从设备输入 SCLK:时

    2024年02月05日
    浏览(28)
  • STM32 HAL库形式制作SPI Flash(W25Q16)的 Keil下载算法

    常见的SPI Flash:W25Qxx系列,本文以W25Q16为实例制作Keil下载算法。 如下图,红框内的东西就是下载算法。 只要导入下载算法后,就可以在烧录MCU的同时对W25Q16页进行烧录。此操作可方便LCD运用场景,字库、图片存放在外部Flash的烧录。 实际操作: 1、硬件:STM32G030C8T6、W25Q16(

    2024年02月21日
    浏览(30)
  • 【FPGA】SPI读写FLASH闪存

    通信原理 SPI也是以主从方式工作,通常需要四根线来完成数据的传输,分别是MISO MOSI CS SCLK。以下是这四根线代表的含义: MISO:主设备输入,从设备输出 MOSI:主设备输出,从设备输入 CS :片选信号,选择进行通信的从设备 SCLK:时钟线,由主设备产生给到从设备 SPI通信的

    2024年02月16日
    浏览(28)
  • FPGA使用SPI控制FLASH

    通过控制FLASH芯片进一步熟悉SPI协议 Flash 存储器 : Flash 存储器是一种非易失性存储器,它具有 RAM 和 ROM 的一些特点。与 ROM 类似,Flash 存储器的内容在断电时不会丢失,但与 RAM 类似,它可以通过编程来修改存储的内容。Flash 存储器通常用于嵌入式系统中存储程序代码、配置

    2024年03月19日
    浏览(40)
  • FPGA模块——SPI协议(读写FLASH)

    芯片引脚图: 内部结构图: 存储区域总共分成了32块,每块64KB。每块又分成了16个部分,每个部分4KB。方便进行读取和局部操作。 电路设计 SPI的四种模式 这里使用这个模式: 主机和从机在时钟上升沿放入要输出的数据,在时钟下降沿读取要输入的数据。 8个时钟后交换一个

    2024年02月05日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包