feat: add basic i2c receiver and sender
This commit is contained in:
parent
00114dd52f
commit
842339a60e
1 changed files with 70 additions and 0 deletions
70
main.py
Executable file
70
main.py
Executable 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)
|
Loading…
Add table
Add a link
Reference in a new issue