SPI协议——对外部SPI操作(跨页读写)

news2024/9/28 9:19:00

关于W25Q32JVSSIQ的详细内容在之前的两篇文章中已经详细介绍,本文不做太多赘述,如果对芯片的了解有缺失的话,可以参考:

SPI协议——对外部SPI Flash操作-CSDN博客

SPI协议——读取外部SPI Flash ID_spi flash 读取id-CSDN博客

目录

一、代码编写

1.发送/接收单/多个字节的函数

2.实现扇区擦除

3.实现跨页写

 4.读取数据

 二、运行结果

 


 

一、代码编写

1.发送/接收单/多个字节的函数

这样设计代码可以随意选择自己是否忽略发送/接受的数据

void SPI_FLASH_Xfer(uint8_t *snd_buf, uint8_t *recv_buf, int bytes)
{
	int 		i;
	uint8_t		send_data, recv_data;
	for(i = 0; i < bytes; i ++)
	{
		send_data = (snd_buf != NULL) ? snd_buf[i] : 0xFF;

		recv_data = SPI_FLASH_SendByte(send_data);

		if( recv_buf != NULL )
		{
			recv_buf[i] = recv_data;
		}
		printf("Sending: 0x%02X, Received: 0x%02X\n", send_data, recv_data);


	}

	HAL_Delay(1);
}

2.实现扇区擦除

int New_SPI_FLASH_SectorErase(uint32_t addr, uint32_t size)
{
    uint32_t sector, first, last;
    uint32_t address;
    int rv;

    first = addr / Sector_Size;
    last = (addr + size - 1) / Sector_Size;

    /* Start to erase all sectors */
    for (sector = first; sector <= last; sector++)
    {
        address = sector * Sector_Size;
        printf("Norflash Erase Sector@%lx ...\r\n", address);

        SPI1_FLASH_WaitEnd();
        SPI1_FLASH_WriteEnable();
        cs_low();
        SPI_FLASH_SendByte(0x20); // 发送扇区擦除命令

        /* Send the addr */
        SPI_FLASH_SendByte((address & 0xFF0000) >> 16);
        SPI_FLASH_SendByte((address & 0xFF00) >> 8);
        SPI_FLASH_SendByte(address & 0xFF);
        cs_high();

        // 确保擦除完成
        SPI1_FLASH_WaitEnd();
        HAL_Delay(10); // 增加延时,确保擦除完成
    }

    // 检查整个擦除区域是否已擦除
    rv = SPI_FLASH_VerifyErase(addr, size);
    if (rv != 0)
    {
        printf("Erase the sector error\n");
        return -1;
    }
    else
    {
        printf("Erase ok\n");
    }

    return 0;
}

3.实现跨页写

int New_SPI_FLASH_PageWrite( uint32_t addr, uint8_t *data, uint32_t size)
{
	uint32_t			first, last, page;
	uint32_t			address, ofset, len;
	uint8_t				buf[Page_Size+5];
	int					bytes = 0;

	if( addr + size > 0x400000 )
		return -1;


	/* find the fist and the last page */
	first = addr / Page_Size;
	last = ( addr + size - 1 ) / Page_Size;
	printf("Norflash Write %ld Bytes to addr@0x%lx Begin...\r\n", size, addr );

	/*Initial  address in page and offset in buffer */
	address = addr;
	ofset = 0;

	/* Start to write to all pages */
	for( page = first; page <= last; page ++)
	{
		len = Page_Size - ( address % Page_Size );
		len = len > size ? size : len;
		bytes = 0;
		printf("Norflash write addr@0x%lx, %lu bytes,and the data is %s \r\n", addr, len, data);


		buf[bytes++] = 0x02;
		buf[bytes++] = (addr & 0xFF0000) >> 16 ;
		buf[bytes++] = (addr & 0xFF00) >> 8 ;
		buf[bytes++] = (addr & 0xFF);

		/* send command and data */
		memcpy(&buf[bytes], data+ofset, len);
		bytes += len;
		printf("Norflash write addr@0x%lx, %lu bytes, data : ", address, len);
		for( int i = 4; i < bytes; i++ )
		{
			printf("0x%02x", buf[i]);
			printf("\n");
		}

		SPI1_FLASH_WriteEnable();
		cs_low();

		SPI_FLASH_Xfer(buf, NULL, bytes);

		cs_high();

		SPI1_FLASH_WaitEnd();
		addr  += len;
		ofset += len;
		size  -= len;

	}

	HAL_Delay(10);
	printf("Norflash WriteByte@0x%lx done.\r\n", addr);
	return 0;

}


 4.读取数据

