lf_fs.lua 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. --[[
  2. @module lf_fs
  3. @summary lf_fs测试功能模块
  4. @version 1.0
  5. @date 2025.9.05
  6. @author 马亚丹
  7. @usage
  8. 本demo演示的功能为:使用Air8000核心板通过SPI核心库/lf核心库/io核心库实现对 NAND Flash的操作,演示读数据写数据、删除数据等操作。
  9. 以 Air8000核心板为例, 接线如下:
  10. Air8000 lf_fs配件版
  11. GND(任意) GND
  12. VDD_EXT VCC
  13. GPIO12/SPI1_CS CS,片选
  14. SPI1_SLK CLK,时钟
  15. SPI1_MOSI DI,主机输出,从机输入
  16. SPI1_MISO DO,主机输入,从机输出
  17. --使用SPI1,硬件SPI CS接在gpio12上
  18. 运行核心逻辑:
  19. 1.以对象的方式配置参数,初始化启用SPI,返回SPI对象
  20. 2.用SPI对象初始化flash设备,返回flash设备对象
  21. 3.用lf库挂载flash设备对象为LittleFS文件系统
  22. 4.读取文件系统的信息,以确认内存情况
  23. 5.操作文件读写,并验证写入一致性,追加文件等。
  24. ]]
  25. -- SPI配置参数
  26. local SPI_ID = 1 -- SPI总线ID,根据实际情况修改
  27. local CS_PIN = 12 -- CS引脚,根据实际情况修改
  28. local CPHA = 0 -- 时钟相位
  29. local CPOL = 0 -- 时钟极性
  30. local data_Width = 8 -- 数据宽度(位)
  31. local bandrate = 2*1000*1000 -- 波特率(Hz),初始化为2MHz
  32. -- 1. 以对象方式设置并启用 SPI,返回设备对象
  33. local function spiDev_init_func()
  34. log.info("lf_fs", "SPI_ID", SPI_ID, "CS_PIN", CS_PIN)
  35. --以对象的方式初始化spi,高位在前,主模式,全双工模式
  36. local spi_device = spi.deviceSetup(SPI_ID, CS_PIN, CPHA, CPOL, data_Width, bandrate, spi.MSB, 1, 0)
  37. log.info("硬件spi", "初始化,波特率:", spi_device, bandrate)
  38. if not spi_device then
  39. log.error("SPI初始化", "失败")
  40. return nil
  41. end
  42. log.info("SPI初始化", "成功,波特率",bandrate)
  43. return spi_device
  44. end
  45. -- 2. 初始化Flash设备,返回设备对象
  46. local function init_flash_device(spi_device)
  47. log.info("Flash初始化", "开始")
  48. local flash_device = lf.init(spi_device)
  49. if not flash_device then
  50. log.error("Flash初始化", "失败")
  51. return nil
  52. end
  53. log.info("Flash初始化", "成功,设备:", flash_device)
  54. return flash_device
  55. end
  56. -- 3. 挂载文件系统
  57. local function mount_filesystem(flash_device, mount_point)
  58. log.info("文件系统", "开始挂载:", mount_point)
  59. -- 检查是否支持挂载功能
  60. if not lf.mount then
  61. log.error("文件系统", "lf模块不支持挂载功能")
  62. return false
  63. end
  64. -- 尝试挂载
  65. local mount_ok = lf.mount(flash_device, mount_point)
  66. if not mount_ok then
  67. log.warn("文件系统lf", "挂载失败,尝试重新挂载...")
  68. mount_ok = lf.mount(flash_device, mount_point)
  69. if not mount_ok then
  70. log.error("文件系统", "仍挂载失败")
  71. return false
  72. end
  73. end
  74. log.info("文件系统", "挂载成功:", mount_point)
  75. return true
  76. end
  77. -- 4. 打印文件系统信息
  78. local function print_filesystem_info(mount_point)
  79. log.info("文件系统信息", "开始查询:", mount_point)
  80. -- 获取文件系统详细信息,总块数/已用块数等
  81. local ok, total_blocks, used_blocks, block_size, fs_type = fs.fsstat(mount_point)
  82. if ok then
  83. log.info(" 总block数:", total_blocks)
  84. log.info(" 已用block数:", used_blocks)
  85. log.info(" block大小:", block_size, "字节")
  86. log.info(" 文件系统类型:", fs_type)
  87. else
  88. log.warn(" 无法获取详细信息")
  89. end
  90. end
  91. -- 5. 执行文件操作测试
  92. local function test_file_operations(mount_point)
  93. log.info("文件操作测试", "开始")
  94. -- 测试写入文件
  95. local test_file = mount_point .. "/test.txt"
  96. local f, err = io.open(test_file, "w")
  97. if not f then
  98. log.error(" 写入失败", test_file, "错误:", err)
  99. return false
  100. end
  101. local write_data = "当前时间: " .. os.date()
  102. f:write(write_data)
  103. f:close()
  104. log.info(" 写入成功", test_file, "内容:", write_data)
  105. -- 测试读取文件
  106. local read_data, read_err = io.readFile(test_file)
  107. if not read_data then
  108. log.error(" 读取失败", test_file, "错误:", read_err)
  109. return false
  110. end
  111. log.info(" 读取成功", test_file, "内容:", read_data)
  112. -- 验证内容一致性
  113. if read_data ~= write_data then
  114. log.warn(" 内容不一致", "写入:", write_data, "读取:", read_data)
  115. end
  116. -- 测试文件追加
  117. local append_file = mount_point .. "/append.txt"
  118. os.remove(append_file) -- 清除旧文件
  119. io.writeFile(append_file, "LuatOS 测试") -- 初始写入
  120. local f_append, append_err = io.open(append_file, "a+")
  121. if not f_append then
  122. log.error(" 追加失败", append_file, "错误:", append_err)
  123. return false
  124. end
  125. local append_data = " - 追加时间: " .. os.date()
  126. f_append:write(append_data)
  127. -- 执行完操作后,一定要关掉文件
  128. f_append:close()
  129. local final_data = io.readFile(append_file)
  130. log.info(" 追加后内容:", final_data)
  131. log.info("文件操作测试", "完成")
  132. return true
  133. end
  134. -- 7. 关闭SPI设备,成功返回0
  135. local function spi_close_func()
  136. log.info("关闭spi", spi_device:close())
  137. end
  138. -- 主任务函数:按流程调用各功能函数
  139. local function spinand_test_func()
  140. --1.判断SPI初始化
  141. spi_device = spiDev_init_func()
  142. if not spi_device then
  143. log.error("主流程", "SPI初始化失败,终止")
  144. return
  145. end
  146. -- 流程2:初始化Flash设备
  147. local flash_device = init_flash_device(spi_device)
  148. if not flash_device then
  149. log.error("主流程", "Flash初始化失败,终止")
  150. spi_close_func()
  151. return
  152. end
  153. -- 流程3:挂载文件系统
  154. local mount_point = "/little_flash"
  155. if not mount_filesystem(flash_device, mount_point) then
  156. log.error("主流程", "文件系统挂载失败,终止")
  157. spi_close_func()
  158. return
  159. end
  160. -- 流程4:打印文件系统信息
  161. print_filesystem_info(mount_point)
  162. -- 流程5:执行文件操作测试
  163. if not test_file_operations(mount_point) then
  164. log.warn("主流程", "文件操作测试部分失败")
  165. end
  166. -- 6.关闭SPI设备
  167. spi_close_func()
  168. end
  169. sys.taskInit(spinand_test_func)