sfud_test.lua 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. --[[
  2. 0@module sfud_test
  3. @summary sfud_test测试功能模块
  4. @version 1.0
  5. @date 2025.10.11
  6. @author 马亚丹
  7. @usage
  8. 本demo演示的功能为:使用Air8101核心板通过SPI核心库/sfud核心库实现对 NOR Flash的操作,演示读数据写数据、删除数据等操作。
  9. 以Air8101核心板为例, 接线如下:
  10. Air8101核心板 AirSPINORFLASH_1000配件版
  11. GND(任意) GND
  12. 3.3V VCC
  13. SPI0_CS/p44/GPIO22 CS
  14. SPI0_SCK/p28/GPIO14 CLK
  15. SPI0_MOSI/p57/GPIO16 MOSI
  16. SPI0_MISO/p55/GPIO17 MISO
  17. 使用SPI0,硬件SPI CS接在gpio15上
  18. 运行核心逻辑:
  19. 1.以对象的方式配置参数,初始化启用SPI,返回SPI对象
  20. 2.用SPI对象初始化sfud,
  21. 3.用sfud库挂载flash设备为FatFS文件系统
  22. 4.读取文件系统的信息
  23. 5.操作文件读写,擦除,并验证写入一致性,追加文件等。
  24. ]]
  25. -- SPI配置参数
  26. local SPI_ID = 0 -- SPI总线ID,根据实际情况修改
  27. local CS_PIN = 15 -- CS引脚,根据实际情况修改
  28. local CPHA = 0 -- 时钟相位
  29. local CPOL = 0 -- 时钟极性
  30. local data_Width = 8 -- 数据宽度(位)
  31. local bandrate = 4*1000*1000 -- 波特率(Hz),初始化为4MHz,8101最低支持4M
  32. gpio.setup(13, 1) --air8101模组,gpio13控制ldo输出3.3v
  33. -- flash操作起始地址(示例值,需根据需求调整)
  34. local erase_addr = 4096
  35. -- 擦除数据的大小(示例值,需匹配 Flash block 大小)
  36. local erase_size = 4096
  37. --需要操作的数据(示例值,需根据需求调整)
  38. local data = "testdata"
  39. -- 1. 以对象方式设置并启用 SPI,返回设备对象
  40. local function spiDev_init_func()
  41. log.info("sfud", "SPI_ID", SPI_ID, "CS_PIN", CS_PIN)
  42. --以对象的方式初始化spi,高位在前,主模式,半双工模式
  43. --spi flash只支持半双工模式
  44. spi_device = spi.deviceSetup(SPI_ID, CS_PIN, CPHA, CPOL, data_Width, bandrate, spi.MSB, 1, 0)
  45. log.info("硬件spi", "初始化,波特率:", spi_device, bandrate)
  46. if not spi_device then
  47. log.error("SPI初始化", "失败")
  48. return nil
  49. end
  50. log.info("SPI初始化", "成功,波特率:",bandrate)
  51. return spi_device
  52. end
  53. -- 2. 初始化Flash设备,返回设备对象
  54. local function init_sfud_device(spi_device)
  55. log.info("sfud初始化", "开始")
  56. local sfud_flash_device = sfud.init(spi_device)
  57. if not sfud_flash_device then
  58. log.error("Flash初始化", "失败")
  59. else
  60. return true
  61. end
  62. end
  63. -- 3. 挂载文件系统
  64. local function mount_filesystem(sfud_device, mount_point)
  65. log.info("文件系统", "开始挂载:", mount_point)
  66. -- 检查是否支持挂载功能
  67. if not sfud.mount then
  68. log.error("文件系统", "不支持挂载功能")
  69. return false
  70. end
  71. -- 尝试挂载
  72. local mount_ok = sfud.mount(sfud_device, mount_point)
  73. if not mount_ok then
  74. log.warn("文件系统", "挂载失败,尝试重新挂载...")
  75. mount_ok = sfud.mount(sfud_device, mount_point)
  76. if not mount_ok then
  77. log.error("文件系统", "仍挂载失败")
  78. return false
  79. end
  80. end
  81. log.info("文件系统", "挂载成功:", mount_point)
  82. return true
  83. end
  84. -- 4. 打印文件系统信息
  85. local function print_filesystem_info(mount_point)
  86. log.info("文件系统信息", "开始查询:", mount_point)
  87. -- 获取文件系统详细信息,总块数/已用块数等
  88. local ok, total_blocks, used_blocks, block_size, fs_type = io.fsstat(mount_point)
  89. if ok then
  90. log.info(" 总block数:", total_blocks)
  91. log.info(" 已用block数:", used_blocks)
  92. log.info(" block大小:", block_size, "字节")
  93. log.info(" 文件系统类型:", fs_type)
  94. else
  95. log.warn(" 无法获取详细信息")
  96. end
  97. end
  98. -- 5. 执行文件操作测试
  99. local function test_file_operations(mount_point)
  100. log.info("文件操作测试", "开始")
  101. -- 测试写入文件
  102. local test_file = mount_point .. "/test.txt"
  103. local f, err = io.open(test_file, "w")
  104. if not f then
  105. log.error(" 写入失败", test_file, "错误:", err)
  106. return false
  107. end
  108. local write_data = "当前时间: " .. os.date()
  109. f:write(write_data)
  110. f:close()
  111. log.info(" 写入成功", test_file, "内容:", write_data)
  112. -- 测试读取文件
  113. local read_data, read_err = io.readFile(test_file)
  114. if not read_data then
  115. log.error(" 读取失败", test_file, "错误:", read_err)
  116. return false
  117. end
  118. log.info(" 读取成功", test_file, "内容:", read_data)
  119. -- 验证内容一致性
  120. if read_data ~= write_data then
  121. log.warn(" 内容不一致", "写入:", write_data, "读取:", read_data)
  122. end
  123. -- 测试文件追加
  124. local append_file = mount_point .. "/append.txt"
  125. os.remove(append_file) -- 清除旧文件
  126. io.writeFile(append_file, "LuatOS 测试") -- 初始写入
  127. local f_append, append_err = io.open(append_file, "a+")
  128. if not f_append then
  129. log.error(" 追加失败", append_file, "错误:", append_err)
  130. return false
  131. end
  132. local append_data = " - 追加时间: " .. os.date()
  133. f_append:write(append_data)
  134. -- 执行完操作后,一定要关掉文件
  135. f_append:close()
  136. local final_data = io.readFile(append_file)
  137. log.info(" 追加后内容:", final_data)
  138. log.info("文件操作测试", "完成")
  139. return true
  140. end
  141. -- 7. 关闭SPI设备,成功返回0
  142. local function spi_close_func()
  143. log.info("关闭spi", spi_device:close())
  144. end
  145. -- 主任务函数:按流程调用各功能函数
  146. local function spinor_test_func()
  147. --1.判断SPI初始化
  148. spi_device = spiDev_init_func()
  149. if not spi_device then
  150. log.error("主流程", "SPI初始化失败,终止")
  151. spi_close_func()
  152. return
  153. end
  154. -- 流程2:初始化sfud设备
  155. local sfud_init = init_sfud_device(spi_device)
  156. if not sfud_init then
  157. log.error("主流程", "sfud 初始化失败,终止")
  158. spi_close_func()
  159. return
  160. end
  161. -- 流程3:获取Flash设备,并进行数据擦除、读写操作
  162. local sfud_device = sfud.getDeviceTable()
  163. log.info("获取flash设备信息表:", sfud_device)
  164. log.info("获取 Flash 容量和page大小:", sfud.getInfo(sfud_device))
  165. log.info("擦除一个块的数据:", sfud.erase(sfud_device, erase_addr, erase_size))
  166. log.info("写入数据:", sfud.write(sfud_device, erase_addr, data))
  167. log.info("读取数据:", sfud.read(sfud_device, erase_addr, erase_size ))
  168. log.info("先擦除再写入数据:", sfud.eraseWrite(sfud_device, erase_addr, data))
  169. --sys.wait (1000)
  170. -- 流程4:挂载flash为文件系统
  171. local mount_point = "/sfud_flash"
  172. if not mount_filesystem(sfud_device, mount_point) then
  173. log.error("主流程", "文件系统挂载失败,终止")
  174. spi_close_func()
  175. return
  176. end
  177. -- 流程5:打印文件系统信息
  178. print_filesystem_info(mount_point)
  179. -- 流程6:执行文件操作测试
  180. if not test_file_operations(mount_point) then
  181. log.warn("主流程", "文件操作测试部分失败")
  182. end
  183. -- 流程7:关闭SPI设备
  184. spi_close_func()
  185. end
  186. sys.taskInit(spinor_test_func)