\section{\IIC Unit} The \gls{I2C} unit provides access to one of the microcontroller's \gls{I2C} peripherals. More on the \IIC bus can be found in section~\ref{sec:theory-i2c}. The unit can be configured to use either of the three standard speeds (Standard, Fast and Fast+) and supports both 10-bit and 7-bit addressing. 10-bit addresses can be used in commands by setting their highest bit (0x8000), as a flag to the unit; the 7 or 10 least significant bits will be used as the actual address. \subsection{\IIC Configuration} \begin{inicode} [I2C:d@4] # Peripheral number (I2Cx) device=1 # Pin mappings (SCL,SDA) # I2C1: (0) B6,B7 (1) B8,B9 # I2C2: (0) B10,B11 (1) B13,B14 remap=0 # Speed: 1-Standard, 2-Fast, 3-Fast+ speed=1 # Analog noise filter enable (Y,N) analog-filter=Y # Digital noise filter bandwidth (0-15) digital-filter=0 \end{inicode} \subsection{\IIC Commands} \begin{cmdlist} 0 & \cname{WRITE} Perform a raw write transaction & \begin{cmdreq} \cfield{u16} slave address \cfield{u8[]} bytes to write \end{cmdreq} \\ 1 & \cname{READ} Perform a raw read transaction. & \begin{cmdreq} \cfield{u16} slave address \cfield{u16} number of read bytes \end{cmdreq} \cjoin \begin{cmdresp} \cfield{u8[]} received bytes \end{cmdresp} \\ 2 & \cname{WRITE\_REG} Write to a slave register. Sends the register number and the data in the same transaction. Multiple registers can be written at once if the slave supports auto-increment. & \begin{cmdreq} \cfield{u16} slave address \cfield{u8} register number \cfield{u8[]} bytes to write \end{cmdreq} \\ 3 & \cname{READ\_REG} Read from a slave register. Writes the register number and issues a read transaction of the given length. Multiple registers can be read at once if the slave supports auto-increment. & \begin{cmdreq} \cfield{u16} slave address \cfield{u8} register number \cfield{u16} number of read bytes \end{cmdreq} \cjoin \begin{cmdresp} \cfield{u8[]} received bytes \end{cmdresp} \\ \end{cmdlist}