#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/spi.h"
// BUFFER PARA ARMAZENAMENTO DE DADOS RECEBIDOS
#define BUFFER_SIZE 10
uint8_t rx_buffer[BUFFER_SIZE];
volatile int rx_index = 0;
// função de callback para tratar interrupções 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_index++] = received;
}
}
}
// Função para enviar comandos ao cartão SD
void send_command(uint8_t command, uint32_t argument, uint8_t crc) {
uint8_t cmd[6];
cmd[0] = 0x40 | command; // Comando com bit inicial
cmd[1] = (argument >> 24) & 0xFF; // Argumento (MSB)
cmd[2] = (argument >> 16) & 0xFF;
cmd[3] = (argument >> 8) & 0xFF;
cmd[4] = argument & 0xFF; // Argumento (LSB)
cmd[5] = crc | 0x01; // CRC com bit final sempre em 1
gpio_put(17, 0); // Seleciona o cartão SD (CS LOW)
spi_write_blocking(spi0, cmd, 6);
gpio_put(17, 1); // Libera o cartão SD (CS HIGH)
printf("Comando enviado: ");
for (int i = 0; i < 6; i++) {
printf("%02X ", cmd[i]);
}
printf("\n");
}
int main() {
stdio_init_all();
printf("Iniciando comunicação SPI com o cartão SD...\n");
// Configuração do SPI
spi_init(spi0, 500000); // Inicializa SPI0 com 500kHz
gpio_set_function(18, GPIO_FUNC_SPI); // SCLK
gpio_set_function(19, GPIO_FUNC_SPI); // MOSI
gpio_set_function(16, GPIO_FUNC_SPI); // MISO
gpio_set_function(17, GPIO_FUNC_SPI); // CS - Chip Select
gpio_init(17);
gpio_set_dir(17, GPIO_OUT);
gpio_put(17, 1); // CS HIGH (inativo)
// Teste inicial
uint8_t dummy = 0xFF;
for (int i = 0; i < 10; i++) {
gpio_put(17, 0); // Seleciona o cartão SD
spi_write_blocking(spi0, &dummy, 1);
gpio_put(17, 1); // Libera o cartão SD
}
printf("Enviando CMD0 (RESET)...\n");
send_command(0, 0x00000000, 0x95); // CMD0: Inicializa o cartão SD
while (true) {
sleep_ms(1000);
printf("Loop principal em execução...\n");
}
}