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

SD Card - програмная реализация интерфейса

Если эта команда, не используется для распознавания MMC/SD, однако.

Мня. Ступил, однако :)

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

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


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

При помощи CMD1 карточка (microSD 1024 Mb Kingston ) активизировалась в SPI-режиме, т.е. я получил R1 == 0x00. Теперь попытался получить CSD. т.е. CMD9 с аргументом == 0. Последний байт с CRC7 выставляю в 0xFF. Вся команда: 0x49, 0x00,0x00, 0x00, 0x00, 0xFF.

 

В ответ получаю

- R1 == 0x00

- признак начала данных - 0xFE

- 16 байт

 

Если еще попинговать карту FF-ми, то получаем еще 1 байт.

 

Странно, вроде, по идее, я должен получить 16 байт данных после 0xFE и CRC16, т.е. еще 2 байта.

 

Что-то я не так сделал, но вот что?

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


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

Если еще попинговать карту FF-ми, то получаем еще 1 байт.

Это как?

 

Странно, вроде, по идее, я должен получить 16 байт данных после 0xFE и CRC16, т.е. еще 2 байта.

 

Что-то я не так сделал, но вот что?

А CRC включен (CMD59)?

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


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

Последний байт с CRC7 выставляю в 0xFF. Вся команда: 0x49, 0x00,0x00, 0x00, 0x00, 0xFF.

CRC = 0x00, у меня.

В ответ получаю

- R1 == 0x00

Точнее любое значение без старшего бита в течении не более 80 тактов

- признак начала данных - 0xFE

сканируя в течении не более 100ms

- 16 байт

Да.

Если еще попинговать карту FF-ми, то получаем еще 1 байт.

Ну получаете, то сколько угодно байт, но они все кроме первого 0xFF? Ну А может CRC 0xXXFF :)

Не знаю, я в мусорник два байта вычитываю и все.

Странно, вроде, по идее, я должен получить 16 байт данных после 0xFE и CRC16, т.е. еще 2 байта.

Да.

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


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

Это как?

Ну отправляю 0xFF и жду, придет лии что нить еще, не равное 0xFF.

 

А CRC включен (CMD59)?

 

CRC не включен. В мануале написано, что в SPI он по умолчанию отключен, но я так понимаю, что эти байты(CRC16) все равно присылаются, но их надо игнорировать. Или я неправ?

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

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


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

Сейчас слегка переделал прием, чтобы только непрерывные последовательности байтов != FF принимать.

Получается, после 0xFE принимается сначала 10 байт, не равных FF, затем сколько-то 0xFF и затем следующая последовательнеость - 7 байт не равных 0xFF. И все. Как-то непонятно. Вроде данные с CRC16 должны идти непрерывным массивом.

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


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

В мануале написано, что в SPI он по умолчанию отключен, но я так понимаю, что эти байты(CRC16) все равно присылаются, но их надо игнорировать. Или я неправ?

Присылаются, только стандарт не оговаривает, что в них передается.

 

Сейчас слегка переделал прием, чтобы только непрерывные последовательности байтов != FF принимать.

Получается, после 0xFE принимается сначала 10 байт, не равных FF, затем сколько-то 0xFF и затем следующая последовательнеость - 7 байт не равных 0xFF. И все. Как-то непонятно. Вроде данные с CRC16 должны идти непрерывным массивом.

Данные всегда идут непрерывным массивом после токена, принимать нужно все.

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


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

Короче, это я лось педальный. У меня ФФ-ы выкидывались, а один из них был в массиве CSD.

 

Все нормально карточка отвечает теперь(00 + FE + 16 байт CSD + 2 CRC16) и даже осмысленные данные в CSD.

 

Насчет CSD->C_SIZE, я так понял, что значения этого поля зависят от производителя? В мануале тошибы - одни значения, у SanDisk - другие. Мне Kingston возвращает третьи. А вот у 16Mb Sd card Canon - совпадает с мануалом от SanDisk.

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


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

Подскажите, люди добрые, что я не так делаю.

Прошерстил все источники, просмотрел все исходники, написал прожку.

 

Настройка портов:

#define SPI_NPCS1_CONFIG (/*255<<24|0xFF<<16|*/AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(120<<8)) //400 kHz

 

AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;

 

AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA25 | AT91C_PIO_PA23; // DispRS and DispReset

AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA25 | AT91C_PIO_PA23;

AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA25 | AT91C_PIO_PA23;

 

// ======== Init SPI ================

AT91PS_SPI pSPI = AT91C_BASE_SPI ;

AT91F_SPI_CfgPMC(); // Enables the SPI Clock

AT91F_SPI_CfgPIO(); // Open PIO for SPI

AT91F_SPI_Reset(pSPI);// Reset SPI

AT91F_SPI_CfgMode(pSPI, SPI_MODE); // Configure SPI in Master Mode with No CS selected

AT91F_SPI_CfgCs(pSPI, 0, SPI_NPCS0_CONFIG); // Configure SPI0 Display CX65

 

pSPI->SPI_CSR[1] = SPI_NPCS1_CONFIG;

pSPI->SPI_IDR = 0xffffffff; //отключение прерываний

 

AT91F_SPI_Enable(pSPI); // SPI_Enable

 

AT91F_PIO_CfgInput(AT91C_BASE_PIOA, CARD_PROT|CARD_DET);

 

AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA9; // CS1 for MMC/SDC

AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA9;

AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA9;

 

Передача/прием байта:

void xmit_spi(char dat)

{

while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE==0);

AT91F_SPI_PutChar (AT91C_BASE_SPI, dat, 1);

}

 

 

static

BYTE rcvr_spi (char dat)

{

char res;

while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE==0);

AT91F_SPI_PutChar (AT91C_BASE_SPI, dat, 1);

while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF==0);

res = (BYTE)( AT91C_BASE_SPI->SPI_RDR );

 

return res;

}

 

 

Работа с картой:

do

{

__disable_interrupt();

DESELECT(); // поднять CS

Delay_mks(100);

for (n = 10; n; n--) xmit_spi(0xFF); /* 80 dummy clocks */

n=0;

ty=0;

SELECT(); // опустить CS

Delay_mks(100);

 

xmit_spi(0x40);

Delay_mks(100);

xmit_spi(0);

Delay_mks(100);

xmit_spi(0);

Delay_mks(100);

xmit_spi(0);

Delay_mks(100);

xmit_spi(0);

Delay_mks(100);

 

cmd=rcvr_spi(0x95);

// Delay_mks(100);

n=255;

while (cmd == 0xFF && n)

{

n--;

cmd = rcvr_spi(0xFF);

}

} while (cmd == 0xFF);

 

DESELECT();

 

Сначала ваще ничего не получал в ответ (0xFF), потом поставил ожидание после каждой SPI посылки 100 мкс, начал получать 0x01 в ответ на CMD0 (для MMC карты, и 0x05 для SD). Если изменял время задержек мог получать всяку ерунду, типа сдвинутого ответа.

Если убрать хоть одну задержку - ответ 0xFF, т.е. нет ответа.

Пробовал ставить аппаратные задержки в SPI #define SPI_NPCS1_CONFIG (255<<24|0xFF<<16|AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(120<<8)) - нет ответа.

MMC Canon 16MB

microSD SanDisk 512MB

SAM7S64

 

ЗЫ Дисплей от S65 на SPI0 - работает отлично.

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

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


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

Посылку и прием лучше сделать одной универсальной функцией. Ждать по while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF==0); и всегда вычитывать AT91C_BASE_SPI->SPI_RDR.

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


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

делал,

без разницы (собственно, как и предполагалось)

во многих примерах чтение и запись сделаны раздельно, наверно что бы немножко экономить время

 

Сам интерфейс походу работает (хоть с задержками, но работает). Проблема в том, что задержек много.

Я еще конечно буду пробовать задержки плавно уменьшать, авось останется 1мкс, тады и фиг с ней.

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

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


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

Тогда по пунктам. Если после отправки не дождаться принятия байта, то он конда-нибудь все же примется. тем самым взведет соответствующий бит в статус-регистре. При следующей посылке с чтением вы посылаете байт и тут же проверяете флаг принятия байта. Но он остался взеведенным с прошлой посылки. При этом контроллер именно в этот момент принимает байт. Что вы в этот момент прочитаете из регистра принятых данных - х.з. Хорошо если предыдуший принятый байт. Соответственно с задержками это все будет как-то работать.

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

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


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

Здравствуйте!!! Подскажите с инициализацией micro SD Apacer 1024Mb. Работаю через LPT. CMD и DAT подтянуты к питанию через 30к. Шлю CMD=0, ответ =1. CMD=1, ответ=255 и все, никание команды не принимает. При CMD=55 + CMD=41, эффект тот же. Если после CMD=0 ввести CMD=58 Ответ: 0 255 128 255. Ответ на CMD=8 ответ=9. Как ввести этой команде атрибуты нигде не нашел. А она вроде участвует в инициализации. Спасибо.

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


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

Тогда по пунктам. Если после отправки не дождаться принятия байта, то он конда-нибудь все же примется. тем самым взведет соответствующий бит в статус-регистре. При следующей посылке с чтением вы посылаете байт и тут же проверяете флаг принятия байта. Но он остался взеведенным с прошлой посылки. При этом контроллер именно в этот момент принимает байт. Что вы в этот момент прочитаете из регистра принятых данных - х.з. Хорошо если предыдуший принятый байт. Соответственно с задержками это все будет как-то работать.

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

 

Вообще логично, согласен. Уже сделал на одной функции.

Инициализацию прошел, но с задержками. MMC: CMD0, CMD1, CMD16, дальше пока не пробовал.

Но, откуда задержки? Ни в одном примере их нет, и у всех все работает. Сдираю пример "в ноль" для моего проца - без задержек не работает, уменьшаю задержку со 100 до 50 мкс - не работает.

Есть у кого какие мысли по этому поводу?

 

 

Здравствуйте!!! Подскажите с инициализацией micro SD Apacer 1024Mb. Работаю через LPT. CMD и DAT подтянуты к питанию через 30к. Шлю CMD=0, ответ =1. CMD=1, ответ=255 и все, никание команды не принимает. При CMD=55 + CMD=41, эффект тот же. Если после CMD=0 ввести CMD=58 Ответ: 0 255 128 255. Ответ на CMD=8 ответ=9. Как ввести этой команде атрибуты нигде не нашел. А она вроде участвует в инициализации. Спасибо.

С командой CMD8 есть пример сдесь http://elm-chan.org/fsw/ff/ffsample.zip

if (send_cmd(CMD8, 0x1AA) == 1) { /* SDHC */

Я так понял это команда для SDHC карт.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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