#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "hardware/i2c.h"
#include "hardware/irq.h"
// Endereço I2C do dispositivo slave
#define I2C_SLAVE_ADDRESS 0X42
// Buffer para armazenar os dados recebidos
uint8_t rx_buffer[16];
volatile int rx_index = 0;
// Função de callback para a interrupção I2C
void i2c0_irq_handler() {
// Enquanto houver dados para ler na I2C
while (i2c_get_read_available(i2c0)) {
// Lê dados da I2C e armazena no buffer
if (rx_index < sizeof(rx_buffer)) {
i2c_read_raw_blocking(i2c0, &rx_buffer[rx_index], 1);
rx_index++;
}
}
}
int main() {
// Inicializa a I2C0 com frequência de 100 KHz
i2c_init(i2c0, 100 * 1000);
// Configuração dos pinos 4 e 5 para a I2C (SDA e SCL, respectivamente)
gpio_set_function(4, GPIO_FUNC_I2C);
gpio_set_function(5, GPIO_FUNC_I2C);
gpio_pull_up(4);
gpio_pull_up(5);
// Configura o Pico como dispositivo I2C slave
i2c_set_slave_mode(i2c0, true, I2C_SLAVE_ADDRESS);
// Configura o manipulador de interrupções e habilita a interrupção na I2C0
irq_set_exclusive_handler(I2C0_IRQ, i2c0_irq_handler);
irq_set_enabled(I2C0_IRQ, true);
// Habilita interrupções de recebimento (RX) para o modo slave
i2c0->hw->intr_mask = I2C_IC_INTR_MASK_M_RX_FULL_BITS;
rx_index = 0; // Limpa o buffer antes de começar
while (true) {
}
}