wch-code/ch32v307_mp3_dac/User/bsp/bsp_sd_spi.h

61 lines
2.3 KiB
C

#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