123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- -- ****************************************************************************
- --
- -- 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
|