obj_spi_sd_stm32.c 14 KB

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