39 #define CS_LOW() mmc_spi_begin() 40 #define CS_HIGH() mmc_spi_end() 42 #define MMC_CD mmc_ins_status() 43 #define MMC_WP mmc_wp_status() 44 #define FCLK_SLOW() mmc_slow() 45 #define FCLK_FAST() mmc_fast() 56 #define ACMD41 (0x80+41) 61 #define ACMD13 (0x80+13) 66 #define ACMD23 (0x80+23) 181 return (d == 0xFF) ? 1 : 0;
210 printf(
"select failed!\n");
238 if (token != 0xFE)
return 0;
273 if ((resp & 0x1F) != 0x05)
279 #endif // ifdef _USE_WRITE 299 if (res > 1)
return res;
306 if (!
select())
return 0xFF;
316 if (cmd ==
CMD0) n = 0x95;
317 if (cmd ==
CMD8) n = 0x87;
328 while ((res & 0x80) && --n);
342 BYTE n, cmd, ty, ocr[4];
349 for (n = 10; n; n--)
xchg_spi(0xFF);
358 for (n = 0; n < 4; n++)
360 if (ocr[2] == 0x01 && ocr[3] == 0xAA)
370 for (n = 0; n < 4; n++)
506 && xmit_datablock(buff, 0xFE))
516 if (!xmit_datablock(buff, 0xFC))
break;
519 if (!xmit_datablock(0, 0xFD))
541 BYTE n, csd[16], *ptr = buff;
542 DWORD *dp, st, ed, csize;
564 if ((csd[0] >> 6) == 1) {
565 csize = csd[9] + ((
WORD)csd[8] << 8) + ((
DWORD)(csd[7] & 63) << 16) + 1;
566 *(
DWORD*)buff = csize << 10;
568 n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
569 csize = (csd[8] >> 6) + ((
WORD)csd[7] << 2) + ((
WORD)(csd[6] & 3) << 10) + 1;
570 *(
DWORD*)buff = csize << (n - 9);
582 for (n = 64 - 16; n; n--)
xchg_spi(0xFF);
583 *(
DWORD*)buff = 16UL << (csd[10] >> 4);
590 *(
DWORD*)buff = (((csd[10] & 63) << 1) + ((
WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1);
592 *(
DWORD*)buff = ((
WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1);
603 if (!(csd[0] >> 6) && !(csd[10] & 0x40))
break;
604 dp = buff; st = dp[0]; ed = dp[1];
606 st *= 512; ed *= 512;
636 for (n = 4; n; n--) *ptr++ =
xchg_spi(0xFF);
688 for (dc = 513; dc; dc--)
xchg_spi(0xFF);
MEMSPACE DSTATUS mmc_disk_initialize(void)
Public Functions.
MEMSPACE int wait_ready(UINT wt)
wait for card ready
Master include file for project Includes all project includes and defines here.
static MEMSPACE void power_on(void)
power on
MEMSPACE DSTATUS mmc_disk_status(void)
Get Disk Status.
static BYTE xchg_spi(BYTE dat)
send/receive a SPI byte
static volatile BYTE Timer2
MEMSPACE DRESULT mmc_disk_write(const BYTE *buff, DWORD sector, UINT count)
void mmc_spi_RX_buffer(const uint8_t *data, int count)
SPI read buffer.
MEMSPACE DRESULT mmc_disk_read(BYTE *buff, DWORD sector, UINT count)
Read Sector(s)
static MEMSPACE void deselect(void)
Deselect the card and release SPI bus.
void mmc_disk_timerproc(void)
Write Sector(s)
static MEMSPACE int select(void)
Select the card and wait for ready.
static MEMSPACE int rcvr_datablock(BYTE *buff, UINT btr)
Receive a data packet from MMC.
static void rcvr_spi_multi(BYTE *p, UINT cnt)
Receive a data block fast.
MEMSPACE void mmc_power_off()
MMC Power OFF.
static void xmit_spi_multi(const BYTE *p, UINT cnt)
Send a data block fast.
static MEMSPACE BYTE send_cmd(BYTE cmd, DWORD arg)
Send a data packet to MMC.
MEMSPACE int token(char *str, char *pat)
Search for token in a string matching user pattern.
static MEMSPACE void power_off(void)
power off
Math IO functions, and verious conversion code with floating point support.
uint8_t mmc_spi_TXRX(uint8_t data)
SPI read and write 1 byte.
void mmc_spi_TX_buffer(const uint8_t *data, int count)
SPI write buffer.
MEMSPACE int mmc_test_timeout()
Wait for timeout.
MEMSPACE int printf(const char *format,...)
MEMSPACE void mmc_set_ms_timeout(uint16_t ms)
Set MMC timeout timer in Milliseconds.
MEMSPACE DRESULT mmc_disk_ioctl(BYTE cmd, void *buff)
static volatile BYTE Timer1
MEMSPACE void mmc_power_on()
MMC Power ON.