I2C

Protocolo de comunicação I2C, porque usar e em que circunstancias é implementado.

diagrama de funcionamento I2C

O protocolo I2C (Inter-Integrated Circuit) é um protocolo destinado a permitir que vários circuitos integrados digitais "periféricos" ("chips") se comuniquem com um ou mais chips "controladores". Como a Interface Periférica Serial (SPI), destina-se apenas a comunicações de curta distância em um único dispositivo. Como as interfaces seriais assíncronas (como RS-232 ou UARTs), ele requer apenas dois fios de sinal para trocar informações.

Raspberry com múltiplos dispositivos I2C

Ao olhar para a placa do raspberry pode criar alguma frustração a impossibilidade de usar vários dispositivos I2C, porém, não há necessidade de usar "multiplexers" mais lentos quando os últimos kernel do RPi permite vários barramentos usando os pinos GPIO.

sudo i2cdetect -y 1
detetar dispositivos I2C instalados

Se não tiver instalado podemos instalar executando

sudo apt install i2c-tools

Neste caso não temos dispositivos I2C conetados, mas se existissem vários, seria um problema. O barramento I2C pode lidar com múltiplos dispositivos mas, para funcionarem, têm de ter endereços i2c diferentes. Alguns têm "jumpers" para definir o endereço, mas outros não, nesse caso, pode-se usar um "multiplexer"(hardware) para comutar o SDA i2c(Data) e SCL (Clock) ou criar um barramento adicional.

Vamos criar dois BUS adicionais BUS 3 e BUS 4

sudo nano /boot/config.txt ou sudo nano /boot/firmware/config.txt em função da localização do config.txt

Adicione a seguinte linha de código, de preferência na secção em que spi e i2c estão ativados.

dtoverlay=i2c-gpio,bus=4,i2c_gpio_delay_us=1,i2c_gpio_sda=23,i2c_gpio_scl=24

Esta linha criará um barramento i2c adicional (barramento 4) no GPIO 23 como SDA e GPIO 24 como SCL (GPIO 23 e 24 é o padrão)
Adicione também a seguinte linha para criar o barramento i2c 3

dtoverlay = i2c-gpio, bus = 3, i2c_gpio_delay_us = 1, i2c_gpio_sda = 17, i2c_gpio_scl = 27

GPIO 17 será o SDA e GPIO 27 será o SCL para o barramento 4 i2c.
Toque no controle X para sair.
Nota sobre a numeração e pedido do BUS:

Nunca usar os barramentos 0 e 2, ele é usado para outras coisas no tabuleiro, como eeprom em "hats", etc.

Nas "board" RPi abril de 2019:
Deve sempre começar com o barramento mais alto (barramento 4, neste caso) no config.txt e seguir até o barramento mais baixo (barramento 3). O BUS mais baixo deve ser sempre o BUS 3
Se for preciso 5 BUS extras, os BUS devem estar por ordem de 7, 6, 5, 4, 3

O problema com a ordenação do BUS apenas surgiu após a atualização do kernel.

Para verificar os vários BUS

sudo i2cdetect -l