реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблема microSD spi
l_fin_l
сообщение Sep 22 2017, 14:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-08-11
Пользователь №: 66 836



Здравствуйте, столкнулся с такой проблемой: имеется устройство на мк stm32f103, работающее с microSD картой по spi. Так вот со старыми microSD картами(2gb) все работало отлично, но они закончились. Купили новые(тоже на 2gb), а они пишут через раз, и регистр CID с карточки не считывается. Бегло пробежал по спецификациям на карты(старой и новой), никаких различий не увидел. Может кто-нибудь сталкивался с подобной проблемой? Заранее спасибо.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 22 2017, 15:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

Покажете процедуру инициализации карты (какие команды посылаете и что карта отвечает)?
Если она SDHC, то адресация там другая (сдвиг адреса на 9 бит).
Go to the top of the page
 
+Quote Post
l_fin_l
сообщение Sep 23 2017, 14:06
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-08-11
Пользователь №: 66 836



Цитата
Покажете процедуру инициализации карты (какие команды посылаете и что карта отвечает)?
Если она 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;
}
Go to the top of the page
 
+Quote Post
l_fin_l
сообщение Sep 25 2017, 08:57
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-08-11
Пользователь №: 66 836



Ссылка на драйвер карточки:SPI_SD_Card.zip

Сообщение отредактировал l_fin_l - Sep 25 2017, 09:00
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.03087 секунд с 7
ELECTRONIX ©2004-2016