feat: add basic i2c receiver and sender

This commit is contained in:
Greenman999 2025-09-11 17:16:12 +02:00
parent 00114dd52f
commit 842339a60e

70
main.py Executable file
View file

@ -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 <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)