#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
// Buffer para armazenar dados recebidos
#define BUFFER_SIZE 10
uint8_t rx_buffer[BUFFER_SIZE];
volatile int rx_index = 0;
// Função de callback para tratar interrupção de SPI
void on_spi_rx() {
while(spi_is_readable(spi0)){
uint8_t received = spi_get_hw(spi0)->dr;
if(rx_index < BUFFER_SIZE) {
rx_buffer[rx_inedex++] = received;
}
}
}
int main() {
// Inicializa SPI0 com velocidade de 5000kHz, modo 0 (CPOL 0, CPHA = 0)
stdio_init_all();
// Configura pinos de SPI
gpio_set_function(2, GPIO_FUNC_SPI); // Configura pino como SCLK
gpio_set_function(3, GPIO_FUNC_SPI); // Configura pino como MOSI
gpio_set_function(4, GPIO_FUNC_SPI); // Configura pino como MISO
gpio_set_function(5, GPIO_FUNC_SPI); // Configura pino como CS
// Habilita interrupções na SPI0
irq_set_exclusive_handler(SPI0_IRQ, on_spi_rx);
irq_set_enable(SPI0_IRQ, true);
spi_get_hw(spi0) -> imsc = SPI_IMSC_RXIM_BITS;
// Habilita interrupção de recepção
uint8_t data_out = 0x55; // Dados para enviar
while (true) {
// Reset indice do buffer
rx_index = 0;
//Seleciona o dispositivo
gpio_put(5, 0);
// Envia dados via SPI
spi_write_blocking(spi0, &data_out, 1);
// Aguarda até que todos os dados sejam recebidos
sleep_ms(250);
// Libera o dispositivo
gpio_put(5, 1);
// Processa os dados recebidos
if (rx_index > 0) {
printf("Dados recebidos: ");
for (int i = 0; i < rx_index; i++){
printf("%02x", rx_buffer[i]);
}
printf("\n");
}
sleep_ms(1000); // Pausa de 1 segundo antes do próximo ciclo
}
}