|
|
  |
SD Card - програмная реализация интерфейса, У кого нибудь есть примеры реализации взаимодействия с SD Card? |
|
|
|
Nov 8 2008, 13:32
|

Местный
  
Группа: Свой
Сообщений: 206
Регистрация: 14-06-06
Из: Могилев
Пользователь №: 18 059

|
Укоротил провода. Поставил задержку 20 мкс - не инициализирует.
1. На 400 кГц - 10 см это не длина. 2. Задержка стоит после посылки каждых 8 бит, т.е. 8 бит проходят нормально, а потом вдруг длинные провода начинаю искажать сигнал? 3. Задержка на всех частотах одинаковая. Написал это и подумал, что надо сделать разные задержки для разных частот, может это даст пищу для размышлений.
|
|
|
|
|
Nov 9 2008, 16:22
|
Местный
  
Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737

|
Цитата(John Silver @ Nov 9 2008, 01:29)  У меня задача логить ~100 байт в файл с интервалом в 10с. Возникает вопрос: долго карта выдержит? Друг в Минске работает на конторе, пишут нижний уровень для контроллеров карточек SD. Говорит, там имеются алгоритмы слежения за числом обращений к секторам. Миллион циклов перезаписи вполне может быть и не пределом.По этому поводу хочу спросить про такую идею: Если заранее создать файл n-ого размера и заполнить его нулями. Значит FAT таблица будет создана и при последующей записи в этот файл она меняться не будет. Выходит это 100% защита от повреждения FAT таблиц при пропадания питания . Также это уменьшение обращений к таблицам, что экономит ресурс. Или чего-то не так  ?
|
|
|
|
|
Nov 11 2008, 09:37
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 18-10-06
Пользователь №: 21 418

|
Может кому будет полезно... Иногда бывают проблемы с инициализацией. ВРоде бы всё по даташитам, но конкретная карточка не инициализируется, хоть убей. Иногда помогает инициализация на низких скоростях, как в этом топике обсуждается. Но есть методы борьбы без снижения скорости: один метод предложен и проверен тут: http://dlcorp.ucoz.ru/_fr/2/MMCSDCard.pdf (страница 5, сверху). Другой метод - настоить ваш SPI так, чтобы последний переданный бит оставался на выходе SPI MOSI после конца обмена. Тоже помогает, но может статься, что это невозможно в данном МК. Тогда первый метод из ПДФки прокатывает. PS: оба эти метода проверил и применяю лично. Помогают.
|
|
|
|
|
Nov 11 2008, 11:04
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 18-10-06
Пользователь №: 21 418

|
Цитата(John Silver @ Nov 11 2008, 13:21)  Честно говоря меня этот код из даташита настораживает, никаких проверок Response, только b!=0xFF. Как то нехорошо... В чем суть метода? Ловить 0xFF перед проверкой Response? Хотя это не для меня, у меня вечный 0xFF в ответе. Кратко суть такова: послать команду поймать респонс как по даташиту перед посылкой следующей команды слать ФФ, пока в ответ тоже не придёт ФФ Цитата Кстати по последнему разбору, у меня требуется задержка только для команды CMD0. Чет у меня впечатление, что с питанием нехорошо, на выходных посмотрю. Именно, проблема только при инициализации, насколько я помню,
|
|
|
|
|
Nov 11 2008, 17:13
|
Группа: Участник
Сообщений: 8
Регистрация: 23-01-08
Пользователь №: 34 363

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

Местный
  
Группа: Свой
Сообщений: 206
Регистрация: 14-06-06
Из: Могилев
Пользователь №: 18 059

|
Цитата(John Silver @ Nov 9 2008, 01:29)  Как сделаю целевую плату обязательно отпишусь. Таки сделал плату. Теперь задержка понадобилась и в CMD16. Задержка после каждых 8 бит CMD0: 10 мкс - не проходит 20 мкс - не проходит 30 мкс - Ок 40 мкс - Ок CMD16: 0 мкс - не проходит 10 мкс - не проходит 20 мкс - не проходит 30 мкс - Ок 40 мкс - Ок Остальные команды: 0 мкс - Ок
|
|
|
|
|
Dec 24 2008, 20:20
|
Участник

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

|
Цитата(aaarrr @ Dec 28 2006, 19:50)  А мои - бесплатными.  Новый год, все-таки.  . Вот оно - [attachment=8919:attachment]Пишите, если будут вопросы. а можно и мне ?
|
|
|
|
|
Dec 24 2008, 21:16
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Hermes @ Dec 24 2008, 23:20)  а можно и мне ?  Те исходники уже не откопаю, но могу предложить наиболее полезную часть, на которую так любят забивать в "бесплатных примерах" - подсчет 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; }
//******************************************************************************
|
|
|
|
|
  |
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0
|
|
|