|
|
 |
Ответов
|
Jun 4 2009, 11:46
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Jun 4 2009, 15:14)  Можно, конечно. Хотя ускорять рассчет 5 байт большого смысла нет. Это понятно, но всё равно интересно - как? В сети нигде не нашёл работающего примера без битового цикла... Для данных это да. Но для SPI сумма не нужна (странно, конечно, но неужели надёжность SPI близка к 100%, чтобы в контрольной сумме отпала надобность?), а SDIO контроллеры будут считать её аппаратно... ЗЫ: вот ваша процедура на Си, она пооптимальнее, чем приведённая мной: Код u8 CRC7(u8* chr, int cnt) { int i,a; u8 crc = 0;
for (a=0; a < cnt; a++) { crc ^= chr[a]; for (i=0; i < 8; i++) { if (crc & 0x80) { crc <<= 1; crc ^= 0x12; } else crc <<= 1; } } crc |= 1; return crc; }
|
|
|
|
|
Jun 4 2009, 12:00
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sonycman @ Jun 4 2009, 15:46)  Это понятно, но всё равно интересно - как? Табличкой, например. Цитата(sonycman @ Jun 4 2009, 15:46)  Для данных это да. Но для SPI сумма не нужна (странно, конечно, но неужели надёжность SPI близка к 100%, чтобы в контрольной сумме отпала надобность?), а SDIO контроллеры будут считать её аппаратно... Для SPI ее можно не включать, но это не значит, что она не нужна. Я, например, включаю и использую. Цитата(sonycman @ Jun 4 2009, 15:46)  ЗЫ: вот ваша процедура на Си, она пооптимальнее, чем приведённая мной: Спасибо, конечно, а я-то специально на асм переводил  Если интересно, то вот вариант для данных: Код 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 = 0;
while(len--) { data = *buff++ ^ (crc >> 0x08); crc = (sd_crc16_table_a[(data & 0xf0) >> 4] ^ sd_crc16_table_b[data & 0x0f]) ^ (crc << 8); } return crc; }
|
|
|
|
|
Jun 4 2009, 12:26
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Jun 4 2009, 16:00)  Табличкой, например. Да, это вариант. Но самое прикольное - это хитрые варианты, когда без таблиц и без цилов, быстрое вычисление всего лишь несколькими командами. Наверное, такое возможно не всегда... Цитата(aaarrr @ Jun 4 2009, 16:00)  Если интересно, то вот вариант для данных: Спасибо, красивая реализация, небольшие таблички и минимум вычислений
|
|
|
|
|
Jun 4 2009, 18:05
|
Местный
  
Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860

|
Цитата(sonycman @ Jun 4 2009, 18:26)  <br />Да, это вариант. Но самое прикольное - это хитрые варианты, когда без таблиц и без цилов Когда флэша нехватает, я использую такой код Код ; in/out YH аккумулятор ; in R18 следующий байт CRC7Update: eor YH, R18 ; Левый полубайт mov R19, YH andi R19, 0xF0 swap R19 eor YH, R19 swap R19 add R19, R19 brcc CRC7Skip ldi YL, 0x01 eor YH, YL CRC7Skip: mov YL, R19 ; Правый полубайт mov R19, YH andi R19, 0x0F swap R19 eor YL, R19 swap R19 add R19, R19 eor YL, R19 mov YH, YL ret и Код ; IN: R4, R5 - аккумулятор CRC ; R18 - значение ; OUT: R4, R5
; По модулю 0x11021 CRC16Update: push R18 push R19 eor R4, R18 ; Левый полубайт mov R19, R4 andi R19, 0xF0 mov R18, R19 swap R19 eor R4, R19 add R19, R19 eor R5, R19 ; Правый полубайт mov R19, R4 andi R19, 0x0F eor R18, R19 swap R19 eor R5, R19 add R19, R19 brcc CRC16Skip clr R4 inc R4 eor R5, R4 CRC16Skip: eor R18, R19 mov R4, R5 mov R5, R18 pop R19 pop R18 ret
|
|
|
|
Сообщений в этой теме
svchost SD карта не просыпается Jun 1 2009, 11:42 aaarrr Cначала нужно дать минимум 74 клока, затем CMD0, з... Jun 1 2009, 11:56 svchost Цитата(aaarrr @ Jun 1 2009, 15:56) Cначал... Jun 1 2009, 13:01  etoja Цитата(svchost @ Jun 1 2009, 17:01) все э... Jun 1 2009, 13:24  aaarrr Цитата(svchost @ Jun 1 2009, 17:01) все э... Jun 1 2009, 13:31   svchost Цитата(aaarrr @ Jun 1 2009, 17:31) Значит... Jun 1 2009, 13:39 aaarrr CMD1 или ACMD41? CMD1 использовать не рекомендуетс... Jun 1 2009, 13:44 svchost Цитата(aaarrr @ Jun 1 2009, 17:44) CMD1 и... Jun 1 2009, 13:56  aaarrr Цитата(svchost @ Jun 1 2009, 17:56) ACMD4... Jun 1 2009, 18:39   svchost Цитата(aaarrr @ Jun 1 2009, 22:39) Так, а... Jun 1 2009, 20:03 woroba Цитата(svchost @ Jun 1 2009, 17:42) Добры... Jun 1 2009, 13:55 aaarrr Для инициализации SD всегда нужно использовать ACM... Jun 1 2009, 20:16 svchost Цитата(aaarrr @ Jun 2 2009, 00:16) Для ин... Jun 1 2009, 20:29  aaarrr Цитата(svchost @ Jun 2 2009, 00:29) Сколь... Jun 1 2009, 20:51 sonycman Ncr может быть от 0 до 8 байт.
Что характерно, де... Jun 2 2009, 04:02 aaarrr Цитата(sonycman @ Jun 2 2009, 08:02) Ncr ... Jun 2 2009, 07:33 adc Цитата(svchost @ Jun 2 2009, 00:03) ...
П... Jun 2 2009, 06:19 svchost Цитата(adc @ Jun 2 2009, 10:19) Было бы и... Jun 3 2009, 20:08 adc Цитата(svchost @ Jun 4 2009, 00:08) Пожал... Jun 4 2009, 06:57 aaarrr Цитата(adc @ Jun 4 2009, 10:57) Несколько... Jun 4 2009, 07:25  svchost Цитата(aaarrr @ Jun 4 2009, 11:25) Да уж,... Jun 4 2009, 15:45   aaarrr Цитата(svchost @ Jun 4 2009, 19:45) Подпр... Jun 4 2009, 17:52 adc to ivstech and aaarrr: странно но результат вычисл... Jun 5 2009, 06:38 aaarrr Цитата(adc @ Jun 5 2009, 10:38) Зачем она... Jun 5 2009, 07:05 svchost Контрольный байт для отправки SD карте получается
... Jun 5 2009, 11:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|