RT-Thread studio SPI+SFUD+W25Q64
一、RT-Thread-W25Q64-SPI配置一SPI配置1、创建工程后打开设置使能SPI2、修改board.h头文件内容3、打开stm32cube-使能对应SPI通道引脚根据所使用的SPI通道进行设置W25Q64使用SPI2,相关设置如下所示4、生成代码关闭stm32cubemx修改stm32f4xx_hal_config_bak.h文件如框选所示使能 SPI 外设模块的宏定义5、将生成的SPI初始化函数复制到board.c文件末尾原来文件中函数的内容注释掉将复制的SPI初始化函数粘贴到board.c文件中末尾如下图所示随后将原来文件中的初始化函数注释掉二读取W25Q64SPI片选W25Q64芯片挂载设备struct rt_spi_device *spi_w25q64; //片选SPI和挂载W25Q64 void spi_init() { struct rt_spi_configuration cfg; //先把w25qxx挂载在SPI2总线上(pb12是W25Q的片选引脚) rt_hw_spi_device_attach(spi2, spi20, GPIOB, GPIO_PIN_12); //查找设备 spi_w25q64(struct rt_spi_device *)rt_device_find(spi20); if(spi_w25q64RT_NULL){ rt_kprintf(spi_w25q find failed...\n); } else { rt_kprintf(spi_w25q find success...\n); } //配置w25q-spi模式 cfg.data_width8; cfg.modeRT_SPI_MODE_3|RT_SPI_MASTER|RT_SPI_MSB;//模式3主机高位先行 cfg.max_hz5*1000*1000;//5M rt_spi_configure(spi_w25q64, cfg); //此时可以查看设备是否已注册 } MSH_CMD_EXPORT(spi_init,spi bus);读取设备ID指令0x90方法一//读取id方法1 void spi_read_id1() { rt_uint8_t id[5]{0};// struct rt_spi_message msg1,msg2; rt_uint8_t w25_read_id0x90;//读取ID指令 msg1.send_bufw25_read_id; msg1.recv_bufRT_NULL; msg1.length1; msg1.cs_take1; msg1.cs_release0; msg1.nextmsg2; msg2.send_bufRT_NULL; msg2.recv_bufid; msg2.length5; msg2.cs_take0; msg2.cs_release1; msg2.nextRT_NULL; //制造商0XEF 设备IDxx rt_spi_transfer_message(spi_w25q64, msg1); rt_kprintf(w25q128 ID is %x%x \n,id[3],id[4]); } MSH_CMD_EXPORT(spi_read_id1,spi_read_id);方法二//读取id方法2 //先发送后接收数据函数 //rt_spi_send_then_recv(device, send_buf, send_length, recv_buf, recv_length) void spi_read_id2() { rt_uint8_t id[5]{0}; //存储id rt_uint8_t w25_read_id0x90;//读取ID指令 rt_spi_send_then_recv(spi_w25q64, w25_read_id, 1, id, 5); rt_kprintf(w25q128 ID is %x%x \n,id[3],id[4]); } MSH_CMD_EXPORT(spi_read_id2,spi_read_id);完整代码如下所示#includertthread.h #includertdevice.h #includedrv_spi.h #includedrivers/spi.h struct rt_spi_device *spi_w25q64; //片选SPI和挂载W25Q64 void spi_init() { struct rt_spi_configuration cfg; //先把w25qxx挂载在SPI2总线上(pb12是W25Q的片选引脚) rt_hw_spi_device_attach(spi2, spi20, GPIOB, GPIO_PIN_12); //查找设备 spi_w25q64(struct rt_spi_device *)rt_device_find(spi20); if(spi_w25q64RT_NULL){ rt_kprintf(spi_w25q find failed...\n); } else { rt_kprintf(spi_w25q find success...\n); } //配置w25q-spi模式 cfg.data_width8; cfg.modeRT_SPI_MODE_3|RT_SPI_MASTER|RT_SPI_MSB;//模式3主机高位先行 cfg.max_hz5*1000*1000;//5M rt_spi_configure(spi_w25q64, cfg); //此时可以查看设备是否已注册 } MSH_CMD_EXPORT(spi_init,spi bus); //读取id方法1 void spi_read_id1() { rt_uint8_t id[5]{0};// struct rt_spi_message msg1,msg2; rt_uint8_t w25_read_id0x90;//读取ID指令 msg1.send_bufw25_read_id; msg1.recv_bufRT_NULL; msg1.length1; msg1.cs_take1; msg1.cs_release0; msg1.nextmsg2; msg2.send_bufRT_NULL; msg2.recv_bufid; msg2.length5; msg2.cs_take0; msg2.cs_release1; msg2.nextRT_NULL; //制造商0XEF 设备IDxx rt_spi_transfer_message(spi_w25q64, msg1); rt_kprintf(w25q128 ID is %x%x \n,id[3],id[4]); } MSH_CMD_EXPORT(spi_read_id1,spi_read_id); //读取id方法2 //先发送后接收数据函数 //rt_spi_send_then_recv(device, send_buf, send_length, recv_buf, recv_length) void spi_read_id2() { rt_uint8_t id[5]{0}; //存储id rt_uint8_t w25_read_id0x90;//读取ID指令 rt_spi_send_then_recv(spi_w25q64, w25_read_id, 1, id, 5); rt_kprintf(w25q128 ID is %x%x \n,id[3],id[4]); } MSH_CMD_EXPORT(spi_read_id2,spi_read_id);编译运行结果二、W25Q64SFUD一增加SFUD配置在第一章节一SPI配置基础上增加二编写代码SPI片选SFUD探测初始化int w25q_sfud_test() { //片选挂载设备 // rt_hw_spi_device_attach(bus_name, device_name, cs_gpiox, cs_gpio_pin) rt_hw_spi_device_attach(spi2, spi20, GPIOB, GPIO_PIN_12); //探测设备 // rt_sfud_flash_probe(spi_flash_dev_name, spi_dev_name) //使用sfud探测spi20设备并将spi20连接的flash初始化为块设备名称w25q128 if(rt_sfud_flash_probe(W25Q64, spi20)RT_NULL) { rt_kprintf(w25q64 prob failed...\n); return -RT_ERROR; } return RT_EOK; } MSH_CMD_EXPORT(w25q_sfud_test,sfub test);写入数据和读取数据测试sfud_flash_t test_sfud; int w25q_read_write_test() { const uint8_t test_data[]this is w25q sfud test data!; uint8_t read_data[50]{0}; //获取设备句柄 /* * 使用 rt_sfud_flash_find 或者 rt_sfud_flash_find_by_dev_name 获取设备句柄 */ //test_sfudrt_sfud_flash_find(spi20); test_sfudrt_sfud_flash_find_by_dev_name(W25Q64); if(test_sfudRT_NULL) { rt_kprintf(find sufd_flash failed...\n); return -RT_ERROR; } else { rt_kprintf(find sufd_flash success...\n); } //调用API进行读写操作 //写flash rt_kprintf(write flash...\n); // sfud_write(flash, addr, size, data) // sfud_erase_write(flash, addr, size, data) // sfud_write(test_sfud, 13, sizeof(test_data), test_data); sfud_erase_write(test_sfud, 13, sizeof(test_data), test_data); //读flash rt_kprintf(read flash...\n); sfud_read(test_sfud, 13, sizeof(test_data), read_data); rt_kprintf(read data:%s...\n,read_data); } MSH_CMD_EXPORT(w25q_read_write_test,sfub read write test);