void New_SPI_FLASH_BufferRead(uint32_t addr, uint8_t *buffer, uint32_t size)
{
    uint8_t cmd[4];

    cmd[0] = 0x03; // Read Data command
    cmd[1] = (addr >> 16) & 0xFF;
    cmd[2] = (addr >> 8) & 0xFF;
    cmd[3] = addr & 0xFF;

    cs_low();
    //发送读取命令和地址
    SPI_FLASH_Xfer(cmd, NULL, 4);

    //读取数据
    SPI_FLASH_Xfer(NULL, buffer, size);
    cs_high();

    // 调试输出,可选项,用于验证发送的命令和接收到的数据
/*    printf("SPI Flash Read: Address = 0x%lx, Data: ", addr);
    for (int i = 0; i < size; i++)
    {
    	printf("0x%02x ", buffer[i]);
    }
    printf("\n");
    */
}


 二、运行结果

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[氮化镓]Kevin J. Chen组新作—肖特基p-GaN HEMTs正栅ESD机理研究

这篇文章是发表在《IEEE Electron Device Letters》上的一篇关于Schottky型p-GaN栅极高电子迁移率晶体管&#xff08;HEMTs&#xff09;的正向栅极静电放电&#xff08;ESD&#xff09;机理研究的论文。文章由Jiahui Sun等人撰写&#xff0c;使用了基于碳化硅&#xff08;SiC&a…

铜重量、走线宽度与载流能力是什么关系?

PCB的载流能力是由走线的横截面积和温升决定的。此外&#xff0c;走线的横截面积与走线宽度和铜厚度成正比。那么&#xff0c;这里有一个问题&#xff1a;这个规则是否也适用于载流能力与走线截面积之间的关系&#xff0c;即走线承载能力与其截面积成正比吗&#xff1f; 铜厚度…

揭秘GPT-4o:未来智能的曙光

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;的发展突飞猛进&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;领域的进步&#xff0c;更是引人注目。在这一背景下&#xff0c;OpenAI发布的GPT系列模型成为了焦点。本文将详细探讨最新的模型GPT-4o&a…

Electron-ViteChat桌面端聊天室|electron31+vite5+pinia2仿微信EXE程序

原创研发Electron31vue3elementPlus仿微信客户端聊天应用。 使用最新跨平台技术electron31.xvite5vue3 setuppinia2element-plus实战开发电脑版聊天室Exe程序。整个聊天程序界面清爽简约&#xff0c;支持展示/收缩侧边栏、electron新开多窗口、换肤等功能。 electron-vitechat支…

利用AI软件5分钟一条爆款睡前故事,小红书8笔记21万粉,小白月入2w+

今天&#xff0c;我要和大家分享拆解一个朝阳行业的流量赛道——利用AI软件&#xff0c;5分钟创作一条爆款睡前故事&#xff0c;简单易学&#xff0c;即使是小白也能轻松月入2万。下面跟着我一步一步拆解。 一、项目介绍与收益情况 让我们看看这个项目的收益情况。 我的个人视…

基于JAVA+SpringBoot+Vue的自动阅卷分析系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在当前教育评估体系中…

【数学建模】数据的无量纲化处理 2005建模A题:长江水质综合评价与预测

数据的无量纲化处理是一种统计学中的预处理技术&#xff0c;主要用于消除数据中的量纲影响&#xff0c;使得不同单位或量级的指标可以相互比较和结合。无量纲化通过调整数据的范围或尺度&#xff0c;使得数据集中的每个特征或变量处于相似的数值区间内。以下是几种常见的无量纲…

[图解]SysML和EA建模住宅安全系统-13-时间图

1 00:00:00,480 --> 00:00:02,280 首先&#xff0c;我们来看&#xff0c;图画在哪里 2 00:00:02,290 --> 00:00:04,380 这个图 3 00:00:04,390 --> 00:00:06,180 你看&#xff0c;它是描述&#xff0c;刚才讲的 4 00:00:06,190 --> 00:00:09,010 描述这个活动 …

【数学建模】2005建模A题:长江水质综合评价与预测

