bcffd916 |
#!/usr/bin/python3
#
# Module: tmp102.py
#
# Description: This module acts as an interface between the TCA9548A i2c mux
# and connected devices. Class methods send and receive data from specific
# devices connected to the mux. It acts as a library module that
# can be imported into and called from other Python programs.
#
# Copyright 2022 Jeff Owrey
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# 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, see http://www.gnu.org/license.
#
# Revision History
# * v10 released 16 March 2022 by J L Owrey; first release
#
#2345678901234567890123456789012345678901234567890123456789012345678901234567890
# Import the I2C interface library
import smbus
import time
# Define default sm bus address.
DEFAULT_BUS_ADDRESS = 0x70
DEFAULT_BUS_NUMBER = 1
# Define the default mux configuration. See the TCA9548A data sheet
# for meaning of each bit. The following byte is written to the
# configuration register. This byte disables all mux outputs.
# byte 1: 00000000
DEFAULT_CONFIG = 8
channel_conf=[0b00000001,0b00000010,0b00000100,0b00001000,0b00010000, \
0b00100000,0b01000000,0b10000000,0]
class i2cmux:
# Initialize the TCA9548A multiplexer at the supplied address
# (default address is 0x70), and supplied bus (default is 1).
# Creates a new SMBus object for each instance of this class.
# Writes configuration data (one byte) to the TCA9548A configuration
# register.
def __init__(self, mAddr=DEFAULT_BUS_ADDRESS,
sbus=DEFAULT_BUS_NUMBER,
config=DEFAULT_CONFIG,
debug=False):
# Instantiate a smbus object
self.muxAddr = mAddr
self.bus = smbus.SMBus(sbus)
self.debugMode = debug
# Initialize mux with all channels disabled.
self.bus.write_byte(self.muxAddr, channel_conf[config])
if self.debugMode:
# Read the mux configuration register.
data = self.getInfo()
print("mux config register: %s\n" % data)
## end def
# Reads the configuration register (two bytes).
def getInfo(self):
# Read configuration data
config = self.bus.read_byte(self.muxAddr)
configB = format(config, "08b")
return (configB)
## end def
def write_i2c_block_data(self, channel, addr, offset, data):
# Write block data to the device connected to the specified
# channel.
# Enable the specified mux channel.
self.bus.write_byte(self.muxAddr, channel_conf[channel])
time.sleep(.001)
# Write data to the device connected to the channel.
self.bus.write_i2c_block_data(addr, offset, data)
time.sleep(.001)
# Disable the mux channel.
self.bus.write_byte(self.muxAddr, 0)
## end def
def read_i2c_block_data(self, channel, addr, offset, nBytes):
# Read block data from the device connected to the specified
# channel.
# Enable the specified mux channel.
self.bus.write_byte(self.muxAddr, channel_conf[channel])
time.sleep(.001)
# Write data to the device connected to the channel.
data = self.bus.read_i2c_block_data(addr, offset, nBytes)
time.sleep(.001)
# Disable the mux channel.
self.bus.write_byte(self.muxAddr, 0)
return data
## end def
def write_byte(self, channel, addr, byte):
# Write a byte to the device connected to the specified
# channel.
# Enable the specified mux channel.
self.bus.write_byte(self.muxAddr, channel_conf[channel])
time.sleep(.001)
# Write data to the device connected to the channel.
self.bus.write_byte(addr, byte)
time.sleep(.001)
# Disable the mux channel.
self.bus.write_byte(self.muxAddr, 0)
## end def
def read_byte(self, channel, addr):
# Read a byte from the device connected to the specified
# channel.
# Enable the specified mux channel.
self.bus.write_byte(self.muxAddr, channel_conf[channel])
time.sleep(.001)
# Read data from the device connected to the channel.
byte = self.bus.read_byte(addr)
time.sleep(.001)
# Disable the mux channel.
self.bus.write_byte(self.muxAddr, 0)
return byte
## end def
## end class
def testclass():
# Initialize the smbus and TMP102 sensor.
ts1 = i2cmux(0x70, 1, config=0, debug=True)
ts2 = i2cmux(debug=True)
del ts1, ts2
## end def
if __name__ == '__main__':
testclass()
|