相关新闻

Windows任务栏美化终极指南:3分钟免费打造圆角悬浮效果

Windows任务栏美化终极指南:3分钟免费打造圆角悬浮效果

Windows任务栏美化终极指南:3分钟免费打造圆角悬浮效果 【免费下载链接】RoundedTB Add margins, rounded corners and segments to your taskbars! 项目地址: https://gitcode.com/gh_mirrors/ro/RoundedTB 厌倦了Windows系统千篇一律的矩形任务栏吗&#x…

2026/8/7 14:42:04 阅读更多 →
DNS从电话簿到百科全书:TXT记录、服务发现与云原生架构实践

DNS从电话簿到百科全书:TXT记录、服务发现与云原生架构实践

1. 从“电话簿”到“百科全书”:DNS角色的悄然演变 我们每天都在和DNS打交道,但绝大多数人可能只把它理解为一个“网络电话簿”——你输入一个域名,比如 www.example.com ,它告诉你对应的IP地址是 93.184.216.34 ,…

2026/8/7 14:42:04 阅读更多 →
Python字符串操作全解析:从基础概念到实战应用

Python字符串操作全解析:从基础概念到实战应用

1. 从“人狗大作战”到“虚空之花”:为什么字符串是Python的基石 最近在社区里看到不少有趣的讨论,从“人狗大作战”的Python代码,到“虚空之花”的字符串下载,再到处理可能超过一万位的“大整数”字符串运算。这些看似五花八门的…

