#ifndef __BSP_SD_SPI_H #define __BSP_SD_SPI_H #include "ch32v30x.h" #define BSP_SD_BLOCK_SIZE 512 #define BSP_SD_SPI SPI2 #define BSP_SD_SPI_CLK_ENABLE() RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE) #define BSP_SD_SPI_SCK_PIN GPIO_Pin_13 /* PB.13 */ #define BSP_SD_SPI_SCK_GPIO_PORT GPIOB /* GPIOB */ #define BSP_SD_SPI_SCK_GPIO_CLK RCC_APB2Periph_GPIOB #define BSP_SD_SPI_MISO_PIN GPIO_Pin_14 /* PB.14 */ #define BSP_SD_SPI_MISO_GPIO_PORT GPIOB /* GPIOB */ #define BSP_SD_SPI_MISO_GPIO_CLK RCC_APB2Periph_GPIOB #define BSP_SD_SPI_MOSI_PIN GPIO_Pin_15 /* PB.15 */ #define BSP_SD_SPI_MOSI_GPIO_PORT GPIOB /* GPIOB */ #define BSP_SD_SPI_MOSI_GPIO_CLK RCC_APB2Periph_GPIOB #define BSP_SD_CS_PIN GPIO_Pin_12 /* PB.12 */ #define BSP_SD_CS_GPIO_PORT GPIOB /* GPIOB */ #define BSP_SD_CS_GPIO_CLK RCC_APB2Periph_GPIOB #define BSP_SD_TX_DMA_CHANNEL DMA1_Channel5 #define BSP_SD_RX_DMA_CHANNEL DMA1_Channel4 #define BSP_SD_TX_DMA_IT_TC_FLAG DMA1_IT_TC4 typedef enum { bsp_sd_type_unknown = 0, bsp_sd_type_mmc, bsp_sd_type_sdv1, bsp_sd_type_sdv2, bsp_sd_type_sdv2hc, } bsp_sd_type_t; typedef enum { bsp_sd_error_none = 0, bsp_sd_error_no_card, bsp_sd_error_invalid_parameter, bsp_sd_error_unknown_card_type, bsp_sd_error_not_ready, bsp_sd_error_invalid_response, bsp_sd_error_timeout, } bsp_sd_error_t; typedef struct { bsp_sd_type_t card_type; uint32_t sector_count; } bsp_card_info_t; bsp_sd_error_t bsp_sd_init(void); bsp_sd_error_t bsp_sd_read_block(uint8_t* buffer, uint32_t sector_address); bsp_sd_error_t bsp_sd_read_multi_blocks(uint8_t* buffer, uint32_t sector_address, uint16_t sector_count); bsp_sd_error_t bsp_sd_write_block(const uint8_t *buffer, uint32_t sector_address); bsp_sd_error_t bsp_sd_write_multi_blocks(const uint8_t *buffer, uint32_t sector_address, uint16_t sector_count); void bsp_sd_spi_get_card_info(bsp_card_info_t *card_info_out); #endif