-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtca9548a.py
More file actions
92 lines (80 loc) · 2.89 KB
/
tca9548a.py
File metadata and controls
92 lines (80 loc) · 2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""
TCA9548A I2C switch driver, Texas instruments
8 bidirectional translating switches
I2C SMBus protocol
Manual: tca9548.pdf
Copyright (C) 2019 Vid Rajtmajer <vid@irnas.eu>
"""
import logging
import smbus
from src.constants import I2C_CHANNEL
class TCA9548A(object):
def __init__(self, address):
"""Init smbus channel and tca driver on specified address."""
try:
self.PORTS_COUNT = 8 # number of switches
self.i2c_bus = smbus.SMBus(I2C_CHANNEL)
self.i2c_address = address
if self.get_control_register() is None:
raise ValueError
except ValueError:
logging.error("No device found on specified address!")
self.i2c_bus = None
except:
logging.error("Bus on channel {} is not available.".format(I2C_CHANNEL))
logging.info("Available busses are listed as /dev/i2c*")
self.i2c_bus = None
def get_control_register(self):
"""Read value (length: 1 byte) from control register."""
try:
value = self.i2c_bus.read_byte(self.i2c_address)
return value
except:
return None
def get_channel(self, ch_num):
"""Get channel state (specified with ch_num), return 0=disabled or 1=enabled."""
if ch_num < 0 or ch_num > self.PORTS_COUNT:
return None
register = self.get_control_register()
if register is None:
return None
value = ((register >> ch_num) & 1)
return value
def set_control_register(self, value):
"""Write value (length: 1 byte) to control register."""
try:
if value < 0 or value > 255:
return False
self.i2c_bus.write_byte(self.i2c_address, value)
return True
except:
return False
def set_channel(self, ch_num, state):
"""Change state (0=disable, 1=enable) of a channel specified in ch_num."""
if ch_num < 0 or ch_num > self.PORTS_COUNT:
return False
if state != 0 and state != 1:
return False
current_value = self.get_control_register()
if current_value is None:
return False
if state:
new_value = current_value | 1 << ch_num
else:
new_value = current_value & (255 - (1 << ch_num))
return_value = self.set_control_register(new_value)
return return_value
def __del__(self):
"""Driver destructor."""
self.i2c_bus = None
# ------------------------ Test code ----------------------------
tca = TCA9548A(0x70)
print(bin(tca.get_control_register()))
num = int("00001000", 2)
tca.set_control_register(num) # enable all connected devices
print(bin(tca.get_control_register()))
'''
# tca.set_control_register(0) # disable all channels
# tca.set_channel(6, 1) # enable extender
# print(tca.get_channel(4))
'''