|
|
  |
SD карта не просыпается |
|
|
|
Jun 2 2009, 07:33
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sonycman @ Jun 2 2009, 08:02)  Ncr может быть от 0 до 8 байт. N cr - до 8, N rc - 1. Цитата(sonycman @ Jun 2 2009, 08:02)  Что характерно, действительно после любой команды нужно подавать 1 байт холостого чтения, иначе карта не будет нормально воспринимать следующую команду... Вот это и есть N rc.
|
|
|
|
|
Jun 3 2009, 20:08
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779

|
Цитата(adc @ Jun 2 2009, 10:19)  Было бы интересно взглянуть.  Пожалуйста... CLR CRC ... LDI A,$40 CALL CRC7 ...
Сообщение отредактировал svchost - Jun 3 2009, 20:17
Прикрепленные файлы
crc7.rar ( 708 байт )
Кол-во скачиваний: 37
|
|
|
|
|
Jun 4 2009, 06:57
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(svchost @ Jun 4 2009, 00:08)  Пожалуйста... .. Спасибо! Несколько сыровато. Код непроверенный?
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
Jun 4 2009, 07:25
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(adc @ Jun 4 2009, 10:57)  Несколько сыровато. Код непроверенный? Да уж, надо было так запутать  Вот что получается, если написать просто "в лоб": Код ; X - указатель на данные, ; b - длина
crc7: clr crc ldi d, 0x12 crc7_0: ld a, X+ eor crc, a ldi c, 8 crc7_1: lsl crc brcc PC+0x02 eor crc, d dec c brne crc7_1 dec b brne crc7_0 ori crc, 1 ret
|
|
|
|
|
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, 15:45
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779

|
Цитата(aaarrr @ Jun 4 2009, 11:25)  Да уж, надо было так запутать  Вот что получается, если написать просто "в лоб": Код ; X - указатель на данные, ; b - длина
crc7: clr crc ldi d, 0x12 crc7_0: ld a, X+ eor crc, a ldi c, 8 crc7_1: lsl crc brcc PC+0x02 eor crc, d dec c brne crc7_1 dec b brne crc7_0 ori crc, 1 ret Подпрограмма CRC7 полностью работоспособна. У каждого свое решение. Считаю, что мой вариант полностью отражает алгоритм подсчета CRC7 и вполне понятен. Спасибо.
Сообщение отредактировал svchost - Jun 4 2009, 15:51
|
|
|
|
|
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
|
|
|
|
|
Jun 5 2009, 06:38
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
to ivstech and aaarrr: странно но результат вычисления CRC7 ваших алгоритмов разный.?! это нормально?  разница в этой строчке у Вас aaarrr: Код ori crc, 1 Зачем она?
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|