sfud_test.lua 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. --[[
  2. @module sfud_test
  3. @summary sfud_test测试功能模块
  4. @version 1.0
  5. @date 2025.07.01
  6. @author 孟伟
  7. @usage
  8. 本demo演示的功能为:使用Air780EHM核心板通过SFUD库实现对SPI Flash的高效操作,并可以挂载sfud lfs文件系统,通过文件系统相关接口去操作sfud lfs文件系统中的文件,并演示文件的读写、删除、追加等操作。
  9. 以 Air780EHM核心板为例, 接线如下:
  10. Air780EHM SPI_FLASH
  11. GND(任意) GND
  12. VDD_EXT VCC
  13. GPIO8/SPI0_CS CS,片选
  14. SPI0_SLK CLK,时钟
  15. SPI0_MOSI DI,主机输出,从机输入
  16. SPI0_MISO DO,主机输入,从机输出
  17. ]]
  18. --使用SPI0,CS接在gpio8上
  19. local spi_id,pin_cs = 0,8
  20. function sfud_test_func()
  21. sys.wait(1000)
  22. log.info("sfud", "SPI", spi_id, "CS PIN", pin_cs)
  23. --以对象的方式初始化spi_flash
  24. spi_flash = spi.deviceSetup(spi_id,pin_cs,0,0,8,20*1000*1000,spi.MSB,1,0)
  25. log.info("sfud", "spi_flash", spi_flash)
  26. --初始化sfud,并判断初始化结果
  27. local ret = sfud.init(spi_flash)
  28. if ret then
  29. log.info("sfud.init ok")
  30. else
  31. log.info("sfud.init Error")
  32. return
  33. end
  34. --获取flash设备信息表中的设备总数
  35. log.info("sfud.getDeviceNum",sfud.getDeviceNum())
  36. --获取flash设备信息表
  37. local sfud_device = sfud.getDeviceTable()
  38. --判断是否支持sfud.getInfo接口,支持的话获取 Flash 容量和page大小
  39. if sfud.getInfo then
  40. log.info("sfud.getInfo", sfud.getInfo(sfud_device))
  41. end
  42. --定义两个变量,用来控制是通过sfud接口来操作flash还是挂载为sfud lfs文件系统。也可以同时使用两种方式,不过要注意同时使用时flash地址和挂载时的偏移量需要设计好
  43. local test_sfud_raw = true
  44. local test_sfud_mount = false
  45. --通过sfud接口对flash进行写入和读取操作
  46. if test_sfud_raw then
  47. local test_str = "luatos-sfud1234567890123456789012345678901234567890"
  48. log.info("sfud.eraseWrite",sfud.eraseWrite(sfud_device,1024,test_str))
  49. local read_str = sfud.read(sfud_device,1024,#test_str)
  50. if test_str == read_str then
  51. log.info("sfud 写入与读取数据成功")
  52. else
  53. log.info("sfud 写入与读取数据失败")
  54. end
  55. end
  56. --挂载为sfud lfs文件系统,通过文件系统相关接口去操作sfud lfs文件系统中的文件,并演示文件的读写、删除、追加等操作。
  57. if test_sfud_mount then
  58. --挂载sfud lfs文件系统
  59. local ret = sfud.mount(sfud_device,"/sfud")
  60. log.info("sfud.mount", ret)
  61. if ret then
  62. log.info("sfud", "挂载成功")
  63. log.info("fsstat", fs.fsstat("/sfud"))
  64. -- 挂载成功后,可以像操作文件一样操作
  65. local f = io.open("/sfud/test", "w")
  66. local write_str = os.date()
  67. log.info("/sfud/test文件写入数据",write_str)
  68. --写入当前时间到文件中
  69. f:write(write_str)
  70. --关闭文件
  71. f:close()
  72. --读取文件内容并打印
  73. local read_str = io.readFile("/sfud/test")
  74. log.info("sfud_lfs read", read_str)
  75. if read_str == write_str then
  76. log.info("写入测试成功,写入字符串与读出字符串一样")
  77. else
  78. log.info("写入测试失败,写入字符串与读出字符串不一样")
  79. end
  80. -- 文件追加
  81. --文件追加测试写入之前先删除一下
  82. os.remove("/sfud/test2")
  83. --将"LuatOS"字符串写入到test2文件中
  84. io.writeFile("/sfud/test2", "LuatOS-")
  85. --以追加的方式打开test2文件
  86. local f = io.open("/sfud/test2", "a+")
  87. local time_str = os.date()
  88. f:write(time_str)
  89. write_str = "LuatOS-"..time_str
  90. log.info("/sfud/test2",write_str)
  91. --关闭文件
  92. f:close()
  93. read_str = io.readFile("/sfud/test2")
  94. log.info("sfud read", read_str)
  95. if write_str == read_str then
  96. log.info("追加测试成功,写入字符串与读出字符串一样")
  97. else
  98. log.info("追加测试失败,写入字符串与读出字符串不一样")
  99. end
  100. else
  101. log.info("sfud", "挂载失败")
  102. end
  103. end
  104. end
  105. --创建并且启动一个task
  106. --运行这个task的主函数sfud_test_func
  107. sys.taskInit(sfud_test_func)