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/11/6 4:30:46 阅读更多 →
DNS从电话簿到百科全书:TXT记录、服务发现与云原生架构实践

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

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

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

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

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

2026/11/5 2:10:11 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/5 12:28:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/5 1:08:50 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/5 12:28:01 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/5 12:28:02 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/5 0:54:28 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/5 19:38:59 阅读更多 →

日新闻

周新闻

月新闻