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

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

Укоротил провода.

Поставил задержку 20 мкс - не инициализирует.

post-18059-1226150551_thumb.jpg

 

1. На 400 кГц - 10 см это не длина.

2. Задержка стоит после посылки каждых 8 бит, т.е. 8 бит проходят нормально, а потом вдруг длинные провода начинаю искажать сигнал?

3. Задержка на всех частотах одинаковая. Написал это и подумал, что надо сделать разные задержки для разных частот, может это даст пищу для размышлений.

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


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

Проверил.

Во время инициализации поставил задержку 40 мкс (уменьшать не пробовал).

После инициализации задержку поставил 0 мкс (т.е. только вызов Delay_mks(0)).

 

После перепайки картоприемника, при вставке SDv2, вешается дисплей, видимо много жрет и просаживает питание. Потом надо будет навешать кондеров.

 

Вощем уже можно нормально работать.

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


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

1. На 400 кГц - 10 см это не длина.

Дело не в килогерцах, а в быстрых фронтах. Такой дизайн работать не должен вообще.

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


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

ИМХО в данном случае дело не в проводах. Как сделаю целевую плату обязательно отпишусь.

 

Вы лучше скажите, многоуважаемые гуру, как происходит работа с картой в библиотеке FatFs.

Основной вопрос: как и как часто происходит перезапись FAT?

При каждой записи в файл, или при пересечении границ сегмента, или только при вызове f_sync (FIL*)?

Я чет пока немогу вкурить все эти FAT, MBR, PBR....

 

У меня задача логить ~100 байт в файл с интервалом в 10с. Возникает вопрос: долго карта выдержит?

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


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

У меня задача логить ~100 байт в файл с интервалом в 10с. Возникает вопрос: долго карта выдержит?

 

 

Друг в Минске работает на конторе, пишут нижний уровень для контроллеров карточек SD. Говорит, там имеются алгоритмы слежения за числом обращений к секторам. Миллион циклов перезаписи вполне может быть и не пределом.По этому поводу хочу спросить про такую идею:

Если заранее создать файл n-ого размера и заполнить его нулями. Значит FAT таблица будет создана и при последующей записи в этот файл она меняться не будет. Выходит это 100% защита от повреждения FAT таблиц при пропадания питания . Также это уменьшение обращений к таблицам, что экономит ресурс. Или чего-то не так :) ?

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


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

Или чего-то не так :) ?

Все почти так, только с таким файлом на PC не очень удобно работать, и 100% защиты от повреждения FAT при пропадании питания это, конечно, не дает.

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


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

Может кому будет полезно... Иногда бывают проблемы с инициализацией. ВРоде бы всё по даташитам, но конкретная карточка не инициализируется, хоть убей. Иногда помогает инициализация на низких скоростях, как в этом топике обсуждается.

 

Но есть методы борьбы без снижения скорости: один метод предложен и проверен тут: http://dlcorp.ucoz.ru/_fr/2/MMCSDCard.pdf (страница 5, сверху). Другой метод - настоить ваш SPI так, чтобы последний переданный бит оставался на выходе SPI MOSI после конца обмена. Тоже помогает, но может статься, что это невозможно в данном МК. Тогда первый метод из ПДФки прокатывает.

 

PS: оба эти метода проверил и применяю лично. Помогают.

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


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

Честно говоря меня этот код из даташита настораживает, никаких проверок Response, только b!=0xFF. Как то нехорошо...

В чем суть метода? Ловить 0xFF перед проверкой Response?

Хотя это не для меня, у меня вечный 0xFF в ответе.

 

Кстати по последнему разбору, у меня требуется задержка только для команды CMD0.

Чет у меня впечатление, что с питанием нехорошо, на выходных посмотрю.

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


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

Честно говоря меня этот код из даташита настораживает, никаких проверок Response, только b!=0xFF. Как то нехорошо...

В чем суть метода? Ловить 0xFF перед проверкой Response?

Хотя это не для меня, у меня вечный 0xFF в ответе.

Кратко суть такова:

послать команду

поймать респонс как по даташиту

перед посылкой следующей команды слать ФФ, пока в ответ тоже не придёт ФФ

 

Кстати по последнему разбору, у меня требуется задержка только для команды CMD0.

Чет у меня впечатление, что с питанием нехорошо, на выходных посмотрю.

Именно, проблема только при инициализации, насколько я помню,

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


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

Всем спасибо!!! Вопрос решил. Сделал внешнее питание (от USB) на lm317. Все пошло!!! Инициаллизируется CMD1. Все отвечает и принимает. Оказалось карточка отвечает и без питания. Чудо, но факт! Отрубаю питание и возвращаюсь в старое состояние. Так что смотрите питание.

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


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

Оказалось карточка отвечает и без питания. Чудо, но факт! Отрубаю питание и возвращаюсь в старое состояние.

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

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


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

Как сделаю целевую плату обязательно отпишусь.

 

Таки сделал плату.

Теперь задержка понадобилась и в CMD16.

 

Задержка после каждых 8 бит

CMD0:

10 мкс - не проходит

20 мкс - не проходит

30 мкс - Ок

40 мкс - Ок

CMD16:

0 мкс - не проходит

10 мкс - не проходит

20 мкс - не проходит

30 мкс - Ок

40 мкс - Ок

Остальные команды:

0 мкс - Ок

:07:

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


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

А мои - бесплатными. B) Новый год, все-таки. :santa2:.

Вот оно - Пишите, если будут вопросы.

а можно и мне ? :)

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


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

а можно и мне ? :)

Те исходники уже не откопаю, но могу предложить наиболее полезную часть, на которую так любят забивать в "бесплатных примерах" - подсчет CRC для команд и данных.

 

//******************************************************************************

u_int sd_crc7(u_char *buff, u_int len)
{
    u_int a, crc = 0x00;

    while(len--)
    {
        crc ^= *buff++;
        a = 0x08;
        do
        {
            crc <<= 0x01;
            if(crc & 0x100) crc ^= 0x12;
        } while(--a);
    }
    return (crc & 0xfe);
}

//******************************************************************************

const u_short sd_crc16_table_a[0x10] =
{
    0x0000, 0x1231, 0x2462, 0x3653,
    0x48c4, 0x5af5, 0x6ca6, 0x7e97,
    0x9188, 0x83b9, 0xb5ea, 0xa7db,
    0xd94c, 0xcb7d, 0xfd2e, 0xef1f
};

const u_short sd_crc16_table_b[0x10] =
{
    0x0000, 0x1021, 0x2042, 0x3063,
    0x4084, 0x50a5, 0x60c6, 0x70e7,
    0x8108, 0x9129, 0xa14a, 0xb16b,
    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};

u_int sd_crc16(u_char *buff, u_int len)
{
    u_char data;
    u_short crc = 0x00;

    while(len--)
    {
        data = *buff++ ^ (crc >> 0x08);
        crc = (sd_crc16_table_a[(data & 0xf0) >> 4] ^ sd_crc16_table_b[data & 0x0f]) ^ (crc << 8);
    }
    return crc;
}

//******************************************************************************

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


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

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

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

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

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

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

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

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

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

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