Loading...
Searching...
No Matches
sdcard_spi_internal.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016 Michel Rottleuthner <michel.rottleuthner@haw-hamburg.de>
3 *
4 * This file is subject to the terms and conditions of the GNU Lesser
5 * General Public License v2.1. See the file LICENSE in the top level
6 * directory for more details.
7 */
8
9#pragma once
10
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30#include "periph/spi.h"
31#include "periph/gpio.h"
32#include "stdbool.h"
33#include "sdcard_spi.h"
34#include "timex.h"
35#include "board.h"
36
37/* number of clocks that should be applied to the card on init
38 before taking further actions (see sd spec. 6.4.1.1 Power Up Time of Card) */
39#define SD_POWERSEQUENCE_CLOCK_COUNT 74
40
41#define SD_CARD_PREINIT_CLOCK_PERIOD_US 10 /* used to generate 100 kHz clock in init phase*/
42#define SD_CARD_WAIT_AFTER_POWER_UP_US 1000
43
44/* R1 response bits (see sd spec. 7.3.2.1 Format R1) */
45#define SD_R1_RESPONSE_PARAM_ERROR (1<<6)
46#define SD_R1_RESPONSE_ADDR_ERROR (1<<5)
47#define SD_R1_RESPONSE_ERASE_SEQ_ERROR (1<<4)
48#define SD_R1_RESPONSE_CMD_CRC_ERROR (1<<3)
49#define SD_R1_RESPONSE_ILLEGAL_CMD_ERROR (1<<2)
50#define SD_R1_RESPONSE_ERASE_RESET (1<<1)
51#define SD_R1_RESPONSE_IN_IDLE_STATE (0x01)
52#define SD_INVALID_R1_RESPONSE (1<<7)
53
54#define R1_VALID(X) (((X) >> 7) == 0)
55#define R1_PARAM_ERR(X) ((((X) &SD_R1_RESPONSE_PARAM_ERROR) != 0))
56#define R1_ADDR_ERR(X) ((((X) &SD_R1_RESPONSE_ADDR_ERROR) != 0))
57#define R1_ERASE_ERR(X) ((((X) &SD_R1_RESPONSE_ERASE_SEQ_ERROR) != 0))
58#define R1_CMD_CRC_ERR(X) ((((X) &SD_R1_RESPONSE_CMD_CRC_ERROR) != 0))
59#define R1_ILL_CMD_ERR(X) ((((X) &SD_R1_RESPONSE_ILLEGAL_CMD_ERROR) != 0))
60#define R1_IDLE_BIT_SET(X) (((X) &SD_R1_RESPONSE_IN_IDLE_STATE) != 0)
61#define R1_ERROR(X) (R1_PARAM_ERR(X) || R1_ADDR_ERR(X) || R1_ERASE_ERR(X) || \
62 R1_CMD_CRC_ERR(X) || R1_ILL_CMD_ERR(X))
63
64/* see sd spec. 7.3.3.1 Data Response Token */
65#define DATA_RESPONSE_IS_VALID(X) (((X) & 0x11) == 0x01)
66#define DATA_RESPONSE_ACCEPTED(X) (((X) & 0x0E) == (1<<2))
67#define DATA_RESPONSE_CRC_ERR(X) (((X) & 0x0E) == 0x0A)
68#define DATA_RESPONSE_WRITE_ERR(X) (((X) & 0x0E) == 0x0C)
69
70/* see sd spec. 5.1 OCR register */
71#define OCR_VOLTAGE_3_2_TO_3_3 (1L << 20)
72#define OCR_VOLTAGE_3_3_TO_3_4 (1L << 21)
73
74/* card capacity status (CCS=0: the card is SDSD; CCS=1: card is SDHC or SDXC) */
75#define OCR_CCS (1L << 30)
76
77/* This bit is set to low if the card has not finished power up routine */
78#define OCR_POWER_UP_STATUS (1L << 31)
79
80/* to ensure the voltage range check on init is done properly you need to
81 define this according to your actual interface/wiring with the sd-card */
82#define SYSTEM_VOLTAGE (OCR_VOLTAGE_3_2_TO_3_3 | OCR_VOLTAGE_3_2_TO_3_3)
83
84/* see sd spec. 7.3.1.3 Detailed Command Description */
85#define SD_CMD_PREFIX_MASK (1<<6)
86
87#define SD_CMD_0 0 /* Resets the SD Memory Card */
88#define SD_CMD_1 1 /* Sends host capacity support info and starts the cards init process */
89#define SD_CMD_8 8 /* Sends SD Card interface condition incl. host supply voltage info */
90#define SD_CMD_9 9 /* Asks the selected card to send its card-specific data (CSD) */
91#define SD_CMD_10 10 /* Asks the selected card to send its card identification (CID) */
92#define SD_CMD_12 12 /* Forces the card to stop transmission in Multiple Block Read Operation */
93#define SD_CMD_13 13 /* Sent as ACMD13 asks the card to send it's SD status */
94
95#define SD_CMD_16 16 /* In case of SDSC Card, block length is set by this command */
96#define SD_CMD_17 17 /* Reads a block of the size selected by the SET_BLOCKLEN command */
97#define SD_CMD_18 18 /* Continuously transfers data blocks from card to host
98 until interrupted by a STOP_TRANSMISSION command */
99#define SD_CMD_24 24 /* Writes a block of the size selected by the SET_BLOCKLEN command */
100#define SD_CMD_25 25 /* Continuously writes blocks of data until 'Stop Tran'token is sent */
101#define SD_CMD_41 41 /* Reserved (used for ACMD41) */
102#define SD_CMD_55 55 /* Defines to the card that the next command is an application specific
103 command rather than a standard command */
104#define SD_CMD_58 58 /* Reads the OCR register of a card */
105#define SD_CMD_59 59 /* Turns the CRC option on or off. Argument: 1:on; 0:off */
106
107#define SD_CMD_8_VHS_2_7_V_TO_3_6_V 0x01
108#define SD_CMD_8_CHECK_PATTERN 0xB5
109#define SD_CMD_NO_ARG 0x00000000
110#define SD_ACMD_41_ARG_HC 0x40000000
111#define SD_CMD_59_ARG_EN 0x00000001
112#define SD_CMD_59_ARG_DIS 0x00000000
113
114/* see sd spec. 7.3.3 Control Tokens */
115#define SD_DATA_TOKEN_CMD_17_18_24 0xFE
116#define SD_DATA_TOKEN_CMD_25 0xFC
117#define SD_DATA_TOKEN_CMD_25_STOP 0xFD
118
119#define SD_SIZE_OF_CID_AND_CSD_REG 16
120#define SD_SIZE_OF_SD_STATUS 64
121#define SD_BLOCKS_FOR_REG_READ 1
122#define SD_GET_CSD_STRUCTURE(CSD_RAW_DATA) ((CSD_RAW_DATA)[0] >> 6)
123#define SD_CSD_V1 0
124#define SD_CSD_V2 1
125#define SD_CSD_VUNSUPPORTED -1
126
136#ifndef INIT_CMD_RETRY_US
137#define INIT_CMD_RETRY_US (250 * US_PER_MS)
138#endif
139#ifndef INIT_CMD0_RETRY_US
140#define INIT_CMD0_RETRY_US (100UL)
141#endif
142#ifndef R1_POLLING_RETRY_US
143#define R1_POLLING_RETRY_US (100 * US_PER_MS)
144#endif
145#ifndef SD_DATA_TOKEN_RETRY_US
146#define SD_DATA_TOKEN_RETRY_US (100 * US_PER_MS)
147#endif
148#ifndef SD_WAIT_FOR_NOT_BUSY_US
149#define SD_WAIT_FOR_NOT_BUSY_US (250 * US_PER_MS)
150#endif
151#ifndef SD_BLOCK_READ_CMD_RETRY_US
152#define SD_BLOCK_READ_CMD_RETRY_US (100UL)
153#endif
154#ifndef SD_BLOCK_WRITE_CMD_RETRY_US
155#define SD_BLOCK_WRITE_CMD_RETRY_US (100UL)
156#endif
158
162#define SD_CSD_V2_C_SIZE_BLOCK_MULT 1024
163
167#ifndef SD_CARD_SPI_MODE
168#define SD_CARD_SPI_MODE SPI_MODE_0
169#endif
170
174#ifndef SD_CARD_SPI_SPEED_PREINIT
175#define SD_CARD_SPI_SPEED_PREINIT SPI_CLK_400KHZ
176#endif
177
181#ifndef SD_CARD_SPI_SPEED_POSTINIT
182#define SD_CARD_SPI_SPEED_POSTINIT SPI_CLK_10MHZ
183#endif
184
188#define SD_CARD_DUMMY_BYTE (0xFF)
189
193#define SDCARD_SPI_IEC_KIBI (1024L)
194
198#define SDCARD_SPI_SI_KILO (1000L)
199
202 * @{
203 */
204typedef enum {
205 SD_INIT_START,
206 SD_INIT_SPI_POWER_SEQ,
207 SD_INIT_SEND_CMD0,
208 SD_INIT_SEND_CMD8,
209 SD_INIT_CARD_UNKNOWN,
210 SD_INIT_SEND_ACMD41_HCS,
211 SD_INIT_SEND_ACMD41,
212 SD_INIT_SEND_CMD1,
213 SD_INIT_SEND_CMD58,
214 SD_INIT_SEND_CMD16,
215 SD_INIT_ENABLE_CRC,
216 SD_INIT_READ_CID,
217 SD_INIT_READ_CSD,
218 SD_INIT_SET_MAX_SPI_SPEED,
219 SD_INIT_FINISH
222
239uint8_t sdcard_spi_send_cmd(sdcard_spi_t *card, uint8_t sd_cmd_idx, uint32_t argument, uint32_t retry_us);
240
257uint8_t sdcard_spi_send_acmd(sdcard_spi_t *card, uint8_t sd_cmd_idx, uint32_t argument, uint32_t retry_us);
258
267
276
286
287#ifdef __cplusplus
288}
289#endif
290
Low-level GPIO peripheral driver interface definitions.
sd_rw_response_t
sdcard_spi r/w-operation return values
Definition sdcard_spi.h:161
Public interface for the sdcard_spi driver.
uint8_t sdcard_spi_send_cmd(sdcard_spi_t *card, uint8_t sd_cmd_idx, uint32_t argument, uint32_t retry_us)
Sends a cmd to the sd card.
uint8_t sdcard_spi_send_acmd(sdcard_spi_t *card, uint8_t sd_cmd_idx, uint32_t argument, uint32_t retry_us)
Sends an acmd to the sd card.
sd_rw_response_t sdcard_spi_read_sds(sdcard_spi_t *card, sd_status_t *sd_status)
Gets the SD status of the card.
uint32_t sdcard_spi_get_sector_count(sdcard_spi_t *card)
Gets the sector count of the card.
uint32_t sdcard_spi_get_au_size(sdcard_spi_t *card)
Gets the allocation unit size of the card.
sd_init_fsm_state_t
SD card driver internal states.
Low-level SPI peripheral driver interface definition.
SD status register (see section 4.10.2 in SD-Spec v5.00)
Definition sdcard_spi.h:130
Device descriptor for sdcard_spi.
Definition sdcard_spi.h:187
Utility library for comparing and computing timestamps.