Luat读写SD卡/TF卡,通过fatfs模块

高能预警

当前版本 v0034 还没有内置fatfs的, 这里用的是自定义lod文件

update: 2019-06-18 更新到0034底层,并提供编译好的lod

代码预览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pmd.ldoset(6,pmd.LDO_VMMC) -- 必须打开供电
--fatfs.debug() -- 调试模式,会打印很多日志,帮助排错
fatfs.init() -- 初始化, 默认连接SPI_1, 片选是GPIO3
local fsm, err = fatfs.getfree() -- 获取磁盘信息
if fsm ~= nil then
log.info("FatFS","Total", tostring(fsm.total_kb) .. "kb", tostring(fsm.total_kb/1024) .. "mb")
log.info("FatFS","Free", tostring(fsm.free_kb) .. "kb", tostring(fsm.free_kb/1024) .. "mb")
end
-- 读取文件
local re, cnt, msg = fatfs.readfile("lua.txt")
if cnt ~= nil then
log.info("FatFS", "lua.txt", "content ---> ", cnt);
end
-- 播放mp3目录下的sms.mp3文件
--fatfs.playmp3("/mp3/sms.mp3")

如何做到的?

先列一下前提和已知条件:

  1. SD卡(或者常用的小卡, TF卡),是支持SPI方式进行访问的,但比SDIO模式慢
  2. Air202/Air268/Air168/Air800均提供了SPI功能,而且性能还不错
  3. FAT16/FAT32可以通过fatfs进行访问,对接底层需要实现几个基础方法

把关键点逐个击破

使用的硬件

接线:

Air800 M4 TF模块 说明
5V VCC 供电
GND GND
SPI1_SCL/GPIO_8 SCL 时钟
SPI1_MISO/GPIO_12 SDI 数据输入
SPI1_MOSI/GPIO_11 SDO 数据输出
GPIO_3 CS 片选,不要错(可配置)

如何使用

已经支持的API

方法名 用途
mount 初始化,必须调用一次且仅一次
getfree 获取空间信息,在mount之后调用
unmount 取消挂载,通常不需要调用
mkfs 格式化SD/TF卡
debug 调试模式,如果发现bug,请开启之,不需要传参数
lsdir 列出目录下的文件
mkdir 创建目录
stat 获取文件/文件夹信息
open 打开文件,返回举报
read 使用句柄读取文件数据
write 使用句柄写入文件数据
seek 移动句柄指针
close 关闭文件句柄
unlink 删除文件/文件夹
rename 文件改名
readfile 直接读取文件内容,简易方法
playmp3 播放sd卡上的mp3文件

固件里面到底改了什么?

如果你看到这里,应该是的确有心用SD卡了,那么我需要澄清几个问题:

  1. 并不变砖, 虽然我刷挂了一块板子, 原因是选错了lod, 而不是因为fatfs. 编译目录里面有2个lod文件, 一大一小, 刷小的会挂(这点比较坑).
  2. fatfs对源码的修改并不大, 只是添加一个库,并引用它 源码级别的引用 , 并没有去修改其他模块的代码, 也不会影响其他模块的功能
  3. 同样的修改可以应用到老的lod源码, 独立性很强的

修改的内容(注意文件编码,都是GB2312):

  1. 添加 cust_src/elua/lib/fatfs 目录, 所有实现代码都在这里
  2. 修改 cust_src/cust_module_list.mk 添加对fatfs目录编译引用
    1
    2
    // 在末尾添加
    LOCAL_MODULE_DEPENDS += cust_src/elua/lib/fatfs
  3. 修改 cust_src/elua/modules/include/auxmods.h
    1
    2
    3
    // 在125行附近添加, 是新建2行, 前后都要加空行
    #define AUXLIB_FATFS "fatfs"
    LUALIB_API int ( luaopen_fatfs )( lua_State *L );
  4. 修改 cust_src/elua/platform/coolsand/include/platform_conf.h
1
2
3
// 在141行加入,前后不要加空行!!! 注意末尾的斜杠!!
_ROM( AUXLIB_FATFS, luaopen_fatfs, fatfs_map ) \

是的,就修改这4个地方, 没有对其他模块进行修改的.

fatfs库的源码是怎么实现的

还有什么不足

嗯,大概就是这样,希望大家喜欢这个fatfs模块

上次更新 2021-01-28