sdcard_spi_internal.h¶
Interface for issuing commands on sd-cards via SPI.
For details of the sd card standard and the spi mode refer to “SD Specifications Part 1 Physical Layer Simplified Specification”. References to the sd specs in this file apply to Version 5.00 from August 10, 2016. For further details see https://www.sdcard.org/downloads/pls/pdf/part1_500.pdf.
-
SD_POWERSEQUENCE_CLOCK_COUNT
¶ 1
74
-
SD_CARD_PREINIT_CLOCK_PERIOD_US
¶ 1
10 /* used to generate 100 kHz clock in init phase*/
-
SD_CARD_WAIT_AFTER_POWER_UP_US
¶ 1
1000
-
SD_R1_RESPONSE_PARAM_ERROR
¶ 1
(1<<6)
-
SD_R1_RESPONSE_ADDR_ERROR
¶ 1
(1<<5)
-
SD_R1_RESPONSE_ERASE_SEQ_ERROR
¶ 1
(1<<4)
-
SD_R1_RESPONSE_CMD_CRC_ERROR
¶ 1
(1<<3)
-
SD_R1_RESPONSE_ILLEGAL_CMD_ERROR
¶ 1
(1<<2)
-
SD_R1_RESPONSE_ERASE_RESET
¶ 1
(1<<1)
-
SD_R1_RESPONSE_IN_IDLE_STATE
¶ 1
(0x01)
-
SD_INVALID_R1_RESPONSE
¶ 1
(1<<7)
-
R1_VALID
( X)¶ 1
(((X) >> 7) == 0)
-
R1_PARAM_ERR
( X)¶ 1
((((X) &SD_R1_RESPONSE_PARAM_ERROR) != 0))
-
R1_ADDR_ERR
( X)¶ 1
((((X) &SD_R1_RESPONSE_ADDR_ERROR) != 0))
-
R1_ERASE_ERR
( X)¶ 1
((((X) &SD_R1_RESPONSE_ERASE_SEQ_ERROR) != 0))
-
R1_CMD_CRC_ERR
( X)¶ 1
((((X) &SD_R1_RESPONSE_CMD_CRC_ERROR) != 0))
-
R1_ILL_CMD_ERR
( X)¶ 1
((((X) &SD_R1_RESPONSE_ILLEGAL_CMD_ERROR) != 0))
-
R1_IDLE_BIT_SET
( X)¶ 1
(((X) &SD_R1_RESPONSE_IN_IDLE_STATE) != 0)
-
R1_ERROR
( X)¶ 1 2
(R1_PARAM_ERR(X) || R1_ADDR_ERR(X) || R1_ERASE_ERR(X) || \ R1_CMD_CRC_ERR(X) || R1_ILL_CMD_ERR(X))
-
DATA_RESPONSE_IS_VALID
( X)¶ 1
(((X) & 0x11) == 0x01)
-
DATA_RESPONSE_ACCEPTED
( X)¶ 1
(((X) & 0x0E) == (1<<2))
-
DATA_RESPONSE_CRC_ERR
( X)¶ 1
(((X) & 0x0E) == 0x0A)
-
DATA_RESPONSE_WRITE_ERR
( X)¶ 1
(((X) & 0x0E) == 0x0C)
-
OCR_VOLTAGE_3_2_TO_3_3
¶ 1
(1L << 20)
-
OCR_VOLTAGE_3_3_TO_3_4
¶ 1
(1L << 21)
-
OCR_CCS
¶ 1
(1L << 30)
-
OCR_POWER_UP_STATUS
¶ 1
(1L << 31)
-
SYSTEM_VOLTAGE
¶ 1
(OCR_VOLTAGE_3_2_TO_3_3 | OCR_VOLTAGE_3_2_TO_3_3)
-
SD_CMD_PREFIX_MASK
¶ 1
(1<<6)
-
SD_CMD_0
¶ 1
0 /* Resets the SD Memory Card */
-
SD_CMD_1
¶ 1
1 /* Sends host capacity support info and starts the cards init process */
-
SD_CMD_8
¶ 1
8 /* Sends SD Card interface condition incl. host supply voltage info */
-
SD_CMD_9
¶ 1
9 /* Asks the selected card to send its card-specific data (CSD) */
-
SD_CMD_10
¶ 1
10 /* Asks the selected card to send its card identification (CID) */
-
SD_CMD_12
¶ 1
12 /* Forces the card to stop transmission in Multiple Block Read Operation */
-
SD_CMD_13
¶ 1
13 /* Sent as ACMD13 asks the card to send it's SD status */
-
SD_CMD_16
¶ 1
16 /* In case of SDSC Card, block length is set by this command */
-
SD_CMD_17
¶ 1
17 /* Reads a block of the size selected by the SET_BLOCKLEN command */
-
SD_CMD_18
¶ 1 2
18 /* Continuously transfers data blocks from card to host until interrupted by a STOP_TRANSMISSION command */
-
SD_CMD_24
¶ 1
24 /* Writes a block of the size selected by the SET_BLOCKLEN command */
-
SD_CMD_25
¶ 1
25 /* Continuously writes blocks of data until 'Stop Tran'token is sent */
-
SD_CMD_41
¶ 1
41 /* Reserved (used for ACMD41) */
-
SD_CMD_55
¶ 1 2
55 /* Defines to the card that the next commmand is an application specific command rather than a standard command */
-
SD_CMD_58
¶ 1
58 /* Reads the OCR register of a card */
-
SD_CMD_59
¶ 1
59 /* Turns the CRC option on or off. Argument: 1:on; 0:off */
-
SD_CMD_8_VHS_2_7_V_TO_3_6_V
¶ 1
0x01
-
SD_CMD_8_CHECK_PATTERN
¶ 1
0xB5
-
SD_CMD_NO_ARG
¶ 1
0x00000000
-
SD_ACMD_41_ARG_HC
¶ 1
0x40000000
-
SD_CMD_59_ARG_EN
¶ 1
0x00000001
-
SD_CMD_59_ARG_DIS
¶ 1
0x00000000
-
SD_DATA_TOKEN_CMD_17_18_24
¶ 1
0xFE
-
SD_DATA_TOKEN_CMD_25
¶ 1
0xFC
-
SD_DATA_TOKEN_CMD_25_STOP
¶ 1
0xFD
-
SD_SIZE_OF_CID_AND_CSD_REG
¶ 1
16
-
SD_SIZE_OF_SD_STATUS
¶ 1
64
-
SD_BLOCKS_FOR_REG_READ
¶ 1
1
-
SD_GET_CSD_STRUCTURE
( CSD_RAW_DATA)¶ 1
((CSD_RAW_DATA)[0] >> 6)
-
SD_CSD_V1
¶ 1
0
-
SD_CSD_V2
¶ 1
1
-
SD_CSD_VUNSUPPORTED
¶ 1
-1
-
R1_POLLING_RETRY_CNT
¶ 1
1000000
-
SD_DATA_TOKEN_RETRY_CNT
¶ 1
1000000
-
INIT_CMD_RETRY_CNT
¶ 1
1000000
-
INIT_CMD0_RETRY_CNT
¶ 1
3
-
SD_WAIT_FOR_NOT_BUSY_CNT
¶ 1
1000000 /* use -1 for full blocking till the card isn't busy */
-
SD_BLOCK_READ_CMD_RETRIES
¶ 1
10 /* only affects sending of cmd not whole transaction! */
-
SD_BLOCK_WRITE_CMD_RETRIES
¶ 1
10 /* only affects sending of cmd not whole transaction! */
-
SD_CSD_V2_C_SIZE_BLOCK_MULT
¶ 1
1024
-
SD_CARD_SPI_MODE
¶ 1
SPI_MODE_0
-
SD_CARD_SPI_SPEED_PREINIT
¶ 1
SPI_CLK_400KHZ
-
SD_CARD_SPI_SPEED_POSTINIT
¶ 1
SPI_CLK_10MHZ
-
SD_CARD_DUMMY_BYTE
¶ 1
0xFF
-
SDCARD_SPI_IEC_KIBI
¶ 1
(1024L)
-
SDCARD_SPI_SI_KILO
¶ 1
(1000L)
-
enum
sd_init_fsm_state_t
¶ - SD_INIT_START
- SD_INIT_SPI_POWER_SEQ
- SD_INIT_SEND_CMD0
- SD_INIT_SEND_CMD8
- SD_INIT_CARD_UNKNOWN
- SD_INIT_SEND_ACMD41_HCS
- SD_INIT_SEND_ACMD41
- SD_INIT_SEND_CMD1
- SD_INIT_SEND_CMD58
- SD_INIT_SEND_CMD16
- SD_INIT_ENABLE_CRC
- SD_INIT_READ_CID
- SD_INIT_READ_CSD
- SD_INIT_SET_MAX_SPI_SPEED
- SD_INIT_FINISH
-
char
sdcard_spi_send_cmd
(sdcard_spi_t * card, char sd_cmd_idx, uint32_t argument, int32_t max_retry)¶ Sends a cmd to the sd card.
Parameters
card: Initialized sd-card struct sd_cmd_idx: A supported sd-card command index for SPI-mode like defined in “7.3.1.3 Detailed Command Description” of sd spec. (for CMDX this parameter is simply the integer value X). argument: The argument for the given cmd. As described by “7.3.1.1 Command Format”. This argument is transmitted byte wise with most significant byte first. max_retry: Specifies how often the command should be retried if an error occures. Use 0 to try only once, -1 to try forever, or n to retry n times. Return values
- R1 response of the command if no (low-level) communication error occured
- SD_INVALID_R1_RESPONSE if either waiting for the card to enter not-busy-state timed out or spi communication failed
-
char
sdcard_spi_send_acmd
(sdcard_spi_t * card, char sd_cmd_idx, uint32_t argument, int32_t max_retry)¶ Sends an acmd to the sd card.
ACMD<n> consists of sending CMD55 + CMD<n>
Parameters
card: Initialized sd-card struct sd_cmd_idx: A supported sd-card command index for SPI-mode like defined in “7.3.1.3 Detailed Command Description” of sd spec. (for ACMDX this parameter is simply the integer value X). argument: The argument for the given cmd. As described by “7.3.1.1 Command Format”. This argument is transmitted byte wise with most significant byte first. max_retry: Specifies how often the command should be retried if an error occures. Use 0 to try only once, -1 to try forever, or n to retry n times. Return values
- R1 response of the command if no (low-level) communication error occured
- SD_INVALID_R1_RESPONSE if either waiting for the card to enter not-busy-state timed out or spi communication failed
-
uint32_t
sdcard_spi_get_sector_count
(sdcard_spi_t * card)¶ Gets the sector count of the card.
Parameters
card: Initialized sd-card struct Return values
- number of available sectors
-
uint32_t
sdcard_spi_get_au_size
(sdcard_spi_t * card)¶ Gets the allocation unit size of the card.
Parameters
card: Initialized sd-card struct Return values
- size of AU in bytes
-
sdcard_spi.h::sd_rw_response_t
sdcard_spi_read_sds
(sdcard_spi_t * card, sd_status_t * sd_status)¶ Gets the SD status of the card.
Parameters
card: Initialized sd-card struct sd_status: memory location where status struct is stored Return values
- sd_status_t struct that contains all SD status information