硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2427|回复: 7
收起左侧

在片外W25Q64上面使用FileX

[复制链接]

14

主题

50

回帖

97

积分

初级会员

积分
97
发表于 2021-9-14 16:57:43 | 显示全部楼层 |阅读模式
摘要
         移植FileX的主要步骤是完成文件系统与底层介质的驱动的绑定。
介质特性介绍
介质类型:片外FLASH芯片
芯片型号:W25Q64JVSSI
容量大小:64Mbit-(8MByte)
扇区大小:4KByte-(同时也是最小擦除单位,共2048个扇区)
介质底层驱动函数
         介质的底层驱动需要包含MCU对应的IO初始化,同时因为FileX的读取是按扇区操作的,所以还需要编写对应的按扇区读/写函数。
FileX与介质接口函数
1、  在使用FileX前需要调用fx_system_initialize();初始化FileX;
2、  在使用FileX驱动一个介质时,需调用函数fx_media_open进行介质底层驱动与FileX的绑定,此函数入口函数包含了FileX与介质接口函数:
3、接口函数根据switch(media_ptr-> fx_media_driver_request)的请求,按照固定格式进行填充即可:
         3.1读取介质数据:
         
         3.2将数据写入介质:
         
         3.3 初始化介质底层驱动IO;
         3.4 读取介质BOOT区;
         3.5 写介质BOOT区;
调试记录FileX启动时对BOOT区内容判断
     底层驱动与接口函数都添加好后,编写了调试代码,增加一个测试任务,通过FileX打开W25Q64芯片,创建一个文件,向里面写入/读出数据。
     发现调用fx_media_open时返回的状态值错误,经过逐级仿真排查,发现启动FileX时会读取W25Q64中的BOOT区,判断510511索引处的值是否是0X55AA
  查阅FileX手册发现BOOT区的这个位置是FAT32格式的签名,启动FileX时先判断签名是否正确,如果不正确则认为格式不对,所以返回错误状态。
     因此,在第一次使用时需要先进行格式化处理,就跟内存卡一样的需要格式化成FAT32格式才能被FAT32的文件系统识别。
格式化W25Q64
      调用fx_media_format函数,结合接口函数和各个关键变量即可对介质进行初始化。这些关键变量的值要结合介质本身的物理特性,比如扇区大小W25Q644096Byte,扇区数量是2048
介质BOOT区大小设置
     在调用了格式化函数后,状态返回成功。接着调用打开介质函数,结果返回还是错误,仿真查看还是签名处的值不对。按道理格式化后会将签名写入介质的BOOT区,那么为什么不对呢?
     在仿真时查看BOOT区的数据,发现其他内容都正确,就是在索引510511处不是签名0X55AA的值,而签名的值被写入到了索引为40944095处了。经过查阅手册发现,签名会写入到BOOT区的最末端两个字节,而默认BOOT区的大小是一个扇区,也就是4096Byte,所以格式化时将签名写入索引为40944095处是正确的。
     但是矛盾的是,既然默认介质的BOOT区大小是一个扇区,那么当介质一个扇区大小不是512Byte时就无法打开介质,因为在打开介质时判断签名是否正确是固定读取介质BOOT区的510511处。这应该算是一个BUG
     明白了问题点后,只需要将介质BOOT区强制转换为512Byte即可。这需要在fx_api.h中声明#define FX_FORCE_512_BYTE_BOOT_SECTOR
介质读写测试
1、  打开介质,状态返回成功;
2、  创建一个测试文件"TEST.TXT",状态返回成功;
3、  打开"TEST.TXT"文件,状态返回成功;
4、  向该文件中写入28个字节:"ABCDEFGHIJKLMNOPQRSTUVWXYZ\n",状态返回成功;
5、  设置偏移量为2,状态返回成功;
6、  在偏移量为2基础上读取文件26个字节,状态返回成功;
7、  仿真查看读取到的内容是:"BCDEFGHIJKLMNOPQRSTUVWXYZ\n";
8、  在文件控制块中可以获取当前文件的偏移量、物理扇区号、总共占用扇区数量和文件大小等等信息,在编码时可按需读取使用。
总结使用FileX步骤:
1、调用fx_system_initialize();FileX进行初始化;
2、编写介质底层驱动函数;
3、结合介质底层驱动函数,编写接口驱动函数;
4、根据情况判断是否在打开介质前调用fx_media_format进行格式化;
5、调用打开fx_media_open介质;
6、可调用相关函数对介质进行读写。
介质的底层驱动函数主要包含3个:
1、底层驱动IO初始化;
2、按扇区读取介质;
3、按扇区写入介质。

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-9-15 10:06:22 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

4

主题

61

回帖

73

积分

初级会员

积分
73
QQ
发表于 2021-10-18 20:51:52 | 显示全部楼层
多谢分享!
回复

使用道具 举报

3

主题

6

回帖

15

积分

新手上路

积分
15
发表于 2022-1-14 18:04:11 | 显示全部楼层
楼主有参考代码吗,我调这个好多天了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2022-1-14 18:40:35 | 显示全部楼层
z940939971 发表于 2022-1-14 18:04
楼主有参考代码吗,我调这个好多天了

这个坛友分享过一个,参考下

STM32  F7 裸机移植NOR FLASH +  FileX + LevelX文件系统
https://www.armbbs.cn/forum.php? ... 8789&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

40

主题

113

回帖

233

积分

高级会员

积分
233
发表于 2022-1-19 23:09:08 | 显示全部楼层
请教个问题,想用filex必须先格式化吗?
回复

使用道具 举报

14

主题

50

回帖

97

积分

初级会员

积分
97
 楼主| 发表于 2022-3-9 11:11:32 | 显示全部楼层
yihang1004 发表于 2022-1-19 23:09
请教个问题,想用filex必须先格式化吗?

要格式化的
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-3-12 09:09:05 | 显示全部楼层
感谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 21:07 , Processed in 0.443243 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表