spi_compat.lua 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. -- ****************************************************************************
  2. --
  3. -- Compatability wrapper for mapping ESP8266's spi module API to ESP32
  4. --
  5. -- Usage:
  6. --
  7. -- spi = require("spi_compat")([pin_sclk], [pin_mosi], [pin_miso], [pin_cs])
  8. --
  9. -- pin_sclk: GPIO pin for SCLK, optional
  10. -- pin_mosi: GPIO pin for MOSI, optional
  11. -- pin_miso: GPIO pin for MISO, optional
  12. -- pin_cs: GPIO pin for CS, optional
  13. --
  14. -- ****************************************************************************
  15. local M = {}
  16. local _pin_sclk, _pin_mosi, _pin_miso, _pin_cs
  17. local _spi
  18. local _duplex
  19. local _device
  20. -- ****************************************************************************
  21. -- Implement esp8266 compatability API
  22. --
  23. function M.setup(id, mode, cpol, cpha, databits, clock_div, duplex_mode)
  24. if databits ~= 8 then
  25. error("only 8 bits per item supported")
  26. end
  27. local bus_master = _spi.master(_spi.HSPI, {sclk = _pin_sclk, mosi = _pin_mosi, miso = _pin_miso})
  28. local dev_config = {}
  29. dev_config.cs = _pin_cs
  30. dev_config.mode = cpol * 2 + cpha
  31. dev_config.freq = 80000000 / clock_div
  32. _device = bus_master:device(dev_config)
  33. _duplex = duplex_mode or M.HALFDUPLEX
  34. end
  35. function M.send(id, ...)
  36. local results = {}
  37. local wrote = 0
  38. for idx = 1, select("#", ...) do
  39. local arg = select(idx, ...)
  40. if type(arg) == "number" then
  41. table.insert(results, _device:transfer(string.char(arg)):byte(1))
  42. wrote = wrote + 1
  43. elseif type(arg) == "string" then
  44. table.insert(results, _device:transfer(arg))
  45. wrote = wrote + #arg
  46. elseif type(arg) == "table" then
  47. local rtab = {}
  48. for i, data in ipairs(arg) do
  49. table.insert(rtab, _device:transfer(string.char(data)):byte(1))
  50. wrote = wrote + 1
  51. end
  52. table.insert(results, rtab)
  53. else
  54. error("wrong argument type")
  55. end
  56. end
  57. if _duplex == M.FULLDUPLEX then
  58. return wrote, unpack(results)
  59. else
  60. return wrote
  61. end
  62. end
  63. function M.recv(id, size, default_data)
  64. local def = default_data or 0xff
  65. return _device:transfer(string.char(def):rep(size))
  66. end
  67. return function (pin_sclk, pin_mosi, pin_miso, pin_cs)
  68. -- cache built-in module
  69. _spi = spi
  70. -- invalidate built-in module
  71. spi = nil
  72. -- forward unchanged functions
  73. -- forward constant definitions
  74. M.MASTER = 0
  75. M.CPOL_LOW = 0
  76. M.CPOL_HIGH = 1
  77. M.CPHA_LOW = 0
  78. M.CPHA_HIGH = 1
  79. M.HALFDUPLEX = 0
  80. M.FULLDUPLEX = 1
  81. _pin_sclk = pin_sclk
  82. _pin_mosi = pin_mosi
  83. _pin_miso = pin_miso
  84. _pin_cs = pin_cs
  85. return M
  86. end