You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

fatfs_sd.c 9.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  1. #define TRUE 1
  2. #define FALSE 0
  3. #define bool BYTE
  4. #include "stm32f4xx_hal.h"
  5. #include "diskio.h"
  6. #include "fatfs_sd.h"
  7. uint16_t Timer1, Timer2; /* 1ms Timer Counter */
  8. static volatile DSTATUS Stat = STA_NOINIT; /* Disk Status */
  9. static uint8_t CardType; /* Type 0:MMC, 1:SDC, 2:Block addressing */
  10. static uint8_t PowerFlag = 0; /* Power flag */
  11. /***************************************
  12. * SPI functions
  13. **************************************/
  14. /* slave select */
  15. static void SELECT(void)
  16. {
  17. HAL_GPIO_WritePin(SD_CS_PORT, SD_CS_PIN, GPIO_PIN_RESET);
  18. HAL_Delay(1);
  19. }
  20. /* slave deselect */
  21. static void DESELECT(void)
  22. {
  23. HAL_GPIO_WritePin(SD_CS_PORT, SD_CS_PIN, GPIO_PIN_SET);
  24. HAL_Delay(1);
  25. }
  26. /* SPI transmit a byte */
  27. static void SPI_TxByte(uint8_t data)
  28. {
  29. while(!__HAL_SPI_GET_FLAG(HSPI_SDCARD, SPI_FLAG_TXE));
  30. HAL_SPI_Transmit(HSPI_SDCARD, &data, 1, SPI_TIMEOUT);
  31. }
  32. /* SPI transmit buffer */
  33. static void SPI_TxBuffer(uint8_t *buffer, uint16_t len)
  34. {
  35. while(!__HAL_SPI_GET_FLAG(HSPI_SDCARD, SPI_FLAG_TXE));
  36. HAL_SPI_Transmit(HSPI_SDCARD, buffer, len, SPI_TIMEOUT);
  37. }
  38. /* SPI receive a byte */
  39. static uint8_t SPI_RxByte(void)
  40. {
  41. uint8_t dummy, data;
  42. dummy = 0xFF;
  43. while(!__HAL_SPI_GET_FLAG(HSPI_SDCARD, SPI_FLAG_TXE));
  44. HAL_SPI_TransmitReceive(HSPI_SDCARD, &dummy, &data, 1, SPI_TIMEOUT);
  45. return data;
  46. }
  47. /* SPI receive a byte via pointer */
  48. static void SPI_RxBytePtr(uint8_t *buff)
  49. {
  50. *buff = SPI_RxByte();
  51. }
  52. /***************************************
  53. * SD functions
  54. **************************************/
  55. /* wait SD ready */
  56. static uint8_t SD_ReadyWait(void)
  57. {
  58. uint8_t res;
  59. /* timeout 500ms */
  60. Timer2 = 500;
  61. /* if SD goes ready, receives 0xFF */
  62. do {
  63. res = SPI_RxByte();
  64. } while ((res != 0xFF) && Timer2);
  65. return res;
  66. }
  67. /* power on */
  68. static void SD_PowerOn(void)
  69. {
  70. uint8_t args[6];
  71. uint32_t cnt = 0x1FFF;
  72. /* transmit bytes to wake up */
  73. DESELECT();
  74. for(int i = 0; i < 10; i++)
  75. {
  76. SPI_TxByte(0xFF);
  77. }
  78. /* slave select */
  79. SELECT();
  80. /* make idle state */
  81. args[0] = CMD0; /* CMD0:GO_IDLE_STATE */
  82. args[1] = 0;
  83. args[2] = 0;
  84. args[3] = 0;
  85. args[4] = 0;
  86. args[5] = 0x95; /* CRC */
  87. SPI_TxBuffer(args, sizeof(args));
  88. /* wait response */
  89. while ((SPI_RxByte() != 0x01) && cnt)
  90. {
  91. cnt--;
  92. }
  93. DESELECT();
  94. SPI_TxByte(0XFF);
  95. PowerFlag = 1;
  96. }
  97. /* power off */
  98. static void SD_PowerOff(void)
  99. {
  100. PowerFlag = 0;
  101. }
  102. /* check power flag */
  103. static uint8_t SD_CheckPower(void)
  104. {
  105. return PowerFlag;
  106. }
  107. /* receive data block */
  108. static bool SD_RxDataBlock(BYTE *buff, UINT len)
  109. {
  110. uint8_t token;
  111. /* timeout 200ms */
  112. Timer1 = 200;
  113. /* loop until receive a response or timeout */
  114. do {
  115. token = SPI_RxByte();
  116. } while((token == 0xFF) && Timer1);
  117. /* invalid response */
  118. if(token != 0xFE) return FALSE;
  119. /* receive data */
  120. do {
  121. SPI_RxBytePtr(buff++);
  122. } while(len--);
  123. /* discard CRC */
  124. SPI_RxByte();
  125. SPI_RxByte();
  126. return TRUE;
  127. }
  128. /* transmit data block */
  129. #if _USE_WRITE == 1
  130. static bool SD_TxDataBlock(const uint8_t *buff, BYTE token)
  131. {
  132. uint8_t resp;
  133. uint8_t i = 0;
  134. /* wait SD ready */
  135. if (SD_ReadyWait() != 0xFF) return FALSE;
  136. /* transmit token */
  137. SPI_TxByte(token);
  138. /* if it's not STOP token, transmit data */
  139. if (token != 0xFD)
  140. {
  141. SPI_TxBuffer((uint8_t*)buff, 512);
  142. /* discard CRC */
  143. SPI_RxByte();
  144. SPI_RxByte();
  145. /* receive response */
  146. while (i <= 64)
  147. {
  148. resp = SPI_RxByte();
  149. /* transmit 0x05 accepted */
  150. if ((resp & 0x1F) == 0x05) break;
  151. i++;
  152. }
  153. /* recv buffer clear */
  154. while (SPI_RxByte() == 0);
  155. }
  156. /* transmit 0x05 accepted */
  157. if ((resp & 0x1F) == 0x05) return TRUE;
  158. return FALSE;
  159. }
  160. #endif /* _USE_WRITE */
  161. /* transmit command */
  162. static BYTE SD_SendCmd(BYTE cmd, uint32_t arg)
  163. {
  164. uint8_t crc, res;
  165. /* wait SD ready */
  166. if (SD_ReadyWait() != 0xFF) return 0xFF;
  167. /* transmit command */
  168. SPI_TxByte(cmd); /* Command */
  169. SPI_TxByte((uint8_t)(arg >> 24)); /* Argument[31..24] */
  170. SPI_TxByte((uint8_t)(arg >> 16)); /* Argument[23..16] */
  171. SPI_TxByte((uint8_t)(arg >> 8)); /* Argument[15..8] */
  172. SPI_TxByte((uint8_t)arg); /* Argument[7..0] */
  173. /* prepare CRC */
  174. if(cmd == CMD0) crc = 0x95; /* CRC for CMD0(0) */
  175. else if(cmd == CMD8) crc = 0x87; /* CRC for CMD8(0x1AA) */
  176. else crc = 1;
  177. /* transmit CRC */
  178. SPI_TxByte(crc);
  179. /* Skip a stuff byte when STOP_TRANSMISSION */
  180. if (cmd == CMD12) SPI_RxByte();
  181. /* receive response */
  182. uint8_t n = 10;
  183. do {
  184. res = SPI_RxByte();
  185. } while ((res & 0x80) && --n);
  186. return res;
  187. }
  188. /***************************************
  189. * user_diskio.c functions
  190. **************************************/
  191. /* initialize SD */
  192. DSTATUS SD_disk_initialize(BYTE drv)
  193. {
  194. uint8_t n, type, ocr[4];
  195. /* single drive, drv should be 0 */
  196. if(drv) return STA_NOINIT;
  197. /* no disk */
  198. if(Stat & STA_NODISK) return Stat;
  199. /* power on */
  200. SD_PowerOn();
  201. /* slave select */
  202. SELECT();
  203. /* check disk type */
  204. type = 0;
  205. /* send GO_IDLE_STATE command */
  206. if (SD_SendCmd(CMD0, 0) == 1)
  207. {
  208. /* timeout 1 sec */
  209. Timer1 = 1000;
  210. /* SDC V2+ accept CMD8 command, http://elm-chan.org/docs/mmc/mmc_e.html */
  211. if (SD_SendCmd(CMD8, 0x1AA) == 1)
  212. {
  213. /* operation condition register */
  214. for (n = 0; n < 4; n++)
  215. {
  216. ocr[n] = SPI_RxByte();
  217. }
  218. /* voltage range 2.7-3.6V */
  219. if (ocr[2] == 0x01 && ocr[3] == 0xAA)
  220. {
  221. /* ACMD41 with HCS bit */
  222. do {
  223. if (SD_SendCmd(CMD55, 0) <= 1 && SD_SendCmd(CMD41, 1UL << 30) == 0) break;
  224. } while (Timer1);
  225. /* READ_OCR */
  226. if (Timer1 && SD_SendCmd(CMD58, 0) == 0)
  227. {
  228. /* Check CCS bit */
  229. for (n = 0; n < 4; n++)
  230. {
  231. ocr[n] = SPI_RxByte();
  232. }
  233. /* SDv2 (HC or SC) */
  234. type = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;
  235. }
  236. }
  237. }
  238. else
  239. {
  240. /* SDC V1 or MMC */
  241. type = (SD_SendCmd(CMD55, 0) <= 1 && SD_SendCmd(CMD41, 0) <= 1) ? CT_SD1 : CT_MMC;
  242. do
  243. {
  244. if (type == CT_SD1)
  245. {
  246. if (SD_SendCmd(CMD55, 0) <= 1 && SD_SendCmd(CMD41, 0) == 0) break; /* ACMD41 */
  247. }
  248. else
  249. {
  250. if (SD_SendCmd(CMD1, 0) == 0) break; /* CMD1 */
  251. }
  252. } while (Timer1);
  253. /* SET_BLOCKLEN */
  254. if (!Timer1 || SD_SendCmd(CMD16, 512) != 0) type = 0;
  255. }
  256. }
  257. CardType = type;
  258. /* Idle */
  259. DESELECT();
  260. SPI_RxByte();
  261. /* Clear STA_NOINIT */
  262. if (type)
  263. {
  264. Stat &= ~STA_NOINIT;
  265. }
  266. else
  267. {
  268. /* Initialization failed */
  269. SD_PowerOff();
  270. }
  271. return Stat;
  272. }
  273. /* return disk status */
  274. DSTATUS SD_disk_status(BYTE drv)
  275. {
  276. if (drv) return STA_NOINIT;
  277. return Stat;
  278. }
  279. /* read sector */
  280. DRESULT SD_disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count)
  281. {
  282. /* pdrv should be 0 */
  283. if (pdrv || !count) return RES_PARERR;
  284. /* no disk */
  285. if (Stat & STA_NOINIT) return RES_NOTRDY;
  286. /* convert to byte address */
  287. if (!(CardType & CT_SD2)) sector *= 512;
  288. SELECT();
  289. if (count == 1)
  290. {
  291. /* READ_SINGLE_BLOCK */
  292. if ((SD_SendCmd(CMD17, sector) == 0) && SD_RxDataBlock(buff, 512)) count = 0;
  293. }
  294. else
  295. {
  296. /* READ_MULTIPLE_BLOCK */
  297. if (SD_SendCmd(CMD18, sector) == 0)
  298. {
  299. do {
  300. if (!SD_RxDataBlock(buff, 512)) break;
  301. buff += 512;
  302. } while (--count);
  303. /* STOP_TRANSMISSION */
  304. SD_SendCmd(CMD12, 0);
  305. }
  306. }
  307. /* Idle */
  308. DESELECT();
  309. SPI_RxByte();
  310. return count ? RES_ERROR : RES_OK;
  311. }
  312. /* write sector */
  313. #if _USE_WRITE == 1
  314. DRESULT SD_disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count)
  315. {
  316. /* pdrv should be 0 */
  317. if (pdrv || !count) return RES_PARERR;
  318. /* no disk */
  319. if (Stat & STA_NOINIT) return RES_NOTRDY;
  320. /* write protection */
  321. if (Stat & STA_PROTECT) return RES_WRPRT;
  322. /* convert to byte address */
  323. if (!(CardType & CT_SD2)) sector *= 512;
  324. SELECT();
  325. if (count == 1)
  326. {
  327. /* WRITE_BLOCK */
  328. if ((SD_SendCmd(CMD24, sector) == 0) && SD_TxDataBlock(buff, 0xFE))
  329. count = 0;
  330. }
  331. else
  332. {
  333. /* WRITE_MULTIPLE_BLOCK */
  334. if (CardType & CT_SD1)
  335. {
  336. SD_SendCmd(CMD55, 0);
  337. SD_SendCmd(CMD23, count); /* ACMD23 */
  338. }
  339. if (SD_SendCmd(CMD25, sector) == 0)
  340. {
  341. do {
  342. if(!SD_TxDataBlock(buff, 0xFC)) break;
  343. buff += 512;
  344. } while (--count);
  345. /* STOP_TRAN token */
  346. if(!SD_TxDataBlock(0, 0xFD))
  347. {
  348. count = 1;
  349. }
  350. }
  351. }
  352. /* Idle */
  353. DESELECT();
  354. SPI_RxByte();
  355. return count ? RES_ERROR : RES_OK;
  356. }
  357. #endif /* _USE_WRITE */
  358. /* ioctl */
  359. DRESULT SD_disk_ioctl(BYTE drv, BYTE ctrl, void *buff)
  360. {
  361. DRESULT res;
  362. uint8_t n, csd[16], *ptr = buff;
  363. WORD csize;
  364. /* pdrv should be 0 */
  365. if (drv) return RES_PARERR;
  366. res = RES_ERROR;
  367. if (ctrl == CTRL_POWER)
  368. {
  369. switch (*ptr)
  370. {
  371. case 0:
  372. SD_PowerOff(); /* Power Off */
  373. res = RES_OK;
  374. break;
  375. case 1:
  376. SD_PowerOn(); /* Power On */
  377. res = RES_OK;
  378. break;
  379. case 2:
  380. *(ptr + 1) = SD_CheckPower();
  381. res = RES_OK; /* Power Check */
  382. break;
  383. default:
  384. res = RES_PARERR;
  385. }
  386. }
  387. else
  388. {
  389. /* no disk */
  390. if (Stat & STA_NOINIT) return RES_NOTRDY;
  391. SELECT();
  392. switch (ctrl)
  393. {
  394. case GET_SECTOR_COUNT:
  395. /* SEND_CSD */
  396. if ((SD_SendCmd(CMD9, 0) == 0) && SD_RxDataBlock(csd, 16))
  397. {
  398. if ((csd[0] >> 6) == 1)
  399. {
  400. /* SDC V2 */
  401. csize = csd[9] + ((WORD) csd[8] << 8) + 1;
  402. *(DWORD*) buff = (DWORD) csize << 10;
  403. }
  404. else
  405. {
  406. /* MMC or SDC V1 */
  407. n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
  408. csize = (csd[8] >> 6) + ((WORD) csd[7] << 2) + ((WORD) (csd[6] & 3) << 10) + 1;
  409. *(DWORD*) buff = (DWORD) csize << (n - 9);
  410. }
  411. res = RES_OK;
  412. }
  413. break;
  414. case GET_SECTOR_SIZE:
  415. *(WORD*) buff = 512;
  416. res = RES_OK;
  417. break;
  418. case CTRL_SYNC:
  419. if (SD_ReadyWait() == 0xFF) res = RES_OK;
  420. break;
  421. case MMC_GET_CSD:
  422. /* SEND_CSD */
  423. if (SD_SendCmd(CMD9, 0) == 0 && SD_RxDataBlock(ptr, 16)) res = RES_OK;
  424. break;
  425. case MMC_GET_CID:
  426. /* SEND_CID */
  427. if (SD_SendCmd(CMD10, 0) == 0 && SD_RxDataBlock(ptr, 16)) res = RES_OK;
  428. break;
  429. case MMC_GET_OCR:
  430. /* READ_OCR */
  431. if (SD_SendCmd(CMD58, 0) == 0)
  432. {
  433. for (n = 0; n < 4; n++)
  434. {
  435. *ptr++ = SPI_RxByte();
  436. }
  437. res = RES_OK;
  438. }
  439. default:
  440. res = RES_PARERR;
  441. }
  442. DESELECT();
  443. SPI_RxByte();
  444. }
  445. return res;
  446. }