Lisitsin 0 9 августа, 2017 Опубликовано 9 августа, 2017 (изменено) · Жалоба Здравствуйте, уважаемые коллеги! Столкнулся с такой проблемой. Перерыл весь интернет, не могу найти алгоритм подсчёта контрольной суммы для чтения сектора SD карты на ассемблере. реализовал вот этот алгоритм: https://embdev.net/articles/CRC-16-CCITT_in_AVR_Assembler Реализовал в своём проекте. В документе Physical Layer Simplisied Specification v4.1 говорится, что CRC16 Example 512 bytes with 0xFF data --> CRC16 = 0x7FA1 и действительно, если записать сектор со значениями 0xff во всех байтах, то при его чтении вижу crc16=0x7fa1, а этот алгоритм даёт 0x6995. Вот и возникает вопрос: может, я что-то не так делаю? Или это неверный алгоритм? На всякий случай привожу свой код на AVR Atmega128-16PU: BUF - временный регистр. Использую при чтении байта из карты. ZH:ZL - собственно, CRC16 TMPH:TMPL - пара регистров, использую при вычислении CRC16 SER ZH ; - SER ZL ; - инициализация CRC16 RS_RDLOOP: MOV BUF,ZH ; /// MOV ZH,ZL ; /// меняем местами байты CRC16 MOV ZL,BUF ; /// RCALL RCV_BYTE ; - процедура чтения байта из карты ST X+,BUF ; - RECIEVE NEXT BYTE eor ZL, BUF ; First XOR mov TMPH, ZL ; swap TMPH ; These 2 instructions are faster than executing 4 times "lsr 4". andi TMPH, 0x0F ; eor ZL, TMPH ; Second XOR mov TMPH, ZL swap TMPH andi TMPH, 0xF0 eor ZH, TMPH ; Third XOR mov TMPH, ZL swap TMPH mov TMPL, TMPH andi TMPH, 0xF0 andi TMPL, 0x0F lsl TMPH rol TMPL eor ZL, TMPH ; Fourth XOR eor ZH, TMPL CPI XH,HIGH(SND_BUF+0X200) ; - это собственно проверка на конец заполнения буфера чтения 512 байт BRCS RS_RDLOOP ; - Вот и всё в общем-то. Может кто-то сказать в чём я ошибся? Огромное СПАСИБО!!! Изменено 9 августа, 2017 пользователем Lisitsin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lisitsin 0 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба Пока ни чего не получается ... ((( Хочу попробовать вот этот алгоритм: https://books.google.ru/books?id=k08dpyb6V7...ler&f=false Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexRayne 7 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба а почему асемблер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба Может вы используете другое начальное значение? Например вы используете 0, а они 0xFFFF или наоборот. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 10 августа, 2017 Опубликовано 10 августа, 2017 (изменено) · Жалоба Может вы используете другое начальное значение? Например вы используете 0, а они 0xFFFF или наоборот. Или другой полином. к примеру Name : CRC-16 CCITT Poly : 0x1021 x^16 + x^12 + x^5 + 1 Изменено 10 августа, 2017 пользователем aiwa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба Хочу заметить, что для обмена с SD-картой по SPI crc считать не надо. (Вернее, надо, но только для одной команды - MMC_CMD_0_GO_IDLE. Поэтому можно отправлять всё время crc от этой команды). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lisitsin 0 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба Инициализировал в 0xffff Да, использую режим SPI, CRC отключена, но однажды поймал карту на чтении ложного бита, и решил чекать CRC при чтении сектора. Сейчас всё заработало, использую другой алгоритм, описанный здесь: https://books.google.ru/books?id=k08dpyb6V7...ler&f=false но автор книжки написал его очень неоптимально, и у меня после оптимизации получилось следующее: здесь ZH:ZL - CRC16 в TMPH:TMPL записан полином (0x1021) BUFH использую как счётчик до 8 BUF - для чтения байта из карты RCALL RCV_BYTE ; - читаем байт из карты. Байт падает в BUF. ST X+,BUF ; - записываем в ОЗУ LDI BUFH,8 ; 8 раз будим двигать EOR ZH,BUF ; RS_REPEAT: LSL ZL ; [ сдвигаемся так, чтобы в С появился старший бит CRC ROL ZH ; [ BRCC SHIFT_ONLY ; [ EOR ZL,TMPL ; [ вычисляем CRC EOR ZH,TMPH ; [ SHIFT_ONLY: DEC BUFH ; [ BRNE RS_REPEAT ; [ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться