Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SFUD
【分享】如何使用 SFUD 库来操作 SPI Flash 设备
发布于 2017-09-07 08:52:32 浏览:17110
订阅该版
[SFUD](https://github.com/armink/SFUD)是一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库] 目前 RT-Thread 2.1.0 之后已经支持。这使得 RTT 可以驱动 更多型号的 SPI Flash 。同时使用该驱动支持多 Flash 对象实例, 能够让用户 **同时驱动多片 SPI Flash** 。主要使用方法如下: 1. 配置 在 rtconfig.h 可增加如下配置信息,每个配置的功能详见 [rt-thread/components/drivers/spi/sfud/inc/sfud_cfg.h](https://github.com/armink/rt-thread/blob/master/components/drivers/spi/sfud/inc/sfud_cfg.h) ```c #define RT_USING_SFUD //必选 #define RT_DEBUG_SFUD 1 //可选 #define RT_SFUD_USING_SFDP //可选 #define RT_SFUD_USING_FLASH_INFO_TABLE //可选 ``` 2. 使用 以往的方式只需输入 SPI Flash 的设备名称及对应的 SPI 设备名称即可 ```c w25qxx_init("flash", "spi10"); dfs_mount("flash", "/", "elm", 0, 0); ``` 现在使用方法也类似,只不过初始化成功后会返回 SPI flash 对象,这是一个动态 SPI flash 对象,支持对该 SPI flash 设备的删除。 ```c static rt_spi_flash_device_t w25q64, sst25vf016b; /* 创建两个 SPI Flash 设备,分别从 spi10 及 spi30 两个 spi 设备探测 */ w25q64 = rt_sfud_flash_probe("flash0", "spi10"); sst25vf016b = rt_sfud_flash_probe("flash1", "spi30"); dfs_mount("flash0", "/", "elm", 0, 0); rt_sfud_flash_delete(sst25vf016b); ``` 3、sf (SPI Flash 操作) 测试命令 在 spi_flash_sfud.c 定义有 SPI Flash 操作命令,可以通过 MSH 命令来手动操作 SPI Flash ,简单使用方法如下: ``` msh >sf Usage: sf probe [spi_device] - probe and init SPI flash by given 'spi_device' sf read addr size - read 'size' bytes starting at 'addr' sf write addr data1 ... dataN - write some bytes 'data' to flash starting at 'addr' sf erase addr size - erase 'size' bytes starting at 'addr' sf status [
] - read or write '1:volatile|0:non-volatile' 'status' sf bench - full chip benchmark. DANGER: It will erase full chip! msh >sf probe spi10 8 MB W25Q64 is current selected device. msh >sf read 0 64 Read the W25Q64 flash data success. Start from 0x00000000, size is 64. The data is: Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F [00000000] 54 00 00 00 90 8F E3 A7 69 61 70 5F 6E 65 65 64 [00000010] 5F 63 6F 70 79 5F 61 70 70 3D 30 00 69 61 70 5F [00000020] 63 6F 70 79 5F 61 70 70 5F 73 69 7A 65 3D 30 00 [00000030] 73 74 6F 70 5F 69 6E 5F 62 6F 6F 74 6C 6F 61 64 msh >sf write 10 1 2 3 4 5 Write the W25Q64 flash data success. Start from 0x0000000A, size is 5. Write data: 1 2 3 4 5 . msh >sf erase 0 8192 Erase the W25Q64 flash data success. Start from 0x00000000, size is 8192 msh >sf status The W25Q64 flash status register current value is 0x00. msh >sf status 1 28 Write the W25Q64 flash status register to 0x1C success. msh >sf bench yes Erasing the W25Q64 8388608 bytes data, waiting... Erase benchmark success, total time: 20.591S. Writing the W25Q64 8388608 bytes data, waiting... Write benchmark success, total time: 32.768S. Reading the W25Q64 8388608 bytes data, waiting... Read benchmark success, total time: 16.129S. ```
查看更多
41
个回答
默认排序
按发布时间排序
bernard
2017-09-07
这家伙很懒,什么也没写!
这个部分, > w25q64 = rt_sfud_flash_probe("W25Q64", "spi10"); > sst25vf016b = rt_sfud_flash_probe("SST25VF016B", "spi30"); 感觉有些多余,能否flash0 = rt_sfud_flash_probe("flash0", "spi10"); 然后就自动识别?还有一个需要考虑的,分区表怎么整合起来?
armink
2017-09-07
这家伙很懒,什么也没写!
>这个部分, >>> w25q64 = rt_sfud_flash_probe("W25Q64", "spi10"); >>> sst25vf016b = rt_sfud_flash_probe("SST25VF016B", "spi30"); > >感觉有些多余,能否flash0 = rt_sfud_flash_probe("flash0", "spi10"); 然后就自动识别?还有一个需要考虑的,分区表怎么整合起来? --- 熊大,你可能理解错意思了,底层是自动识别的。rt_sfud_flash_probe 这个函数的第一个入参是返回对象的名称,跟 rt_thread_create 的第一个入参概念是一样的。 你是指的你的那个 partition 组件吗?
bernard
2017-09-07
这家伙很懒,什么也没写!
我觉得也是,所以我实际上建议你给的例子能够统一、抽象化些比较好,然后可以给出注释出来。 SFUD应该更类似flash底层的操作吧?如果程序固件本身占用一部分,那么必然会引入分区的部分。partition组件是一种可能
armink
2017-09-07
这家伙很懒,什么也没写!
>我觉得也是,所以我实际上建议你给的例子能够统一、抽象化些比较好,然后可以给出注释出来。 > >SFUD应该更类似flash底层的操作吧?如果程序固件本身占用一部分,那么必然会引入分区的部分。partition组件是一种可能 --- 对的,SFUD 是以字符模式操作 flash 的,这点跟块设备有区别。 分区这个功能感觉是可选的,作为 RTT 的一个 package 也不错。
勇士FF
2018-07-02
这家伙很懒,什么也没写!
我使用的是3.0.4 build Jun 24 2018 `bsp/stm32f429-apollo` 编译下载 ,出现如下问题: ``` [SFUD]Warning: Read SFDP parameter header information failed. The W25Q256 is not support JEDEC SFDP. [SFUD]Warning: This flash device is not found or not support. [SFUD]Error: W25Q256 flash device is initialize fail. ERROR: SPI flash probe failed by SPI device spi50. ``` 我检查了好久没有找到答案,我猜想rtt官网再app中使用并且driver都已测试,我直接下载就可以使用,想测试下效果出现如上错误, probe: ```c if (RT_NULL == rt_sfud_flash_probe("W25Q256", "spi50")) { return RT_ERROR; }; ``` 挂: ```c result = rt_spi_bus_attach_device(&spi_device, "spi50", "spi5", (void*)&spi_cs); ``` ``` msh />list_device device type ref count ------ -------------------- ---------- e0 Network Interface 0 spi50 SPI Device 0 spi5 SPI Bus 0 i2c0 I2C Bus 1 nand0 MTD Device 0 rtc RTC 0 uart2 Character Device 0 uart1 Character Device 2 sf probe spi50 [SFUD]Warning: Read SFDP parameter header information failed. The sf_cmd is not support JEDEC SFDP. [SFUD]Warning: This flash device is not found or not support. [SFUD]Error: sf_cmd flash device is initialize fail. ERROR: SPI flash probe failed by SPI device spi50. msh /> msh /> ``` 烦请知道的人员赐教下 谢谢
whj467467222
认证专家
2018-07-03
开源,分享,交流,共同进步
>我使用的是3.0.4 build Jun 24 2018 > >bsp/stm32f429-apollo --- 找不到帖子链接地址了。以前W25Q256是不支持SFUD的,前几天刚更新的SFUD已经支持了,你更新一下驱动看看。[https://github.com/armink/SFUD](https://github.com/armink/SFUD)
whj467467222
认证专家
2018-07-05
开源,分享,交流,共同进步
@armink 现在使用SFUD驱动AT45DB321E,sfud本来不支持,参考您的添加方法加进去了AT45DB321E,能识别到该FLASH,现在有几个问题请问一下。 1,在官方的datesheet User configurable page size 512 bytes per page 528 bytes per page (default) Page size can be factory pre-configured for 512 bytes 默认为528, 在其他论坛看到其他网友的普遍做法是每次读528,写的时候就是512,通过这种操作来实现读写 而在SFUD设置的AT45是512,看datesheet里面修改每页字节大小是otp,只能修改一次 2,SFUD只是FLASH驱动,如果要进行读 写 擦除 就可以使用您开源的easyflash了吧
whj467467222
认证专家
2018-07-06
开源,分享,交流,共同进步
>对的,SFUD 是以字符模式操作 flash 的,这点跟块设备有区别。 > >分区这个功能感觉是可选的,作为 RTT 的 ... --- armink,老大,我在使用SFUD的遇到了这样几个问题 rt_sfud_flash_probe 这个函数是探测FLASH型号,并返回一个设备指针 那么我在使用sfud_read 操作时,编译器报错,因为sfud_read的参数类型是const类型 下载了您提供的demo里面有一个裸机版的例程,里面有一个测试程序 测试程序sfud_get_device_table来获取 ``` static sfud_flash flash_table[] = SFUD_FLASH_DEVICE_TABLE; ``` ``` enum { SFUD_AT45_DEVICE_INDEX = 0, }; #define SFUD_FLASH_DEVICE_TABLE \ { \ [SFUD_AT45_DEVICE_INDEX] ={.name = "AT45DB321E", .spi.name = "SPI1"}, \ } ``` 这样可以指针指向这里的时候是没有flash容量数据的,会出现地址超出 如果我在上面加入芯片的chip,在进行读操作的时候,运行sfud_read_status的时候回死机
NikolaDi
2018-07-18
这家伙很懒,什么也没写!
SFUD 能读出 厂商ID,读出来也是正确的,SPI FLASH 也支持 SFDP ,为啥读出来的错误呢? SPI FLASH 用的是 IS25LP256D [attach]4313[/attach]
whj467467222
认证专家
2018-07-18
开源,分享,交流,共同进步
>SFUD 能读出 厂商ID,读出来也是正确的,SPI FLASH 也支持 SFDP ,为啥读出来的错误呢? >SPI FLASH 用的是 ... --- 我看了下SFUD提供支持的FLASH里面没有你这款,所以你需要自己添加 [https://github.com/armink/SFUD#25-%E6%B7%BB%E5%8A%A0%E5%BA%93%E7%9B%AE%E5%89%8D%E4%B8%8D%E6%94%AF%E6%8C%81%E7%9A%84-flash](如何添加库里没有的FLASH)
撰写答案
登录
注册新账号
关注者
0
被浏览
17.1k
关于作者
armink
这家伙很懒,什么也没写!
提问
7
回答
782
被采纳
23
关注TA
发私信
相关问题
1
SFUD怎么使用
2
请教大家一下关于 SFUD 的的问题
3
移植sfud
4
使用SFUD操作FLASH
5
env使用easyflash不是3.2.4版本,而且没有type插件?
6
新增了W25X32设备成功,无法格式化
7
easyflash随着数据存储量增加,耗费时间加长
8
关于SFDP的问题
9
spi nand flash 能使用SFUD驱动吗
10
裸机SFUD问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-thread 火星一号的http发送json的物联网控制程序
2
【24嵌入式设计大赛】基于RT-Thread VisionBoard开发板的多模态AI机器人------开箱篇
3
【24嵌入式设计大赛】基于rt-thread的嵌入式多设备协同控制
4
【24嵌入式设计大赛】基于HPM5300-EVK的简易嵌入式辅助调试装置
5
【24 嵌入式设计大赛】基于英飞凌 Psoc6-EvaluationKit-062S2+ WIFI模块的DMX512协议转换器
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
ota在线升级
WIZnet_W5500
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
rt_mq_消息队列_msg_queue
C++_cpp
at_device
MicroPython
ulog
本月问答贡献
踩姑娘的小蘑菇
5
个答案
2
次被采纳
张世争
8
个答案
1
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
rv666
7
个答案
1
次被采纳
zchong
6
个答案
1
次被采纳
本月文章贡献
Licy
3
篇文章
1
次点赞
jaffer
1
篇文章
5
次点赞
rtt_dmx
1
篇文章
5
次点赞
flytianya2010
1
篇文章
2
次点赞
BRICK PORTER
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部