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