From 842339a60e41a9042cc7b08b948dc76f07c5bf81 Mon Sep 17 00:00:00 2001 From: Greenman999 Date: Thu, 11 Sep 2025 17:16:12 +0200 Subject: [PATCH] feat: add basic i2c receiver and sender --- main.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 main.py diff --git a/main.py b/main.py new file mode 100755 index 0000000..bd20a5f --- /dev/null +++ b/main.py @@ -0,0 +1,70 @@ +#!/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
[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)