Skip to content

Instantly share code, notes, and snippets.

@gkluoe
Created June 11, 2019 06:54
Show Gist options
  • Save gkluoe/83b11673484c1a8a4e555607ad52c362 to your computer and use it in GitHub Desktop.
Save gkluoe/83b11673484c1a8a4e555607ad52c362 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
#
# Copyright (c) 2014 OpenElectrons.com
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# History:
# Date Author Comments
# 01/30/14 Deepak Initial authoring.
#
#
## @package OpenElectrons_i2c
# This is the i2c module for OpenElectrons i2c devices.
# import smbus
import ctypes
try:
from machine import I2C
except ImportError:
raise ImportError("Can't find the micropython machine.I2C class: "
"perhaps you don't need this adapter?")
class SMBus(I2C):
""" Provides an 'SMBus' module which supports some of the py-smbus
i2c methods, as well as being a subclass of machine.I2C
Hopefully this will allow you to run code that was targeted at
py-smbus unmodified on micropython.
Use it like you would the machine.I2C class:
bus = SMBus(1, pins=('G15','G10'), baudrate=100000)
bus.read_byte_data(addr, register)
... etc
"""
def read_byte_data(self, addr, register):
""" Read a single byte from register of device at addr
Returns a single byte """
return self.readfrom_mem(addr, register, 1)[0]
def read_i2c_block_data(self, addr, register, length):
""" Read a block of length from register of device at addr
Returns a bytes object filled with whatever was read """
return self.readfrom_mem(addr, register, length)
def write_byte_data(self, addr, register, data):
""" Write a single byte from buffer `data` to register of device at addr
Returns None """
# writeto_mem() expects something it can treat as a buffer
if isinstance(data, int):
data = bytes([data])
return self.writeto_mem(addr, register, data)
def write_i2c_block_data(self, addr, register, data):
""" Write multiple bytes of data to register of device at addr
Returns None """
# writeto_mem() expects something it can treat as a buffer
if isinstance(data, int):
data = bytes([data])
return self.writeto_mem(addr, register, data)
# The follwing haven't been implemented, but could be.
def read_byte(self, *args, **kwargs):
""" Not yet implemented """
raise RuntimeError("Not yet implemented")
def write_byte(self, *args, **kwargs):
""" Not yet implemented """
raise RuntimeError("Not yet implemented")
def read_word_data(self, *args, **kwargs):
""" Not yet implemented """
raise RuntimeError("Not yet implemented")
def write_word_data(self, *args, **kwargs):
""" Not yet implemented """
raise RuntimeError("Not yet implemented")
## OpenElectrons_i2c: this class provides i2c functions
# for read and write operations.
class OpenElectrons_i2c(object):
@staticmethod
def pi_rev():
try:
with open('/proc/cpuinfo','r') as cpuinfo:
for line in cpuinfo:
if line.startswith('Hardware'):
#print " rstrip output " +str(line.rstrip()[-4:])
cpu = 10 if line.rstrip()[-4:] in ['2709'] else 0
if line.startswith('Revision'):
# case '3' is for some rare pi board - Deepak
#print " rstrip output " +str(line.rstrip()[-1])
rev = 1 if line.rstrip()[-1] in ['1','2','3'] else 2
return cpu+rev
except:
return 0
@staticmethod
def which_bus():
return 1 if OpenElectrons_i2c.pi_rev() > 1 else 0
## Initialize the class with the i2c address of your device
# @param i2c_address address of your device
def __init__(self, i2c_address):
self.address = i2c_address
b = OpenElectrons_i2c.which_bus()
self.bus = SMBus(b)
## Write a byte to your i2c device at a given location
# @param self The object pointer.
# @param reg the register to write value at.
# @param value value to write.
def writeByte(self, reg, value):
self.bus.write_byte_data(self.address, reg, value)
def readByte(self, reg):
result = self.bus.read_byte_data(self.address, reg)
return (result)
# for read_i2c_block_data and write_i2c_block_data to work correctly,
# ensure that i2c speed is set correctly on your pi:
# ensure following file with contents as follows:
# /etc/modprobe.d/i2c.conf
# options i2c_bcm2708 baudrate=50000
# (without the first # and space on line above)
#
def readArray(self, reg, length):
results = self.bus.read_i2c_block_data(self.address, reg, length)
return results
def writeArray(self, reg, arr):
self.bus.write_i2c_block_data(self.address, reg, arr)
def writeArray_byte_at_a_time(self, reg, arr):
x=0
for y in arr:
self.writeByte(reg+x, y)
x+=1
return
def readString(self, reg, length):
ss = ''
for x in range(0, length):
ss = ''.join([ss, chr(self.readByte(reg+x))])
return ss
def readArray_byte_at_a_time(self, reg, length):
ss = []
for x in range(0, length):
w=self.readByte(reg+x)
ss.append(w)
return ss
def readInteger(self, reg):
b0 = self.readByte(reg)
b1 = self.readByte(reg+1)
r = b0 + (b1<<8)
return r
def readIntegerSigned(self, reg):
a = self.readInteger(reg)
signed_a = ctypes.c_int(a).value
return signed_a
def readLong(self, reg):
b0 = self.readByte(reg)
b1 = self.readByte(reg+1)
b2 = self.readByte(reg+2)
b3 = self.readByte(reg+3)
r = b0 + (b1<<8) + (b2<<16) + (b3<<24)
return r
def readLongSigned(self, reg):
a = self.readLong(reg)
signed_a = ctypes.c_long(a).value
return signed_a
## Read the firmware version of the i2c device
def GetFirmwareVersion(self):
ver = self.readString(0x00, 8)
return ver
## Read the vendor name of the i2c device
def GetVendorName(self):
vendor = self.readString(0x08, 8)
return vendor
## Read the i2c device id
def GetDeviceId(self):
device = self.readString(0x10, 8)
return device
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment