nodemcu-firmware/lua_compat/spi_compat.lua

108 lines
2.5 KiB
Lua

-- ****************************************************************************
--
-- Compatability wrapper for mapping ESP8266's spi module API to ESP32
--
-- Usage:
--
-- spi = require("spi_compat")([pin_sclk], [pin_mosi], [pin_miso], [pin_cs])
--
-- pin_sclk: GPIO pin for SCLK, optional
-- pin_mosi: GPIO pin for MOSI, optional
-- pin_miso: GPIO pin for MISO, optional
-- pin_cs: GPIO pin for CS, optional
--
-- ****************************************************************************
local M = {}
local _pin_sclk, _pin_mosi, _pin_miso, _pin_cs
local _spi
local _duplex
local _device
-- ****************************************************************************
-- Implement esp8266 compatability API
--
function M.setup(id, mode, cpol, cpha, databits, clock_div, duplex_mode)
if databits ~= 8 then
error("only 8 bits per item supported")
end
local bus_master = _spi.master(_spi.HSPI, {sclk = _pin_sclk, mosi = _pin_mosi, miso = _pin_miso})
local dev_config = {}
dev_config.cs = _pin_cs
dev_config.mode = cpol * 2 + cpha
dev_config.freq = 80000000 / clock_div
_device = bus_master:device(dev_config)
_duplex = duplex_mode or M.HALFDUPLEX
end
function M.send(id, ...)
local results = {}
local wrote = 0
for idx = 1, select("#", ...) do
local arg = select(idx, ...)
if type(arg) == "number" then
table.insert(results, _device:transfer(string.char(arg)):byte(1))
wrote = wrote + 1
elseif type(arg) == "string" then
table.insert(results, _device:transfer(arg))
wrote = wrote + #arg
elseif type(arg) == "table" then
local rtab = {}
for i, data in ipairs(arg) do
table.insert(rtab, _device:transfer(string.char(data)):byte(1))
wrote = wrote + 1
end
table.insert(results, rtab)
else
error("wrong argument type")
end
end
if _duplex == M.FULLDUPLEX then
return wrote, unpack(results)
else
return wrote
end
end
function M.recv(id, size, default_data)
local def = default_data or 0xff
return _device:transfer(string.char(def):rep(size))
end
return function (pin_sclk, pin_mosi, pin_miso, pin_cs)
-- cache built-in module
_spi = spi
-- invalidate built-in module
spi = nil
-- forward unchanged functions
-- forward constant definitions
M.MASTER = 0
M.CPOL_LOW = 0
M.CPOL_HIGH = 1
M.CPHA_LOW = 0
M.CPHA_HIGH = 1
M.HALFDUPLEX = 0
M.FULLDUPLEX = 1
_pin_sclk = pin_sclk
_pin_mosi = pin_mosi
_pin_miso = pin_miso
_pin_cs = pin_cs
return M
end