--[[ @module LITTLE_FLASh_NAND @summary LITTLE_FLASh_NAND测试功能模块 @version 1.0 @date 2025.9.05 @author 马亚丹 @usage 本demo演示的功能为:使用Air8000核心板通过SPI库实现对 NAND Flash的操作,演示读数据写数据、删除数据等操作。 以 Air8000核心板为例, 接线如下: Air8000 AirSPINAND_1000配件版 GND(任意) GND VDD_EXT VCC GPIO12/SPI1_CS CS,片选 SPI1_SLK CLK,时钟 SPI1_MOSI DI,主机输出,从机输入 SPI1_MISO DO,主机输入,从机输出 --使用SPI1,硬件SPI CS接在gpio12上 运行核心逻辑: 1.以对象的方式配置参数,初始化启用SPI,返回SPI对象 2.用SPI对象初始化flash设备,返回flash设备对象 3.用lf库挂载flash设备对象为文件系统 4.读取文件系统的信息,以确认内存足够用于文件操作 5.操作文件读写,并验证写入一致性,追加文件等。 ]] -- SPI配置参数 local SPI_ID = 1 -- SPI总线ID,根据实际情况修改 local CS_PIN = 12 -- CS引脚,根据实际情况修改 local CPHA = 0 -- 时钟相位 local CPOL = 0 -- 时钟极性 local data_Width = 8 -- 数据宽度(位) local bandrate = 2*1000*1000 -- 波特率(Hz),初始化为2MHz -- 1. 以对象方式设置并启用 SPI,返回设备对象 local function spiDev_init_func() log.info("lf_fs", "SPI_ID", SPI_ID, "CS_PIN", CS_PIN) --以对象的方式初始化spi,高位在前,主模式,全双工模式 local spi_device = spi.deviceSetup(SPI_ID, CS_PIN, CPHA, CPOL, data_Width, bandrate, spi.MSB, 1, 0) log.info("硬件spi", "初始化,波特率:", spi_device, bandrate) if not spi_device then log.error("SPI初始化", "失败") return nil end log.info("SPI初始化", "成功,波特率:20MHz") return spi_device end -- 2. 初始化Flash设备,返回设备对象 local function init_flash_device(spi_device) log.info("Flash初始化", "开始") local flash_device = lf.init(spi_device) if not flash_device then log.error("Flash初始化", "失败") return nil end log.info("Flash初始化", "成功,设备:", flash_device) return flash_device end -- 3. 挂载文件系统 local function mount_filesystem(flash_device, mount_point) log.info("文件系统", "开始挂载:", mount_point) -- 检查是否支持挂载功能 if not lf.mount then log.error("文件系统", "lf模块不支持挂载功能") return false end -- 尝试挂载 local mount_ok = lf.mount(flash_device, mount_point) if not mount_ok then log.warn("文件系统lf", "挂载失败,尝试重新挂载...") mount_ok = lf.mount(flash_device, mount_point) if not mount_ok then log.error("文件系统", "仍挂载失败") return false end end log.info("文件系统", "挂载成功:", mount_point) return true end -- 4. 打印文件系统信息 local function print_filesystem_info(mount_point) log.info("文件系统信息", "开始查询:", mount_point) -- 获取文件系统详细信息,总块数/已用块数等 local ok, total_blocks, used_blocks, block_size, fs_type = fs.fsstat(mount_point) if ok then log.info(" 总block数:", total_blocks) log.info(" 已用block数:", used_blocks) log.info(" block大小:", block_size, "字节") log.info(" 文件系统类型:", fs_type) else log.warn(" 无法获取详细信息") end end -- 5. 执行文件操作测试 local function test_file_operations(mount_point) log.info("文件操作测试", "开始") -- 测试写入文件 local test_file = mount_point .. "/test.txt" local f, err = io.open(test_file, "w") if not f then log.error(" 写入失败", test_file, "错误:", err) return false end local write_data = "当前时间: " .. os.date() f:write(write_data) f:close() log.info(" 写入成功", test_file, "内容:", write_data) -- 测试读取文件 local read_data, read_err = io.readFile(test_file) if not read_data then log.error(" 读取失败", test_file, "错误:", read_err) return false end log.info(" 读取成功", test_file, "内容:", read_data) -- 验证内容一致性 if read_data ~= write_data then log.warn(" 内容不一致", "写入:", write_data, "读取:", read_data) end -- 测试文件追加 local append_file = mount_point .. "/append.txt" os.remove(append_file) -- 清除旧文件 io.writeFile(append_file, "LuatOS 测试") -- 初始写入 local f_append, append_err = io.open(append_file, "a+") if not f_append then log.error(" 追加失败", append_file, "错误:", append_err) return false end local append_data = " - 追加时间: " .. os.date() f_append:write(append_data) -- 执行完操作后,一定要关掉文件 f_append:close() local final_data = io.readFile(append_file) log.info(" 追加后内容:", final_data) log.info("文件操作测试", "完成") return true end -- 7. 关闭SPI设备,成功返回0 local function spi_close_func() log.info("关闭spi", spi_device:close()) end -- 主任务函数:按流程调用各功能函数 local function spinand_test_func() --1.判断SPI初始化 spi_device = spiDev_init_func() if not spi_device then log.error("主流程", "SPI初始化失败,终止") return end -- 流程2:初始化Flash设备 local flash_device = init_flash_device(spi_device) if not flash_device then log.error("主流程", "Flash初始化失败,终止") return end -- 流程3:挂载文件系统 local mount_point = "/little_flash" if not mount_filesystem(flash_device, mount_point) then log.error("主流程", "文件系统挂载失败,终止") return end -- 流程4:打印文件系统信息 print_filesystem_info(mount_point) -- 流程5:执行文件操作测试 if not test_file_operations(mount_point) then log.warn("主流程", "文件操作测试部分失败") end -- 6.关闭SPI设备 spi_close_func() end sys.taskInit(spinand_test_func)