#include <stdio.h>
#include <string.h>
#include <sys/unistd.h>
#include <sys/stat.h>
#include "esp_vfs_fat.h"
#include "sdmmc_cmd.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/spi_master.h"
#include "driver/sdspi_host.h"
#include "driver/gpio.h"
#if SOC_SDMMC_IO_POWER_EXTERNAL
#include "sd_pwr_ctrl_by_on_chip_ldo.h"
#endif
#define EXAMPLE_MAX_CHAR_SIZE 64
#define MOUNT_POINT "/sdcard"
/*
#define SPI_MOSI 23
#define SPI_MISO 19
#define SPI_SCLK 18
#define SPI_CS 5
*/
#define SPI_MOSI 13
#define SPI_MISO 12
#define SPI_SCLK 14
#define SPI_CS 15
static const char* TAG = "sdcard";
static esp_err_t s_example_write_file(const char *path, char *data)
{
ESP_LOGI(TAG, "Opening file %s", path);
FILE *f = fopen(path, "w");
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file for writing");
return ESP_FAIL;
}
fprintf(f, data);
fclose(f);
ESP_LOGI(TAG, "File written");
return ESP_OK;
}
static esp_err_t s_example_read_file(const char *path)
{
ESP_LOGI(TAG, "Reading file %s", path);
FILE *f = fopen(path, "r");
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file for reading");
return ESP_FAIL;
}
char line[EXAMPLE_MAX_CHAR_SIZE];
fgets(line, sizeof(line), f);
fclose(f);
// strip newline
char *pos = strchr(line, '\n');
if (pos) {
*pos = '\0';
}
ESP_LOGI(TAG, "Read from file: '%s'", line);
return ESP_OK;
}
void app_main(void)
{
gpio_set_pull_mode(SPI_MISO, GPIO_PULLUP_ONLY);
gpio_set_pull_mode(SPI_MOSI, GPIO_PULLUP_ONLY);
gpio_set_pull_mode(SPI_SCLK, GPIO_PULLUP_ONLY);
gpio_set_pull_mode(SPI_CS, GPIO_PULLUP_ONLY);
gpio_set_direction(SPI_MISO, GPIO_MODE_INPUT);
gpio_set_direction(SPI_MOSI, GPIO_MODE_OUTPUT);
gpio_set_direction(SPI_SCLK, GPIO_MODE_OUTPUT);
gpio_set_direction(SPI_CS, GPIO_MODE_OUTPUT);
//opciones de montaje del sistema de archivos
esp_vfs_fat_sdmmc_mount_config_t mount_config =
{
.format_if_mount_failed = true,
.max_files = 5,
.allocation_unit_size = (1024 * 16),
};
sdmmc_card_t *card;
const char mount_point[] = MOUNT_POINT;
ESP_LOGI(TAG, "inicializando SD_Card\n");
ESP_LOGI(TAG, "Periferico SPI\n");
sdmmc_host_t host = SDSPI_HOST_DEFAULT(); //frecuencia en 20MHz por defecto
host.max_freq_khz = 100;
//configuraciones del bus para SPI
spi_bus_config_t bus_cfg =
{
.mosi_io_num = SPI_MOSI,
.miso_io_num = SPI_MISO,
.sclk_io_num = SPI_SCLK,
.quadhd_io_num = -1,
.quadwp_io_num = -1,
.max_transfer_sz = 4000,
};
//inicializacion del bus para SPI
spi_bus_initialize(host.slot, &bus_cfg, SDSPI_DEFAULT_DMA);
//configuraciones para la SD por SPI
sdspi_device_config_t slot_cfg = SDSPI_DEVICE_CONFIG_DEFAULT();
slot_cfg.gpio_cs = SPI_CS;
slot_cfg.host_id = host.slot;
//mostrar informacion de la SD
//montaje de sistema de archivos
ESP_LOGI(TAG, "Montando FILESYSTEM\n");
esp_vfs_fat_sdspi_mount(mount_point, &host, &slot_cfg, &mount_config, &card);
ESP_LOGI(TAG, "FILESYSTEM montado correctamente\n");
sdmmc_card_print_info(stdout, card);
}