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

Проблемы с чтением блока SD карты

Карта инициализировалась через SPI успешно. Команды cmd18, cmd9, cmd10 принимает так же успешно и отвечает на них. А вот на команду cmd17 для чтения блока отвечает 0х00, но далее, вместо 0xfe, ни следует ничего кроме 0xff. Подскажите в чем может быть проблема.

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


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

отвечает 0х00, но далее, вместо 0xfe, ни следует ничего кроме 0xff. Подскажите в чем может быть проблема.

А там 0xFE следует за 0x00 не сразу, а может хоть через 500 мс появиться. Вы как долго ждете?

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


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

А там 0xFE следует за 0x00 не сразу, а может хоть через 500 мс появиться. Вы как долго ждете?

Долго жду. В бесконечном цикле пробовал, никакой реакции. Да и на cmd18 нормально отвечает

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


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

Долго жду. В бесконечном цикле пробовал, никакой реакции. Да и на cmd18 нормально отвечает

Карта SD или SDHC? Номер блока правильно передаете?

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


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

Карта SD или SDHC? Номер блока правильно передаете?

SDHC. Номер блока 0

Он по идее должен ошибку вернуть, если адрес неверный, а тут ничего нет

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


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

А на ПК данная карта работает? Другую карту (работающую в ПК) пробовали использовать?

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


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

А на ПК данная карта работает? Другую карту (работающую в ПК) пробовали использовать?

Работает. Другую пока нет, не пробовал

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


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

Проверил еще две карты. Они не проходят инициализацию. На ACMD41 отвечают 0x01

Что ж пришло время засветить свой код)

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


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

static BYTE CardType;

 

DSTATUS disk_initialize (void)

 

{

 

DSTATUS stat=STA_NOINIT;

 

UINT tmr=10000;

 

volatile int RestTic=0x092a;

 

BYTE RxByte[5],i;

 

//--------------------------------------------------------------

 

while (RestTic--); // ждать 1мс

 

for (i=0; i<10; i++){ // передать >74 импульсов

 

Tx_byte (0x01, 0xff);

 

}

 

//------------------передать cmd0-------------------------------

 

RxByte[0]=SD_CmdTx(0, 0x00000000, 0x95);

 

if (RxByte[0] != 0x01) return STA_NOINIT;

 

//------------------передать cmd8--------------------------------

 

if (SD_CmdTx(8, 0x000001AA, 0x87)==0x01){

 

RxByte[0]=SD_Rx_byte();

 

RxByte[1]=SD_Rx_byte();

 

RxByte[2]=SD_Rx_byte();

 

RxByte[3]=SD_Rx_byte();

 

if ((RxByte[3]!=0xaa) '' (RxByte[2]!=0x1)) return STA_NOINIT;

 

//--------------------передать acmd41----------------------------------

 

while (tmr--){

 

RxByte[0]=SD_CmdTx (55, 0x00000000, 0xff);

 

RxByte[1]=SD_CmdTx(41, 0x40000000, 0xff);

 

if (RxByte[1]==0x00) break;

 

RestTic=0x092a; // задержка

 

while (RestTic--);

 

}

 

//--------------передать cmd58-----------------------------------------

 

CardType=CT_SD2;

 

if (SD_CmdTx (58, 0x00000000, 0xff)!= 0x0) return STA_NOINIT;

 

RxByte[0]=SD_Rx_byte();

 

RxByte[1]=SD_Rx_byte();

 

RxByte[2]=SD_Rx_byte();

 

RxByte[3]=SD_Rx_byte();

 

if (RxByte[0] ' 0x40) CardType=CT_SD2 | CT_BLOCK;

 

else CardType=CT_SD2;

 

}

 

//---------------------передать acmd41-----------------------------------

 

else

 

{

 

while (tmr--){

 

SD_CmdTx (55, 0x00000000, 0x95);

 

RxByte[0]=SD_CmdTx (41, 0x00000000, 0x95);

 

if (RxByte[0]==0x00) break;

 

RestTic=0x092a;

 

while (RestTic--);

 

}

 

CardType=CT_SD1;

 

SD_CmdTx (16, 512, 0x95); //--------передать cmd16

 

}

 

//-----------------------------------------------------------------------

 

return 0;

 

}

Что ж пришло время засветить свой код)
Изменено пользователем Mikka

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


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

1. у меня crc=0х86 в команде 8

sd_send_cmd(CMD8_SEND_IF_COND, CARD_COND, 0x86);

, а у вас 0х87.

 

2. Не видно управление ногой CS. В начале команды я делаю CS=0, после команды CS=1 и передаю еще один 0xFF.

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


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

Контрольная сумма взята из статей в сети. Две карты проходят инициализацию нормально, с одной даже данные потом считать получается, а третья вот виснет на acmd41.

С другой тоже удавалось читать блок, но она не реагирует на адрес этого блока, т.е. всегда одно и тоже приходит. Но стоит немного изменить программу и сразу на cmd17 приходят сплошные ff

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

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


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

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

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

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

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

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

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

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

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

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