From 3273668e2cf398d5ccceb9a3b864ad7ebfb1ec61 Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Sat, 24 Oct 2020 19:31:35 +0100 Subject: [PATCH] i2c: improve and use utility wrapper --- cap1188/cap1188.lua | 20 ++++++-------------- ht16k33/ht16k33.lua | 22 +++------------------- util/i2cu.lua | 35 +++++++++++++++++++++++++---------- 3 files changed, 34 insertions(+), 43 deletions(-) diff --git a/cap1188/cap1188.lua b/cap1188/cap1188.lua index 5893c63..1a33924 100644 --- a/cap1188/cap1188.lua +++ b/cap1188/cap1188.lua @@ -1,27 +1,19 @@ --- DEPENDS: i2c +-- DEPENDS: i2c, i2cu -- cap1188 based heavily on adafruit's documentation and code as well as the -- device datasheet. Unsurprising, really, esp. that it's their breakout. local self = {} +self.bus = 0 self.addr = 0x29 +local i2cu = require "i2cu" + function self:rr(r) - i2c.start(0) - if not i2c.address(0, self.addr, i2c.TRANSMITTER) then i2c.stop(0) return nil end - i2c.write(0,r) - i2c.start(0) - i2c.address(0,0x29,i2c.RECEIVER) - local x = i2c.read(0,1) - i2c.stop(0) + local x = i2cu.wr(self.bus, self.addr, 1, r) return x:byte(1) end function self:wr(r,v) - i2c.start(0) - if not i2c.address(0, self.addr, i2c.TRANSMITTER) then i2c.stop(0) return nil end - i2c.write(0,r) - i2c.write(0,v) - i2c.stop(0) - return true + return i2cu.writen(self.bus, self.addr, r, v) end function self:mr(r,f) local n = f(self:rr(r)) ; self:wr(r,n); return n end diff --git a/ht16k33/ht16k33.lua b/ht16k33/ht16k33.lua index 3f5239f..92d5ba6 100644 --- a/ht16k33/ht16k33.lua +++ b/ht16k33/ht16k33.lua @@ -2,25 +2,9 @@ local M = {} -local function tx(self, ...) - local i2c, bus, addr = i2c, self.bus, self.addr - i2c.start(bus) - i2c.address(bus, addr, i2c.TRANSMITTER) - i2c.write(bus, ...) - i2c.stop(bus) -end - -local function txrx(self, w, rn) - local i2c, bus, addr = i2c, self.bus, self.addr - i2c.start(bus) - i2c.address(bus, addr, i2c.TRANSMITTER) - i2c.write(bus, w) - i2c.start(bus) - i2c.address(bus, addr, i2c.TRANSMITTER) - local ret = i2c.read(rn) - i2c.stop(bus) - return ret -end +local i2cu = require "i2cu" +local function tx (self, ...) return i2cu.writen(self.bus, self.addr, ... ) end +local function txrx(self, w, rn) return i2cu.wr (self.bus, self.addr, rn, w) end -- control the primary oscillator local function osc(self,on) diff --git a/util/i2cu.lua b/util/i2cu.lua index a7e3fd9..3a59f1d 100644 --- a/util/i2cu.lua +++ b/util/i2cu.lua @@ -1,19 +1,34 @@ local self = {} -function self.readn(addr, len) - i2c.start(0) - if not i2c.address(0, addr, i2c.RECEIVER) then i2c.stop(0) return nil end - local v = i2c.read(0, len) - i2c.stop(0) +function self.readn(bus, addr, len) + local i2c = i2c + i2c.start(bus) + if not i2c.address(bus, addr, i2c.RECEIVER) then i2c.stop(bus) return nil end + local v = i2c.read(bus, len) + i2c.stop(bus) return v end -function self.writen(addr, ...) - i2c.start(0) - if not i2c.address(0, addr, i2c.TRANSMITTER) then i2c.stop(0) return nil end - i2c.write(0, ...) - i2c.stop(0) +function self.writen(bus, addr, ...) + local i2c = i2c + i2c.start(bus) + if not i2c.address(bus, addr, i2c.TRANSMITTER) then i2c.stop(bus) return nil end + i2c.write(bus, ...) + i2c.stop(bus) return true end +-- write/read without a full stop/start +function self.wr(bus, addr, len, ...) + local i2c = i2c + i2c.start(bus) + if not i2c.address(bus, addr, i2c.TRANSMITTER) then i2c.stop(bus) return nil end + i2c.write(bus, ...) + i2c.start(bus) + if not i2c.address(bus, addr, i2c.RECEIVER) then i2c.stop(bus) return nil end + local v = i2c.read(bus, len) + i2c.stop(bus) + return v +end + return self -- 2.50.1