数据的无量纲化处理 数据的无量纲化处理是一种统计学中的预处理技术&#xff0c;主要用于消除数据中的量纲影响&#xff0c;使得不同单位或量级的指标可以相互比较和结合。无量纲化通过调整数据的范围或尺度&#xff0c;使得数据集中的每个特征或变量处于相似的数值区间内。以…

NISP证书备考指南与经验分享

在信息安全领域&#xff0c;NISP(国家信息安全水平考试)作为衡量专业能力的重要标尺&#xff0c;不仅是职场晋升的敲门砖&#xff0c;更是个人技能提升的关键一步。面对这一挑战&#xff0c;如何高效备考&#xff0c;成为众多学员关注的焦点。今天&#xff0c;为您精心打造这份…

Zotero软件翻译插件Translate for Zotero的API接入方法--百度垂直领域翻译

首先注册通用文本翻译API的token:百度翻译开放平台 (baidu.com)&#xff08;可以免费认证 升级为高级版&#xff09; 之后点击管理控制台&#xff0c;选择总览右侧最下方可以看到个人的id和密码 点击文档与支持&#xff0c; 在这里可以选择领域。 支持传入值描述支持语言方向…

matplotlib颜色对照表

matplotlib的色彩设置: #------------------------------------------------------------------------------------------------------------------------------- #-------------------------------------------------------------------------------------------------------…

本地LLM VLM性能评测

作为一名数据工程师&#xff0c;我对测试一些生成式 AI 模型并在本地安装/运行模型很感兴趣。大型语言模型 (LLM) 和视觉语言模型 (VLM) 是最有趣的。OpenAI 提供了 ChatGPT 网站和移动应用程序。微软创建了 Windows 11 Copilot 供我们使用。但是&#xff0c;我们无法控制哪些数…

PCB翘曲如何修复?

怎么样的PCB板才算板翘曲&#xff1f; 在实际生产中&#xff0c;PCB都不是100%平整&#xff0c;或多或少都会有点弯曲。那PCB翘曲标准是多少&#xff1f; 据IPC《刚性印制板的鉴定与性能规范》要求中&#xff0c;生产电路板允许最大翘曲和扭曲为0.75%-1.5%之间。 按照IPC标准&a…

DBA 数据库管理 部署Mysql 服务,基础查询

数据库&#xff1a;存储数据的仓库 数据库服务软件&#xff1a; 关系型数据库&#xff1a; 存在硬盘 &#xff0c;制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

智谱AI开源代码生成大模型 CodeGeeX4-ALL-9B

智谱AI 旗下的代码生成大模型 CodeGeeX 正式发布第四代开源版本&#xff1a;CodeGeeX4-ALL-9B&#xff0c;其是集代码补全和生成、代码问答、代码解释器、工具调用、联网搜索、项目级代码问答等能力于一体的代码大模型&#xff0c;是目前百亿&#xff08;10B&#xff09;参数以…

299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源

299k stars利用Public APIs提升开发效率&#xff1a;探索APILayer提供的开源资源 在现代软件开发中&#xff0c;API&#xff08;应用程序接口&#xff09;是实现应用间通信和功能扩展的关键工具。公共API&#xff08;Public APIs&#xff09;则为开发者提供了宝贵的资源&#…

2024QS世界大学学科排名(各学科详细)

2024QS全球高校学科排名附榜单&#xff1a; 人文与艺术相关学科全球Top10 社会科学与管理相关学科全球Top10 自然科学相关学科全球Top10 工程与技术相关学科全球Top10 生命科学与医学相关学科全球Top10

Matlab基础语法篇(上)

Matlab基础语法&#xff08;上&#xff09; 一、基知&#xff08;一&#xff09;界面介绍&#xff08;二&#xff09;常用快捷键&#xff08;三&#xff09;常用指令&#xff08;四&#xff09;Matlab帮助系统 二、运算基础&#xff08;一&#xff09;变量&#xff08;二&#…

几级系统需要做等保?

正常来说只要是在运营的系统都需要做等保&#xff0c;无论是内网还是外网&#xff0c;等保常见的系统一般分成五个级别&#xff0c;一级最低&#xff0c;五级最高&#xff0c;不同级别的系统国家的监管程度也不一样&#xff0c;具体如下&#xff1a; 第一级&#xff1a;系统运…