108 lines
2.5 KiB
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
|