Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема microSD spi
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
l_fin_l
Здравствуйте, столкнулся с такой проблемой: имеется устройство на мк stm32f103, работающее с microSD картой по spi. Так вот со старыми microSD картами(2gb) все работало отлично, но они закончились. Купили новые(тоже на 2gb), а они пишут через раз, и регистр CID с карточки не считывается. Бегло пробежал по спецификациям на карты(старой и новой), никаких различий не увидел. Может кто-нибудь сталкивался с подобной проблемой? Заранее спасибо.
adnega
Цитата(l_fin_l @ Sep 22 2017, 17:08) *
Здравствуйте, столкнулся с такой проблемой: имеется устройство на мк stm32f103, работающее с microSD картой по spi. Так вот со старыми microSD картами(2gb) все работало отлично, но они закончились. Купили новые(тоже на 2gb), а они пишут через раз, и регистр CID с карточки не считывается. Бегло пробежал по спецификациям на карты(старой и новой), никаких различий не увидел. Может кто-нибудь сталкивался с подобной проблемой? Заранее спасибо.

Покажете процедуру инициализации карты (какие команды посылаете и что карта отвечает)?
Если она SDHC, то адресация там другая (сдвиг адреса на 9 бит).
l_fin_l
Цитата
Покажете процедуру инициализации карты (какие команды посылаете и что карта отвечает)?
Если она SDHC, то адресация там другая (сдвиг адреса на 9 бит).

CODE
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
Ссылка на драйвер карточки:SPI_SD_Card.zip
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.