obj_spi_sd_stm32.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. /*-----------------------------------------------------------------------*/
  2. /* MMC/SDC (in SPI mode) control module (C)ChaN, 2007 */
  3. /*-----------------------------------------------------------------------*/
  4. /* Only rcvr_spi(), xmit_spi(), disk_timerproc() and some macros */
  5. /* are platform dependent. */
  6. /*-----------------------------------------------------------------------*/
  7. #include "obj_spi_sd_stm32.h"
  8. /*--------------------------------------------------------------------------
  9. Module Private Functions
  10. ---------------------------------------------------------------------------*/
  11. extern SPI_HandleTypeDef hspi2;
  12. #define SD_SPIDriver hspi2
  13. static volatile DSTATUS Stat = STA_NOINIT; /* Disk status */
  14. static volatile BYTE Timer1, Timer2; /* 100Hz decrement timer */
  15. static BYTE CardType; /* b0:MMC, b1:SDC, b2:Block addressing */
  16. static BYTE PowerFlag = 0; /* indicates if "power" is on */
  17. static
  18. void SELECT(void)
  19. {
  20. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
  21. }
  22. static
  23. void DESELECT(void)
  24. {
  25. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
  26. }
  27. static
  28. void xmit_spi(BYTE Data)
  29. {
  30. while (HAL_SPI_GetState(&SD_SPIDriver) != HAL_SPI_STATE_READY);
  31. HAL_SPI_Transmit(&SD_SPIDriver, &Data, 1, 5000);
  32. }
  33. static BYTE rcvr_spi(void)
  34. {
  35. unsigned char Dummy, Data;
  36. Dummy = 0xFF;
  37. Data = 0;
  38. while ((HAL_SPI_GetState(&SD_SPIDriver) != HAL_SPI_STATE_READY))
  39. ;
  40. HAL_SPI_TransmitReceive(&SD_SPIDriver, &Dummy, &Data, 1, 5000);
  41. return Data;
  42. }
  43. static
  44. void rcvr_spi_m(BYTE *dst) {
  45. *dst = rcvr_spi();
  46. }
  47. /*-----------------------------------------------------------------------*/
  48. /* Wait for card ready */
  49. /*-----------------------------z------------------------------------------*/
  50. static BYTE wait_ready(void) {
  51. BYTE res;
  52. Timer2 = 50;
  53. rcvr_spi();
  54. do
  55. res = rcvr_spi();
  56. while ((res != 0xFF) && Timer2);
  57. return res;
  58. }
  59. /*-----------------------------------------------------------------------*/
  60. /* Power Control (Platform dependent) */
  61. /*-----------------------------------------------------------------------*/
  62. /* When the target system does not support socket power control, there */
  63. /* is nothing to do in these functions and chk_power always returns 1. */
  64. static
  65. void power_on(void) {
  66. unsigned char i, cmd_arg[6];
  67. unsigned int Count = 0x1FFF;
  68. DESELECT();
  69. for (i = 0; i < 10; i++)
  70. xmit_spi(0xFF);
  71. SELECT();
  72. cmd_arg[0] = (CMD0 | 0x40);
  73. cmd_arg[1] = 0;
  74. cmd_arg[2] = 0;
  75. cmd_arg[3] = 0;
  76. cmd_arg[4] = 0;
  77. cmd_arg[5] = 0x95;
  78. for (i = 0; i < 6; i++)
  79. xmit_spi(cmd_arg[i]);
  80. while ((rcvr_spi() != 0x01) && Count)
  81. Count--;
  82. DESELECT();
  83. xmit_spi(0XFF);
  84. PowerFlag = 1;
  85. }
  86. static
  87. void power_off(void) {
  88. PowerFlag = 0;
  89. }
  90. static
  91. int chk_power(void) /* Socket power state: 0=off, 1=on */
  92. {
  93. return PowerFlag;
  94. }
  95. /*-----------------------------------------------------------------------*/
  96. /* Receive a data packet from MMC */
  97. /*-----------------------------------------------------------------------*/
  98. static bool rcvr_datablock(BYTE *buff, /* Data buffer to store received data */
  99. UINT btr /* Byte count (must be even number) */
  100. ) {
  101. BYTE token;
  102. Timer1 = 10;
  103. do { /* Wait for data packet in timeout of 100ms */
  104. token = rcvr_spi();
  105. } while ((token == 0xFF) && Timer1);
  106. if (token != 0xFE)
  107. return FALSE; /* If not valid data token, retutn with error */
  108. do { /* Receive the data block into buffer */
  109. rcvr_spi_m(buff++);
  110. rcvr_spi_m(buff++);
  111. } while (btr -= 2);
  112. rcvr_spi(); /* Discard CRC */
  113. rcvr_spi();
  114. return TRUE; /* Return with success */
  115. }
  116. /*-----------------------------------------------------------------------*/
  117. /* Send a data packet to MMC */
  118. /*-----------------------------------------------------------------------*/
  119. #if _READONLY == 0
  120. static bool xmit_datablock(const BYTE *buff, /* 512 byte data block to be transmitted */
  121. BYTE token /* Data/Stop token */
  122. ) {
  123. BYTE resp, wc;
  124. uint32_t i = 0;
  125. if (wait_ready() != 0xFF)
  126. return FALSE;
  127. xmit_spi(token); /* Xmit data token */
  128. if (token != 0xFD) { /* Is data token */
  129. wc = 0;
  130. do { /* Xmit the 512 byte data block to MMC */
  131. xmit_spi(*buff++);
  132. xmit_spi(*buff++);
  133. } while (--wc);
  134. rcvr_spi();
  135. rcvr_spi();
  136. while (i <= 64) {
  137. resp = rcvr_spi(); /* Reveive data response */
  138. if ((resp & 0x1F) == 0x05) /* If not accepted, return with error */
  139. break;
  140. i++;
  141. }
  142. while (rcvr_spi() == 0)
  143. ;
  144. }
  145. if ((resp & 0x1F) == 0x05)
  146. return TRUE;
  147. else
  148. return FALSE;
  149. }
  150. #endif /* _READONLY */
  151. /*-----------------------------------------------------------------------*/
  152. /* Send a command packet to MMC */
  153. /*-----------------------------------------------------------------------*/
  154. static BYTE send_cmd(BYTE cmd, /* Command byte */
  155. DWORD arg /* Argument */
  156. ) {
  157. BYTE n, res;
  158. if (wait_ready() != 0xFF)
  159. return 0xFF;
  160. /* Send command packet */
  161. xmit_spi(cmd); /* Command */
  162. xmit_spi((BYTE) (arg >> 24)); /* Argument[31..24] */
  163. xmit_spi((BYTE) (arg >> 16)); /* Argument[23..16] */
  164. xmit_spi((BYTE) (arg >> 8)); /* Argument[15..8] */
  165. xmit_spi((BYTE) arg); /* Argument[7..0] */
  166. n = 0;
  167. if (cmd == CMD0)
  168. n = 0x95; /* CRC for CMD0(0) */
  169. if (cmd == CMD8)
  170. n = 0x87; /* CRC for CMD8(0x1AA) */
  171. xmit_spi(n);
  172. /* Receive command response */
  173. if (cmd == CMD12)
  174. rcvr_spi(); /* Skip a stuff byte when stop reading */
  175. n = 10; /* Wait for a valid response in timeout of 10 attempts */
  176. do
  177. res = rcvr_spi();
  178. while ((res & 0x80) && --n);
  179. return res; /* Return with the response value */
  180. }
  181. /*--------------------------------------------------------------------------
  182. Public Functions
  183. ---------------------------------------------------------------------------*/
  184. /*-----------------------------------------------------------------------*/
  185. /* Initialize Disk Drive */
  186. /*-----------------------------------------------------------------------*/
  187. DSTATUS SD_disk_initialize(BYTE drv /* Physical drive nmuber (0) */
  188. ) {
  189. BYTE n, ty, ocr[4];
  190. if (drv)
  191. return STA_NOINIT; /* Supports only single drive */
  192. if (Stat & STA_NODISK)
  193. return Stat; /* No card in the socket */
  194. power_on(); /* Force socket power on */
  195. //send_initial_clock_train();
  196. SELECT(); /* CS = L */
  197. ty = 0;
  198. if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */
  199. Timer1 = 100; /* Initialization timeout of 1000 msec */
  200. if (send_cmd(CMD8, 0x1AA) == 1) { /* SDC Ver2+ */
  201. for (n = 0; n < 4; n++)
  202. ocr[n] = rcvr_spi();
  203. if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */
  204. do {
  205. if (send_cmd(CMD55, 0) <= 1
  206. && send_cmd(CMD41, 1UL << 30) == 0)
  207. break; /* ACMD41 with HCS bit */
  208. } while (Timer1);
  209. if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit */
  210. for (n = 0; n < 4; n++)
  211. ocr[n] = rcvr_spi();
  212. ty = (ocr[0] & 0x40) ? 6 : 2;
  213. }
  214. }
  215. } else { /* SDC Ver1 or MMC */
  216. ty = (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) <= 1) ? 2 : 1; /* SDC : MMC */
  217. do {
  218. if (ty == 2) {
  219. if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) == 0)
  220. break; /* ACMD41 */
  221. } else {
  222. if (send_cmd(CMD1, 0) == 0)
  223. break; /* CMD1 */
  224. }
  225. } while (Timer1);
  226. if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Select R/W block length */
  227. ty = 0;
  228. }
  229. }
  230. CardType = ty;
  231. DESELECT(); /* CS = H */
  232. rcvr_spi(); /* Idle (Release DO) */
  233. if (ty) /* Initialization succeded */
  234. Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */
  235. else
  236. /* Initialization failed */
  237. power_off();
  238. return Stat;
  239. }
  240. /*-----------------------------------------------------------------------*/
  241. /* Get Disk Status */
  242. /*-----------------------------------------------------------------------*/
  243. DSTATUS SD_disk_status(BYTE drv /* Physical drive nmuber (0) */
  244. ) {
  245. if (drv)
  246. return STA_NOINIT; /* Supports only single drive */
  247. return Stat;
  248. }
  249. /*-----------------------------------------------------------------------*/
  250. /* Read Sector(s) */
  251. /*-----------------------------------------------------------------------*/
  252. DRESULT SD_disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) {
  253. if (pdrv || !count)
  254. return RES_PARERR;
  255. if (Stat & STA_NOINIT)
  256. return RES_NOTRDY;
  257. if (!(CardType & 4))
  258. sector *= 512; /* Convert to byte address if needed */
  259. SELECT(); /* CS = L */
  260. if (count == 1) { /* Single block read */
  261. if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */
  262. && rcvr_datablock(buff, 512))
  263. count = 0;
  264. } else { /* Multiple block read */
  265. if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */
  266. do {
  267. if (!rcvr_datablock(buff, 512))
  268. break;
  269. buff += 512;
  270. } while (--count);
  271. send_cmd(CMD12, 0); /* STOP_TRANSMISSION */
  272. }
  273. }
  274. DESELECT(); /* CS = H */
  275. rcvr_spi(); /* Idle (Release DO) */
  276. return count ? RES_ERROR : RES_OK;
  277. }
  278. /*-----------------------------------------------------------------------*/
  279. /* Write Sector(s) */
  280. /*-----------------------------------------------------------------------*/
  281. #if _READONLY == 0
  282. DRESULT SD_disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) {
  283. if (pdrv || !count)
  284. return RES_PARERR;
  285. if (Stat & STA_NOINIT)
  286. return RES_NOTRDY;
  287. if (Stat & STA_PROTECT)
  288. return RES_WRPRT;
  289. if (!(CardType & 4))
  290. sector *= 512; /* Convert to byte address if needed */
  291. SELECT(); /* CS = L */
  292. if (count == 1) { /* Single block write */
  293. if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
  294. && xmit_datablock(buff, 0xFE))
  295. count = 0;
  296. } else { /* Multiple block write */
  297. if (CardType & 2) {
  298. send_cmd(CMD55, 0);
  299. send_cmd(CMD23, count); /* ACMD23 */
  300. }
  301. if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */
  302. do {
  303. if (!xmit_datablock(buff, 0xFC))
  304. break;
  305. buff += 512;
  306. } while (--count);
  307. if (!xmit_datablock(0, 0xFD)) /* STOP_TRAN token */
  308. count = 1;
  309. }
  310. }
  311. DESELECT(); /* CS = H */
  312. rcvr_spi(); /* Idle (Release DO) */
  313. return count ? RES_ERROR : RES_OK;
  314. }
  315. #endif /* _READONLY */
  316. /*-----------------------------------------------------------------------*/
  317. /* Miscellaneous Functions */
  318. /*-----------------------------------------------------------------------*/
  319. DRESULT SD_disk_ioctl(BYTE drv, /* Physical drive nmuber (0) */
  320. BYTE ctrl, /* Control code */
  321. void *buff /* Buffer to send/receive control data */
  322. ) {
  323. DRESULT res;
  324. BYTE n, csd[16], *ptr = buff;
  325. WORD csize;
  326. if (drv)
  327. return RES_PARERR;
  328. res = RES_ERROR;
  329. if (ctrl == CTRL_POWER) {
  330. switch (*ptr) {
  331. case 0: /* Sub control code == 0 (POWER_OFF) */
  332. if (chk_power())
  333. power_off(); /* Power off */
  334. res = RES_OK;
  335. break;
  336. case 1: /* Sub control code == 1 (POWER_ON) */
  337. power_on(); /* Power on */
  338. res = RES_OK;
  339. break;
  340. case 2: /* Sub control code == 2 (POWER_GET) */
  341. *(ptr + 1) = (BYTE) chk_power();
  342. res = RES_OK;
  343. break;
  344. default:
  345. res = RES_PARERR;
  346. }
  347. } else {
  348. if (Stat & STA_NOINIT)
  349. return RES_NOTRDY;
  350. SELECT(); /* CS = L */
  351. switch (ctrl) {
  352. case GET_SECTOR_COUNT: /* Get number of sectors on the disk (DWORD) */
  353. if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) {
  354. if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */
  355. csize = csd[9] + ((WORD) csd[8] << 8) + 1;
  356. *(DWORD*) buff = (DWORD) csize << 10;
  357. } else { /* MMC or SDC ver 1.XX */
  358. n = (csd[5] & 15) + ((csd[10] & 128) >> 7)
  359. + ((csd[9] & 3) << 1) + 2;
  360. csize = (csd[8] >> 6) + ((WORD) csd[7] << 2)
  361. + ((WORD) (csd[6] & 3) << 10) + 1;
  362. *(DWORD*) buff = (DWORD) csize << (n - 9);
  363. }
  364. res = RES_OK;
  365. }
  366. break;
  367. case GET_SECTOR_SIZE: /* Get sectors on the disk (WORD) */
  368. *(WORD*) buff = 512;
  369. res = RES_OK;
  370. break;
  371. case CTRL_SYNC: /* Make sure that data has been written */
  372. if (wait_ready() == 0xFF)
  373. res = RES_OK;
  374. break;
  375. case MMC_GET_CSD: /* Receive CSD as a data block (16 bytes) */
  376. if (send_cmd(CMD9, 0) == 0 /* READ_CSD */
  377. && rcvr_datablock(ptr, 16))
  378. res = RES_OK;
  379. break;
  380. case MMC_GET_CID: /* Receive CID as a data block (16 bytes) */
  381. if (send_cmd(CMD10, 0) == 0 /* READ_CID */
  382. && rcvr_datablock(ptr, 16))
  383. res = RES_OK;
  384. break;
  385. case MMC_GET_OCR: /* Receive OCR as an R3 resp (4 bytes) */
  386. if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */
  387. for (n = 0; n < 4; n++)
  388. *ptr++ = rcvr_spi();
  389. res = RES_OK;
  390. }
  391. // case MMC_GET_TYPE : /* Get card type flags (1 byte) */
  392. // *ptr = CardType;
  393. // res = RES_OK;
  394. // break;
  395. default:
  396. res = RES_PARERR;
  397. }
  398. DESELECT(); /* CS = H */
  399. rcvr_spi(); /* Idle (Release DO) */
  400. }
  401. return res;
  402. }
  403. /*-----------------------------------------------------------------------*/
  404. /* Device Timer Interrupt Procedure (Platform dependent) */
  405. /*-----------------------------------------------------------------------*/
  406. /* This function must be called in period of 10ms */
  407. void disk_timerproc(void) {
  408. // BYTE n, s;
  409. BYTE n;
  410. n = Timer1; /* 100Hz decrement timer */
  411. if (n)
  412. Timer1 = --n;
  413. n = Timer2;
  414. if (n)
  415. Timer2 = --n;
  416. }
  417. volatile unsigned short int sdcard_timer;
  418. void inline sdcard_systick_timerproc(void) {
  419. ++sdcard_timer;
  420. if (sdcard_timer >= 100) {
  421. sdcard_timer = 0;
  422. disk_timerproc();
  423. }
  424. }
  425. /*---------------------------------------------------------*/
  426. /* User Provided Timer Function for FatFs module */
  427. /*---------------------------------------------------------*/
  428. /* This is a real time clock service to be called from */
  429. /* FatFs module. Any valid time must be returned even if */
  430. /* the system does not support a real time clock. */
  431. DWORD SD_get_fattime(void) {
  432. return ((2007UL - 1980) << 25) // Year = 2007
  433. | (6UL << 21) // Month = June
  434. | (5UL << 16) // Day = 5
  435. | (11U << 11) // Hour = 11
  436. | (38U << 5) // Min = 38
  437. | (0U >> 1) // Sec = 0
  438. ;
  439. }