2026/8/7 14:41:03 阅读更多 →

最新新闻

UE4高级会话管理插件:解决多人游戏开发五大核心痛点

UE4高级会话管理插件:解决多人游戏开发五大核心痛点

1. 项目概述:为什么我们需要一个“高级”会话管理插件? 如果你在UE4里做过多人游戏,尤其是那种需要房间、匹配、状态同步的联机项目,那你一定对“会话管理”这四个字又爱又恨。爱的是,它确实是连接玩家的桥梁&#xff…

2026/8/7 15:33:43 阅读更多 →
K-means聚类中手肘法确定最佳K值:原理、Python实现与实战技巧

K-means聚类中手肘法确定最佳K值:原理、Python实现与实战技巧

1. 项目缘起:从“拍脑袋”到“有据可依”的K值选择 在数据科学和机器学习的日常工作中,聚类分析是一个高频出现的任务。无论是客户分群、图像分割,还是异常检测,我们常常需要将一堆没有标签的数据点,按照它们内在的相似…

2026/8/7 15:33:43 阅读更多 →
系统性解决 scikit-learn 安装失败:从编译依赖到虚拟环境全攻略

系统性解决 scikit-learn 安装失败:从编译依赖到虚拟环境全攻略

1. 从一次典型的安装失败说起 那天下午,我正准备复现一个经典的机器学习分类实验,环境都搭好了,数据也清洗完毕,就等着主角 scikit-learn 登场。像往常一样,我信心满满地在终端里敲下了 pip install scikit-learn …

2026/8/7 15:33:43 阅读更多 →
Wine中文乱码终极解决方案:Ubuntu/Debian/Deepin系统字体配置实战

Wine中文乱码终极解决方案:Ubuntu/Debian/Deepin系统字体配置实战

1. 问题缘起:当Wine遇上中文字体,为何总是“口口相传”? 如果你在Linux上用过Wine来运行Windows程序,尤其是那些需要显示中文界面的软件,大概率见过这个令人头疼的场景:本该是清晰的中文菜单、按钮或文本&a…

2026/8/7 15:33:43 阅读更多 →
小米运动自动刷步神器:3分钟完成微信支付宝数据同步

小米运动自动刷步神器:3分钟完成微信支付宝数据同步

小米运动自动刷步神器:3分钟完成微信支付宝数据同步 【免费下载链接】mimotion 小米运动刷步数(微信支付宝)支持邮箱登录 项目地址: https://gitcode.com/gh_mirrors/mimo/mimotion 想要在微信运动排行榜上保持领先吗?小米…

2026/8/7 15:33:43 阅读更多 →
WMPFDebugger终极指南:5大实战技巧深度解析Windows微信小程序调试

WMPFDebugger终极指南:5大实战技巧深度解析Windows微信小程序调试

WMPFDebugger终极指南:5大实战技巧深度解析Windows微信小程序调试 【免费下载链接】WMPFDebugger Yet another WeChat miniapp debugger on Windows 项目地址: https://gitcode.com/gh_mirrors/wm/WMPFDebugger WMPFDebugger是一款专为Windows平台设计的微信…

2026/8/7 15:32:43 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →