Module micromelon.i2c
Functions for communicating with I2C devices connected to the expansion header
If the rover controller is in uart operation then these functions are not available
Expand source code
"""
Functions for communicating with I2C devices connected to the expansion header
If the rover controller is in uart operation then these functions are not available
"""
from ._i2c import *
__all__ = [
"read",
"write",
"scan",
]
Functions
def read(address, register, byteCount, addressIs7Bit=True)
-
Reads bytes from the register of the I2C device at the address.
Args
address
:int
- Target I2C device address
register
:int
- Register in the target device to read from
byteCount
:int
- Number of bytes to read from the register
addressIs7Bit
:boolean
- if True then the address argument will be treated as 7 bits
This means the address will be shifted left one bit to
allow the R/W bit to be set
Raises
Exception if controller is in UART mode
Exception if the address is too large to be 7 bit and the 7 bit flag is True
Exception if the read register is > 255Returns
Array of bytes read from target device register
Expand source code
def read(address, register, byteCount, addressIs7Bit=True): """ Reads bytes from the register of the I2C device at the address. Args: address (int): Target I2C device address register (int): Register in the target device to read from byteCount (int): Number of bytes to read from the register addressIs7Bit (boolean): if True then the address argument will be treated as 7 bits This means the address will be shifted left one bit to allow the R/W bit to be set Raises: Exception if controller is in UART mode Exception if the address is too large to be 7 bit and the 7 bit flag is True Exception if the read register is > 255 Returns: Array of bytes read from target device register """ if _rc.isConnected() and _rc.isInSerialMode(): raise Exception("Expansion header used by UART. I2C not available") sanitisedAddress = None if addressIs7Bit: if address > 127: raise Exception("I2C address is too large to be 7 bit (>127)") sanitisedAddress = (address << 1) | 1 # 1 indicates read else: sanitisedAddress = address | 1 if register > 0xFF: raise Exception("I2C register >255") return _rc.readAttribute(OPTYPE.I2C_HEADER, [sanitisedAddress, register, byteCount])
def scan()
-
Scans for any I2C devices connected to the expansion header
Raises
Exception if controller is in UART mode
Returns
Array of device addresses found. Empty array if none found
Expand source code
def scan(): """ Scans for any I2C devices connected to the expansion header Raises: Exception if controller is in UART mode Returns: Array of device addresses found. Empty array if none found """ if _rc.isConnected() and _rc.isInSerialMode(): raise Exception("Expansion header used by UART. I2C not available") return _rc.readAttribute(OPTYPE.I2C_HEADER)
def write(address, register, value, byteCount, addressIs7Bit=True)
-
Writes value to the register of the I2C device at the address.
Args
address
:int
- Target I2C device address
register
:int
- Register in the target device to write to
value
:int
- Number to write - must be small enough to fit into byteCount bytes or fewer
byteCount
:int
- Number of bytes to write to the register
addressIs7Bit
:boolean
- if True then the address argument will be treated as 7 bits
This means the address will be shifted left one bit to
allow the R/W bit to be cleared
Raises
Exception if controller is in UART mode
Exception if the address is too large to be 7 bit and the 7 bit flag is True
Exception if the read register is > 255
Exception if the value requires more bytes than the byteCount argument allowsReturns
Array of bytes that is the response to the write command
Expand source code
def write(address, register, value, byteCount, addressIs7Bit=True): """ Writes value to the register of the I2C device at the address. Args: address (int): Target I2C device address register (int): Register in the target device to write to value (int): Number to write - must be small enough to fit into byteCount bytes or fewer byteCount (int): Number of bytes to write to the register addressIs7Bit (boolean): if True then the address argument will be treated as 7 bits This means the address will be shifted left one bit to allow the R/W bit to be cleared Raises: Exception if controller is in UART mode Exception if the address is too large to be 7 bit and the 7 bit flag is True Exception if the read register is > 255 Exception if the value requires more bytes than the byteCount argument allows Returns: Array of bytes that is the response to the write command """ if _rc.isConnected() and _rc.isInSerialMode(): raise Exception("Expansion header used by UART. I2C not available") sanitisedAddress = None if addressIs7Bit: if address > 127: raise Exception("I2C address is too large to be 7 bit (>127)") sanitisedAddress = (address << 1) & 0xFE # 0 for LSB indicates write else: sanitisedAddress = address & 0xFE if register > 0xFF: raise Exception("I2C register >255") bytesToWrite = numberToByteArray(value, byteCount) if byteCount < len(bytesToWrite): raise Exception( "I2C Data to write requires at least {} bytes".format(len(bytesToWrite)) ) return _rc.writeAttribute( OPTYPE.I2C_HEADER, [sanitisedAddress, register] + bytesToWrite )