STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
sd_spi.c
Go to the documentation of this file.
1#include "sd_spi.h"
2
3uint8_t sd_crc7(const uint8_t* data, uint8_t len) {
4 uint8_t crc = 0;
5 for (uint8_t i = 0; i < len; ++i) {
6 for (int bit = 7; bit >= 0; --bit) {
7 uint8_t in = (uint8_t)(((data[i] >> bit) & 1U) ^ ((crc >> 6) & 1U));
8 crc = (uint8_t)((crc << 1) & 0x7FU);
9 if (in) {
10 crc ^= 0x09U;
11 }
12 }
13 }
14 return crc;
15}
16
17void sd_command_frame(uint8_t out[6], uint8_t index, uint32_t argument) {
18 out[0] = (uint8_t)(0x40U | (index & 0x3FU));
19 out[1] = (uint8_t)(argument >> 24);
20 out[2] = (uint8_t)(argument >> 16);
21 out[3] = (uint8_t)(argument >> 8);
22 out[4] = (uint8_t)argument;
23 out[5] = (uint8_t)((sd_crc7(out, 5) << 1) | 1U);
24}
25
26bool sd_r7_ok(const uint8_t r7[4]) {
27 return (r7[2] & 0x0FU) == ((SD_CMD8_ARG >> 8) & 0x0FU) &&
28 r7[3] == (SD_CMD8_ARG & 0xFFU);
29}
30
31bool sd_cid_ok(const uint8_t cid[16]) {
32 /* A floating MISO reads all 0xFF, and 16 x 0xFF happens to satisfy the
33 * CRC7 (CRC7 of 15 x 0xFF is 0x7F). Reject uniform contents first. */
34 bool all_ff = true, all_00 = true;
35 for (uint8_t i = 0; i < 16; ++i) {
36 all_ff = all_ff && cid[i] == 0xFFU;
37 all_00 = all_00 && cid[i] == 0x00U;
38 }
39 if (all_ff || all_00) {
40 return false;
41 }
42 return cid[15] == (uint8_t)((sd_crc7(cid, 15) << 1) | 1U);
43}
bool sd_r7_ok(const uint8_t r7[4])
Definition sd_spi.c:26
void sd_command_frame(uint8_t out[6], uint8_t index, uint32_t argument)
Definition sd_spi.c:17
uint8_t sd_crc7(const uint8_t *data, uint8_t len)
Definition sd_spi.c:3
bool sd_cid_ok(const uint8_t cid[16])
Definition sd_spi.c:31
#define SD_CMD8_ARG
Definition sd_spi.h:24