nodepower/bin/i2cmux/i2cmux.py
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()