#ifndef __BSP_SPI_SD_H #define __BSP_SPI_SD_H /* Includes ------------------------------------------------------------------*/ #include "ch32v30x.h" #include #define SD_SPI SPI2 #define SD_SPI_CLK_ENABLE() RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE) #define SD_SPI_SCK_PIN GPIO_Pin_13 /* PB.13 */ #define SD_SPI_SCK_GPIO_PORT GPIOB /* GPIOB */ #define SD_SPI_SCK_GPIO_CLK RCC_APB2Periph_GPIOB #define SD_SPI_MISO_PIN GPIO_Pin_14 /* PB.14 */ #define SD_SPI_MISO_GPIO_PORT GPIOB /* GPIOB */ #define SD_SPI_MISO_GPIO_CLK RCC_APB2Periph_GPIOB #define SD_SPI_MOSI_PIN GPIO_Pin_15 /* PB.15 */ #define SD_SPI_MOSI_GPIO_PORT GPIOB /* GPIOB */ #define SD_SPI_MOSI_GPIO_CLK RCC_APB2Periph_GPIOB #define SD_CS_PIN GPIO_Pin_12 /* PB.12 */ #define SD_CS_GPIO_PORT GPIOB /* GPIOB */ #define SD_CS_GPIO_CLK RCC_APB2Periph_GPIOB #define SD_DETECT_PIN GPIO_Pin_0 /* PB.00 */ #define SD_DETECT_GPIO_PORT GPIOB /* GPIOE */ #define SD_DETECT_GPIO_CLK RCC_APB2Periph_GPIOB #define SPISD_R1_IDLE_FLAG (0x01) #define SPISD_R1_ERASE_RESET_FLAG (0x02) #define SPISD_R1_ILLEGAL_CMD_FLAG (0x04) #define SPISD_R1_CMD_CRC_FLAG (0x08) #define SPISD_R1_ERASE_SEQ_ERROR_FLAG (0x10) #define SPISD_R1_ADDR_ERROR_FLAG (0x20) #define SPISD_R1_PARAM_ERROR_FLAG (0x40) #define SPISD_R1_ZERO_FLAG (0x80) typedef enum spisd_result_s { SPISD_RESULT_OK = 0, SPISD_RESULT_ERROR, SPISD_RESULT_NO_CARD, SPISD_RESULT_TIMEOUT, } spisd_result_t; typedef union __attribute__((packed)) sppisd_r1_u { uint8_t raw; struct { uint8_t idle: 1; /*