摘要 移植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区,判断510和511索引处的值是否是0X55AA: 查阅FileX手册发现BOOT区的这个位置是FAT32格式的签名,启动FileX时先判断签名是否正确,如果不正确则认为格式不对,所以返回错误状态。 因此,在第一次使用时需要先进行格式化处理,就跟内存卡一样的需要格式化成FAT32格式才能被FAT32的文件系统识别。 格式化W25Q64 调用fx_media_format函数,结合接口函数和各个关键变量即可对介质进行初始化。这些关键变量的值要结合介质本身的物理特性,比如扇区大小W25Q64是4096Byte,扇区数量是2048: 介质BOOT区大小设置 在调用了格式化函数后,状态返回成功。接着调用打开介质函数,结果返回还是错误,仿真查看还是签名处的值不对。按道理格式化后会将签名写入介质的BOOT区,那么为什么不对呢? 在仿真时查看BOOT区的数据,发现其他内容都正确,就是在索引510和511处不是签名0X55AA的值,而签名的值被写入到了索引为4094和4095处了。经过查阅手册发现,签名会写入到BOOT区的最末端两个字节,而默认BOOT区的大小是一个扇区,也就是4096Byte,所以格式化时将签名写入索引为4094和4095处是正确的。 但是矛盾的是,既然默认介质的BOOT区大小是一个扇区,那么当介质一个扇区大小不是512Byte时就无法打开介质,因为在打开介质时判断签名是否正确是固定读取介质BOOT区的510和511处。这应该算是一个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、按扇区写入介质。
|