Здравствуйте, уважаемые коллеги!
Столкнулся с такой проблемой. Перерыл весь интернет, не могу найти алгоритм подсчёта контрольной суммы для чтения сектора 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 ; -
Вот и всё в общем-то. Может кто-то сказать в чём я ошибся?
Огромное СПАСИБО!!!