|
|
  |
SD Card - програмная реализация интерфейса, У кого нибудь есть примеры реализации взаимодействия с SD Card? |
|
|
|
Dec 24 2009, 04:34
|

Участник

Группа: Участник
Сообщений: 20
Регистрация: 6-11-09
Пользователь №: 53 443

|
Цитата(KAlex @ Dec 23 2009, 18:33)  Как в ДШ нарисовано, так и подключал. Ваш МК был 3-х вольтовый? У меня 5-ти вольтовый. Интересно согласование. Может у меня ДШ не того...Может я чего не доглядел. Да и английский не русский? Спасибо.
|
|
|
|
|
Jan 2 2010, 14:20
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Считать лень. Можете просто сравнить с этой функцией: CODE const unsigned short sd_crc16_table_a[16] = { 0x0000, 0x1231, 0x2462, 0x3653, 0x48c4, 0x5af5, 0x6ca6, 0x7e97, 0x9188, 0x83b9, 0xb5ea, 0xa7db, 0xd94c, 0xcb7d, 0xfd2e, 0xef1f };
const unsigned short sd_crc16_table_b[16] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef };
unsigned short sd_crc16(unsigned char *buff, unsigned int len) { unsigned char data; unsigned short crc = 0;
while(len--) { data = *buff++ ^ (crc >> 8); crc = (sd_crc16_table_a[(data & 0xf0) >> 4] ^ sd_crc16_table_b[data & 0x0f]) ^ (crc << 8); } return crc; }
Оказывается, я ее уже выкладывал в этой теме. Хоть бы поискали.
|
|
|
|
|
Jan 3 2010, 03:54
|

Участник

Группа: Участник
Сообщений: 20
Регистрация: 6-11-09
Пользователь №: 53 443

|
Цитата(aaarrr @ Jan 3 2010, 00:20)  Считать лень. Можете просто сравнить с этой функцией: .............. Оказывается, я ее уже выкладывал в этой теме. Хоть бы поискали. Моя реализация отличается от вашей. Цели не было брать чужой (правильный) код. Хотел только узнать готовые значения для проверки своих реализаций функции расчета CRC16(SD). Для CRC7 добрые люди выкладывали, а вот для CRC16(SD) че-то не нашел. Спасибо.
|
|
|
|
|
Jan 3 2010, 10:45
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
В свое время тоже намучился с CRC. Выбирая между табличным и вычислителным методами пришел к компромиссу. Как мне кажется оптимальным будет вычисление таблицы в ОЗУ и дальнейшая работа с ней. И код компактный, и работает быстро. Код #define CRC16_POLYNOMIAL 0x1021 static unsigned short crc16_syndrome_table[256];
void gen_crc16_syndrome_table(void) { unsigned int c; unsigned int n; unsigned char k; unsigned int poly; // polynomial exclusive-or pattern poly = CRC16_POLYNOMIAL; for (n=0; n<256; n++) { c = n << 8; for(k=0; k<8; k++) c = c & (0x8000) ? poly ^ (c << 1) : (c << 1); crc16_syndrome_table[n] = c; } }
unsigned short crc16(unsigned char * pcBlock, unsigned short len) { unsigned short crc = 0xFFFF; while (len--) crc = (crc << 8) ^ crc16_syndrome_table[(crc >> 8) ^ *pcBlock++]; return crc; }
|
|
|
|
|
Jan 3 2010, 12:04
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(KAlex @ Jan 3 2010, 13:45)  Выбирая между табличным и вычислителным методами пришел к компромиссу. Как мне кажется оптимальным будет вычисление таблицы в ОЗУ и дальнейшая работа с ней. Экономия, допустим, Flash и повышение быстродействия (не всегда) путем засирания драгоценной для микроконтроллеров RAM таблицей это компромисс? Между чем и чем? Пример, именно компромисса между полным табличным и вычислительным методом приводил aaarrr. Причем с привязкой к конкретному вопросу, а не просто "CRC". Компромиссным вариантом в некоторых случаях может быть и развертывание побитного цикла.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 3 2010, 13:27
|

Участник

Группа: Участник
Сообщений: 20
Регистрация: 6-11-09
Пользователь №: 53 443

|
Цитата(aaarrr @ Jan 3 2010, 18:54)  ...... просто берете любую чужую функцию, и считаете ей значение для чего угодно. Зачем чужую? Своя есть. Хочу проверить как работает. Ведь чужих вариантов тоже не один.  В ДШ есть пример: 512 по 0хFF, хотел проверить другие наборы.
|
|
|
|
|
Jan 5 2010, 08:55
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Цитата(zltigo @ Jan 3 2010, 15:04)  Экономия, допустим, Flash и повышение быстродействия (не всегда) путем засирания драгоценной для микроконтроллеров RAM таблицей это компромисс? А я и не претендовал на истину в последней инстанции. Это для моей конкретной задачи. RAMа много, ROMа мало. Вот и выкручиваюсь как могу. И код выкладывал не для того, чтобы похвалиться. А для того, что может быть кому пригодится.
|
|
|
|
|
Jan 5 2010, 12:17
|

Участник

Группа: Участник
Сообщений: 20
Регистрация: 6-11-09
Пользователь №: 53 443

|
Цитата(KAlex @ Jan 5 2010, 18:55)  А я и не претендовал на истину в последней инстанции. Это для моей конкретной задачи. RAMа много, ROMа мало. Вот и выкручиваюсь как могу. И код выкладывал не для того, чтобы похвалиться. А для того, что может быть кому пригодится. Я думаю вы сделали все правильно. Спасибо вам за ваш код. Он пригодится. Помогать сложно. Критиковать просто...
|
|
|
|
|
Jan 9 2010, 05:01
|

Участник

Группа: Участник
Сообщений: 20
Регистрация: 6-11-09
Пользователь №: 53 443

|
При инициализации в SD-mode карта отвечает на команды, но ответы странные: на CMD8 отвечает 00 00 00 02 00 FF на CMD55 отвечает 2C 00 00 00 00 7F на ACMD41 отвечает 3F 81 FE 00 03 FF на CMD2 выдает 14 байт, а не положенные 17(если конечно хвост не сплошные FF - что тоже странно) Чего-то не понимаю, а чего не понимаю, еще не понимаю Может у кого было подобное, помогите советом, подскажите чего делать.?
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|