RX

Dependencies:   mbed BufferedSerial SX1276GenericLib X_NUCLEO_IKS01A2

Committer:
LucasKB
Date:
Mon Jun 17 00:10:40 2019 +0000
Revision:
2:e7d7e80256cc
RX;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
LucasKB 2:e7d7e80256cc 1 #include "SDCard_Y.hh"
LucasKB 2:e7d7e80256cc 2
LucasKB 2:e7d7e80256cc 3
LucasKB 2:e7d7e80256cc 4
LucasKB 2:e7d7e80256cc 5 #define SD_COMMAND_TIMEOUT 5000
LucasKB 2:e7d7e80256cc 6
LucasKB 2:e7d7e80256cc 7 #define R1_IDLE_STATE (1 << 0)
LucasKB 2:e7d7e80256cc 8 #define R1_ERASE_RESET (1 << 1)
LucasKB 2:e7d7e80256cc 9 #define R1_ILLEGAL_COMMAND (1 << 2)
LucasKB 2:e7d7e80256cc 10 #define R1_COM_CRC_ERROR (1 << 3)
LucasKB 2:e7d7e80256cc 11 #define R1_ERASE_SEQUENCE_ERROR (1 << 4)
LucasKB 2:e7d7e80256cc 12 #define R1_ADDRESS_ERROR (1 << 5)
LucasKB 2:e7d7e80256cc 13 #define R1_PARAMETER_ERROR (1 << 6)
LucasKB 2:e7d7e80256cc 14
LucasKB 2:e7d7e80256cc 15
LucasKB 2:e7d7e80256cc 16
LucasKB 2:e7d7e80256cc 17
LucasKB 2:e7d7e80256cc 18 SDCard::SDCard(SPI *t_spi, PinName t_cs) : cs(t_cs)
LucasKB 2:e7d7e80256cc 19 {
LucasKB 2:e7d7e80256cc 20 spi = t_spi;
LucasKB 2:e7d7e80256cc 21 cs = 1;
LucasKB 2:e7d7e80256cc 22 }
LucasKB 2:e7d7e80256cc 23
LucasKB 2:e7d7e80256cc 24 SDCard::~SDCard()
LucasKB 2:e7d7e80256cc 25 {
LucasKB 2:e7d7e80256cc 26 delete spi;
LucasKB 2:e7d7e80256cc 27 }
LucasKB 2:e7d7e80256cc 28
LucasKB 2:e7d7e80256cc 29 int SDCard::init(void)
LucasKB 2:e7d7e80256cc 30 {
LucasKB 2:e7d7e80256cc 31 spi->frequency(100000);
LucasKB 2:e7d7e80256cc 32 cs = 1;
LucasKB 2:e7d7e80256cc 33
LucasKB 2:e7d7e80256cc 34 for( int i=0 ; i<16 ; i++)
LucasKB 2:e7d7e80256cc 35 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 36
LucasKB 2:e7d7e80256cc 37 if(cmd(0,0) != R1_IDLE_STATE)
LucasKB 2:e7d7e80256cc 38 return -1;
LucasKB 2:e7d7e80256cc 39
LucasKB 2:e7d7e80256cc 40 int r = cmd8();
LucasKB 2:e7d7e80256cc 41
LucasKB 2:e7d7e80256cc 42 if(r == R1_IDLE_STATE){
LucasKB 2:e7d7e80256cc 43 return init_card_v2();
LucasKB 2:e7d7e80256cc 44 } else if(r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {
LucasKB 2:e7d7e80256cc 45 return init_card_v1();
LucasKB 2:e7d7e80256cc 46 } else {
LucasKB 2:e7d7e80256cc 47 return -1;
LucasKB 2:e7d7e80256cc 48 }
LucasKB 2:e7d7e80256cc 49
LucasKB 2:e7d7e80256cc 50 return 0;
LucasKB 2:e7d7e80256cc 51 }
LucasKB 2:e7d7e80256cc 52
LucasKB 2:e7d7e80256cc 53 int SDCard::init_card_v1()
LucasKB 2:e7d7e80256cc 54 {
LucasKB 2:e7d7e80256cc 55 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++)
LucasKB 2:e7d7e80256cc 56 {
LucasKB 2:e7d7e80256cc 57 cmd(55, 0);
LucasKB 2:e7d7e80256cc 58 if(cmd(41, 0) == 0)
LucasKB 2:e7d7e80256cc 59 {
LucasKB 2:e7d7e80256cc 60 cdv = 512;
LucasKB 2:e7d7e80256cc 61 return 1;
LucasKB 2:e7d7e80256cc 62 }
LucasKB 2:e7d7e80256cc 63 }
LucasKB 2:e7d7e80256cc 64
LucasKB 2:e7d7e80256cc 65 return -1;
LucasKB 2:e7d7e80256cc 66 }
LucasKB 2:e7d7e80256cc 67
LucasKB 2:e7d7e80256cc 68
LucasKB 2:e7d7e80256cc 69 int SDCard::init_card_v2()
LucasKB 2:e7d7e80256cc 70 {
LucasKB 2:e7d7e80256cc 71 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++)
LucasKB 2:e7d7e80256cc 72 {
LucasKB 2:e7d7e80256cc 73 wait_ms(50);
LucasKB 2:e7d7e80256cc 74 cmd58();
LucasKB 2:e7d7e80256cc 75 cmd(55, 0);
LucasKB 2:e7d7e80256cc 76 if (cmd(41, 0x40000000) == 0)
LucasKB 2:e7d7e80256cc 77 {
LucasKB 2:e7d7e80256cc 78 cmd58();
LucasKB 2:e7d7e80256cc 79 cdv = 1;
LucasKB 2:e7d7e80256cc 80 return 2;
LucasKB 2:e7d7e80256cc 81 }
LucasKB 2:e7d7e80256cc 82 }
LucasKB 2:e7d7e80256cc 83
LucasKB 2:e7d7e80256cc 84 return -1;
LucasKB 2:e7d7e80256cc 85 }
LucasKB 2:e7d7e80256cc 86
LucasKB 2:e7d7e80256cc 87
LucasKB 2:e7d7e80256cc 88 int SDCard::cmd(int cmd, int arg)
LucasKB 2:e7d7e80256cc 89 {
LucasKB 2:e7d7e80256cc 90 cs = 0;
LucasKB 2:e7d7e80256cc 91 spi->write(0x40 | cmd);
LucasKB 2:e7d7e80256cc 92 spi->write(arg >> 24);
LucasKB 2:e7d7e80256cc 93 spi->write(arg >> 16);
LucasKB 2:e7d7e80256cc 94 spi->write(arg >> 8);
LucasKB 2:e7d7e80256cc 95 spi->write(arg >> 0);
LucasKB 2:e7d7e80256cc 96 spi->write(0x95);
LucasKB 2:e7d7e80256cc 97
LucasKB 2:e7d7e80256cc 98 for( int i=0 ; i<SD_COMMAND_TIMEOUT ; i++)
LucasKB 2:e7d7e80256cc 99 {
LucasKB 2:e7d7e80256cc 100 int respuesta = spi->write(0xFF);
LucasKB 2:e7d7e80256cc 101 if( !(respuesta & 0x80) )
LucasKB 2:e7d7e80256cc 102 {
LucasKB 2:e7d7e80256cc 103 cs = 1;
LucasKB 2:e7d7e80256cc 104 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 105 return respuesta;
LucasKB 2:e7d7e80256cc 106 }
LucasKB 2:e7d7e80256cc 107 }
LucasKB 2:e7d7e80256cc 108
LucasKB 2:e7d7e80256cc 109 cs = 1;
LucasKB 2:e7d7e80256cc 110 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 111 return -1;
LucasKB 2:e7d7e80256cc 112
LucasKB 2:e7d7e80256cc 113 }
LucasKB 2:e7d7e80256cc 114
LucasKB 2:e7d7e80256cc 115
LucasKB 2:e7d7e80256cc 116 int SDCard::cmd8()
LucasKB 2:e7d7e80256cc 117 {
LucasKB 2:e7d7e80256cc 118 cs = 0;
LucasKB 2:e7d7e80256cc 119
LucasKB 2:e7d7e80256cc 120 spi->write(0x40 | 8); // CMD8
LucasKB 2:e7d7e80256cc 121 spi->write(0x00); // reserved
LucasKB 2:e7d7e80256cc 122 spi->write(0x00); // reserved
LucasKB 2:e7d7e80256cc 123 spi->write(0x01); // 3.3v
LucasKB 2:e7d7e80256cc 124 spi->write(0xAA); // check pattern
LucasKB 2:e7d7e80256cc 125 spi->write(0x87); // crc
LucasKB 2:e7d7e80256cc 126
LucasKB 2:e7d7e80256cc 127 for( int i=0 ; i<SD_COMMAND_TIMEOUT * 1000 ; i++)
LucasKB 2:e7d7e80256cc 128 {
LucasKB 2:e7d7e80256cc 129 char respuesta[5];
LucasKB 2:e7d7e80256cc 130 respuesta[0] = spi->write(0xFF);
LucasKB 2:e7d7e80256cc 131
LucasKB 2:e7d7e80256cc 132 if( !(respuesta[0] & 0x80))
LucasKB 2:e7d7e80256cc 133 {
LucasKB 2:e7d7e80256cc 134 for( int j=1; j<5 ; j++)
LucasKB 2:e7d7e80256cc 135 respuesta[i] = spi->write(0xFF);
LucasKB 2:e7d7e80256cc 136
LucasKB 2:e7d7e80256cc 137 cs = 1;
LucasKB 2:e7d7e80256cc 138 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 139 return respuesta[0];
LucasKB 2:e7d7e80256cc 140 }
LucasKB 2:e7d7e80256cc 141 }
LucasKB 2:e7d7e80256cc 142
LucasKB 2:e7d7e80256cc 143 cs = 1;
LucasKB 2:e7d7e80256cc 144 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 145 return -1;
LucasKB 2:e7d7e80256cc 146
LucasKB 2:e7d7e80256cc 147 }
LucasKB 2:e7d7e80256cc 148
LucasKB 2:e7d7e80256cc 149
LucasKB 2:e7d7e80256cc 150
LucasKB 2:e7d7e80256cc 151 int SDCard::cmd58()
LucasKB 2:e7d7e80256cc 152 {
LucasKB 2:e7d7e80256cc 153 cs = 0;
LucasKB 2:e7d7e80256cc 154
LucasKB 2:e7d7e80256cc 155 int arg = 0;
LucasKB 2:e7d7e80256cc 156
LucasKB 2:e7d7e80256cc 157 spi->write(0x40 | 58);
LucasKB 2:e7d7e80256cc 158 spi->write(arg >> 24);
LucasKB 2:e7d7e80256cc 159 spi->write(arg >> 16);
LucasKB 2:e7d7e80256cc 160 spi->write(arg >> 8);
LucasKB 2:e7d7e80256cc 161 spi->write(arg >> 0);
LucasKB 2:e7d7e80256cc 162 spi->write(0x95);
LucasKB 2:e7d7e80256cc 163
LucasKB 2:e7d7e80256cc 164 // wait for the repsonse (response[7] == 0)
LucasKB 2:e7d7e80256cc 165 for(int i = 0; i < SD_COMMAND_TIMEOUT; i++)
LucasKB 2:e7d7e80256cc 166 {
LucasKB 2:e7d7e80256cc 167 int respuesta = spi->write(0xFF);
LucasKB 2:e7d7e80256cc 168
LucasKB 2:e7d7e80256cc 169 if( !(respuesta & 0x80) )
LucasKB 2:e7d7e80256cc 170 {
LucasKB 2:e7d7e80256cc 171 int ocr = spi->write(0xFF) << 24;
LucasKB 2:e7d7e80256cc 172 ocr |= spi->write(0xFF) << 16;
LucasKB 2:e7d7e80256cc 173 ocr |= spi->write(0xFF) << 8;
LucasKB 2:e7d7e80256cc 174 ocr |= spi->write(0xFF) << 0;
LucasKB 2:e7d7e80256cc 175 cs = 1;
LucasKB 2:e7d7e80256cc 176 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 177 return respuesta;
LucasKB 2:e7d7e80256cc 178 }
LucasKB 2:e7d7e80256cc 179 }
LucasKB 2:e7d7e80256cc 180 cs = 1;
LucasKB 2:e7d7e80256cc 181 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 182
LucasKB 2:e7d7e80256cc 183 return -1; // timeout
LucasKB 2:e7d7e80256cc 184 }
LucasKB 2:e7d7e80256cc 185
LucasKB 2:e7d7e80256cc 186
LucasKB 2:e7d7e80256cc 187
LucasKB 2:e7d7e80256cc 188 bool SDCard::read(uint8_t *vect, int post)
LucasKB 2:e7d7e80256cc 189 {
LucasKB 2:e7d7e80256cc 190 while( cmd(17,post*512) == -1);
LucasKB 2:e7d7e80256cc 191
LucasKB 2:e7d7e80256cc 192 cs = 0;
LucasKB 2:e7d7e80256cc 193
LucasKB 2:e7d7e80256cc 194 while (spi->write(0xFF) != 0xFE);
LucasKB 2:e7d7e80256cc 195
LucasKB 2:e7d7e80256cc 196 for (uint32_t i = 0; i < 512; i++)
LucasKB 2:e7d7e80256cc 197 *(vect+i) = spi->write(0xFF);
LucasKB 2:e7d7e80256cc 198
LucasKB 2:e7d7e80256cc 199 spi->write(0xFF); // checksum
LucasKB 2:e7d7e80256cc 200 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 201
LucasKB 2:e7d7e80256cc 202 cs = 1;
LucasKB 2:e7d7e80256cc 203 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 204
LucasKB 2:e7d7e80256cc 205 while(cmd(12,512) == -1);
LucasKB 2:e7d7e80256cc 206
LucasKB 2:e7d7e80256cc 207 return 1;
LucasKB 2:e7d7e80256cc 208 }
LucasKB 2:e7d7e80256cc 209
LucasKB 2:e7d7e80256cc 210
LucasKB 2:e7d7e80256cc 211
LucasKB 2:e7d7e80256cc 212 bool SDCard::write(uint8_t *vect, int post)
LucasKB 2:e7d7e80256cc 213 {
LucasKB 2:e7d7e80256cc 214
LucasKB 2:e7d7e80256cc 215 while( cmd(24,post*512) == -1 );
LucasKB 2:e7d7e80256cc 216
LucasKB 2:e7d7e80256cc 217 cs = 0;
LucasKB 2:e7d7e80256cc 218
LucasKB 2:e7d7e80256cc 219 spi->write(0xFE);
LucasKB 2:e7d7e80256cc 220
LucasKB 2:e7d7e80256cc 221 for (uint32_t i = 0; i < 512; i++)
LucasKB 2:e7d7e80256cc 222 spi->write(*(vect+i));
LucasKB 2:e7d7e80256cc 223
LucasKB 2:e7d7e80256cc 224 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 225 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 226
LucasKB 2:e7d7e80256cc 227 if( (spi->write(0xFF) & 0x1F) != 0x05 )
LucasKB 2:e7d7e80256cc 228 {
LucasKB 2:e7d7e80256cc 229 cs = 1;
LucasKB 2:e7d7e80256cc 230 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 231 return 0;
LucasKB 2:e7d7e80256cc 232 }
LucasKB 2:e7d7e80256cc 233
LucasKB 2:e7d7e80256cc 234 while(spi->write(0xFF) == 0);
LucasKB 2:e7d7e80256cc 235
LucasKB 2:e7d7e80256cc 236 cs = 1;
LucasKB 2:e7d7e80256cc 237 spi->write(0xFF);
LucasKB 2:e7d7e80256cc 238
LucasKB 2:e7d7e80256cc 239 while(cmd(12,512) == -1);
LucasKB 2:e7d7e80256cc 240
LucasKB 2:e7d7e80256cc 241 return 1;
LucasKB 2:e7d7e80256cc 242
LucasKB 2:e7d7e80256cc 243 }