Перейти к содержанию
    

Проблема microSD spi, микроконтроллер stm32f103

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

Изменено пользователем haker_fox
Уточнил название темы, добавил теги, переместил в нужный раздел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Покажете процедуру инициализации карты (какие команды посылаете и что карта отвечает)?

Если она SDHC, то адресация там другая (сдвиг адреса на 9 бит).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покажете процедуру инициализации карты (какие команды посылаете и что карта отвечает)?

Если она 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем l_fin_l

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...