l_fin_l 0 22 сентября, 2017 Опубликовано 22 сентября, 2017 (изменено) · Жалоба Здравствуйте, столкнулся с такой проблемой: имеется устройство на мк stm32f103, работающее с microSD картой по spi. Так вот со старыми microSD картами(2gb) все работало отлично, но они закончились. Купили новые(тоже на 2gb), а они пишут через раз, и регистр CID с карточки не считывается. Бегло пробежал по спецификациям на карты(старой и новой), никаких различий не увидел. Может кто-нибудь сталкивался с подобной проблемой? Заранее спасибо. Изменено 16 ноября, 2022 пользователем haker_fox Уточнил название темы, добавил теги, переместил в нужный раздел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 22 сентября, 2017 Опубликовано 22 сентября, 2017 · Жалоба Здравствуйте, столкнулся с такой проблемой: имеется устройство на мк stm32f103, работающее с microSD картой по spi. Так вот со старыми microSD картами(2gb) все работало отлично, но они закончились. Купили новые(тоже на 2gb), а они пишут через раз, и регистр CID с карточки не считывается. Бегло пробежал по спецификациям на карты(старой и новой), никаких различий не увидел. Может кто-нибудь сталкивался с подобной проблемой? Заранее спасибо. Покажете процедуру инициализации карты (какие команды посылаете и что карта отвечает)? Если она SDHC, то адресация там другая (сдвиг адреса на 9 бит). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
l_fin_l 0 23 сентября, 2017 Опубликовано 23 сентября, 2017 · Жалоба Покажете процедуру инициализации карты (какие команды посылаете и что карта отвечает)? Если она SDHC, то адресация там другая (сдвиг адреса на 9 бит). int MSD_Init(void) { uint8_t r1; uint8_t buff[6] = {0}; uint16_t retry; MSD_SPI_Configuration(); /* Check , if no card insert */ if( _card_insert() ) { /* FATFS error flag */ return -1; } /* Power on and delay some times */ for(retry=0; retry<0x100; retry++) { _card_power_on(); } /* Satrt send 74 clocks at least */ for(retry=0; retry<10; retry++) { _spi_read_write(DUMMY_BYTE); } /* Start send CMD0 till return 0x01 means in IDLE state */ for(retry=0; retry<0xFFF; retry++) { r1 = _send_command(CMD0, 0, 0x95); if(r1 == 0x01) { retry = 0; break; } } /* Timeout return */ if(retry == 0xFFF) { return 1; } /* Get the card type, version */ r1 = _send_command_hold(CMD8, 0x1AA, 0x87); /* r1=0x05 -> V1.0 */ if(r1 == 0x05) { CardInfo.CardType = CARDTYPE_SDV1; /* End of CMD8, chip disable and dummy byte */ _card_disable(); _spi_read_write(DUMMY_BYTE); /* SD1.0/MMC start initialize */ /* Send CMD55+ACMD41, No-response is a MMC card, otherwise is a SD1.0 card */ for(retry=0; retry<0xFFF; retry++) { r1 = _send_command(CMD55, 0, 0); /* should be return 0x01 */ if(r1 != 0x01) { return r1; } r1 = _send_command(ACMD41, 0, 0); /* should be return 0x00 */ if(r1 == 0x00) { retry = 0; break; } } /* MMC card initialize start */ if(retry == 0xFFF) { for(retry=0; retry<0xFFF; retry++) { r1 = _send_command(CMD1, 0, 0); /* should be return 0x00 */ if(r1 == 0x00) { retry = 0; break; } } /* Timeout return */ if(retry == 0xFFF) { return 2; } CardInfo.CardType = CARDTYPE_MMC; } /* SD1.0 card detected, print information */ /* Set spi speed high */ MSD_SPIHighSpeed(1); /* CRC disable */ r1 = _send_command(CMD59, 0, 0x01); if(r1 != 0x00) { return r1; /* response error, return r1 */ } /* Set the block size */ r1 = _send_command(CMD16, MSD_BLOCKSIZE, 0xFF); if(r1 != 0x00) { return r1; /* response error, return r1 */ } } /* r1=0x01 -> V2.x, read OCR register, check version */ else if(r1 == 0x01) { /* 4Bytes returned after CMD8 sent */ buff[0] = _spi_read_write(DUMMY_BYTE); /* should be 0x00 */ buff[1] = _spi_read_write(DUMMY_BYTE); /* should be 0x00 */ buff[2] = _spi_read_write(DUMMY_BYTE); /* should be 0x01 */ buff[3] = _spi_read_write(DUMMY_BYTE); /* should be 0xAA */ /* End of CMD8, chip disable and dummy byte */ _card_disable(); _spi_read_write(DUMMY_BYTE); /* Check voltage range be 2.7-3.6V */ if(buff[2]==0x01 && buff[3]==0xAA) { for(retry=0; retry<0xFFF; retry++) { r1 = _send_command(CMD55, 0, 0); /* should be return 0x01 */ if(r1!=0x01) { return r1; } r1 = _send_command(ACMD41, 0x40000000, 0); /* should be return 0x00 */ if(r1 == 0x00) { retry = 0; break; } } /* Timeout return */ if(retry == 0xFFF) { return 3; } /* Read OCR by CMD58 */ r1 = _send_command_hold(CMD58, 0, 0); if(r1!=0x00) { return r1; /* response error, return r1 */ } buff[0] = _spi_read_write(DUMMY_BYTE); buff[1] = _spi_read_write(DUMMY_BYTE); buff[2] = _spi_read_write(DUMMY_BYTE); buff[3] = _spi_read_write(DUMMY_BYTE); /* End of CMD58, chip disable and dummy byte */ _card_disable(); _spi_read_write(DUMMY_BYTE); /* OCR -> CCS(bit30) 1: SDV2HC 0: SDV2 */ if(buff[0] & 0x40) { CardInfo.CardType = CARDTYPE_SDV2HC; } else { CardInfo.CardType = CARDTYPE_SDV2; } /* Set spi speed high */ MSD_SPIHighSpeed(1); } } return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
l_fin_l 0 25 сентября, 2017 Опубликовано 25 сентября, 2017 (изменено) · Жалоба Ссылка на драйвер карточки:SPI_SD_Card.zip Изменено 25 сентября, 2017 пользователем l_fin_l Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться