71 lines
2.5 KiB
Python
71 lines
2.5 KiB
Python
|
#!/usr/bin/env python
|
||
|
import sys
|
||
|
import time
|
||
|
from smbus2 import SMBus, i2c_msg
|
||
|
|
||
|
def listen_i2c(bus_number, address, register=0x00):
|
||
|
"""
|
||
|
Listens for incoming data on the specified I2C address and prints received bytes.
|
||
|
:param bus_number: I2C bus number (e.g. 1 for /dev/i2c-1)
|
||
|
:param address: I2C address to listen to (in integer, e.g. 0x48)
|
||
|
:param register: Register to read from (default 0x00)
|
||
|
"""
|
||
|
bus = SMBus(bus_number)
|
||
|
print(f"Listening on I2C bus {bus_number}, address {hex(address)}, register {hex(register)}")
|
||
|
try:
|
||
|
# color = True
|
||
|
while True:
|
||
|
try:
|
||
|
msg = i2c_msg.read(address, 8) # Read 8 bytes!
|
||
|
bus.i2c_rdwr(msg)
|
||
|
data = bytes(msg)
|
||
|
int_list = list(data)
|
||
|
print(f"Received: {int_list}")
|
||
|
# Try reading 1 byte from the register
|
||
|
# data = bus.read_block_data(address, register)
|
||
|
# print(f"Received: ({data})")
|
||
|
# if color:
|
||
|
# msg = i2c_msg.write(address, create_led_color_packet(255, 0, 0))
|
||
|
# else:
|
||
|
# msg = i2c_msg.write(address, create_led_color_packet(255, 255, 0))
|
||
|
#
|
||
|
# bus.i2c_rdwr(msg)
|
||
|
# color = not(color)
|
||
|
# bus.write_i2c_block_data(address, register, create_led_color_packet(255, 0, 0))
|
||
|
# print("Write")
|
||
|
except Exception as e:
|
||
|
print(f"Write error: {e}")
|
||
|
time.sleep(0.5)
|
||
|
except KeyboardInterrupt:
|
||
|
print("Stopped listening.")
|
||
|
finally:
|
||
|
bus.close()
|
||
|
|
||
|
def create_led_color_packet(r, g, b):
|
||
|
"""
|
||
|
Create an 8-byte packet to set LED color for I2C transfer.
|
||
|
Packet format:
|
||
|
[0x10, 0x00, R, G, B, 0x00, 0x00, checksum]
|
||
|
- 0x10: Command for LED color
|
||
|
- 0x00: Target/channel (set as needed)
|
||
|
- R, G, B: Color bytes (0-255)
|
||
|
- 0x00, 0x00: Unused
|
||
|
- checksum: XOR of bytes 0-6
|
||
|
"""
|
||
|
packet = [0x10, 0x00, r & 0xFF, g & 0xFF, b & 0xFF, 0x00, 0x00]
|
||
|
checksum = 0
|
||
|
for b in packet:
|
||
|
checksum ^= b
|
||
|
packet.append(checksum)
|
||
|
return bytes(packet)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
if len(sys.argv) < 3:
|
||
|
print("Usage: python i2c_listener.py <bus_number> <address> [register]")
|
||
|
print("Example: python i2c_listener.py 1 0x48")
|
||
|
sys.exit(1)
|
||
|
bus_number = int(sys.argv[1])
|
||
|
address = int(sys.argv[2], 0)
|
||
|
register = int(sys.argv[3], 0) if len(sys.argv) > 3 else 0x00
|
||
|
listen_i2c(bus_number, address, register)
|