Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм CRC16 для SD карты на ассемблере AVR
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам
Lisitsin
Здравствуйте, уважаемые коллеги!
Столкнулся с такой проблемой. Перерыл весь интернет, не могу найти алгоритм подсчёта контрольной суммы для чтения сектора 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 ; -

Вот и всё в общем-то. Может кто-то сказать в чём я ошибся?
Огромное СПАСИБО!!!
Lisitsin
Пока ни чего не получается ... (((
Хочу попробовать вот этот алгоритм:
https://books.google.ru/books?id=k08dpyb6V7...ler&f=false
AlexRayne
а почему асемблер?
Сергей Борщ
Может вы используете другое начальное значение? Например вы используете 0, а они 0xFFFF или наоборот.
aiwa
Цитата(Сергей Борщ @ Aug 10 2017, 16:46) *
Может вы используете другое начальное значение? Например вы используете 0, а они 0xFFFF или наоборот.

Или другой полином.

к примеру
Цитата
Name : CRC-16 CCITT
Poly : 0x1021 x^16 + x^12 + x^5 + 1
AHTOXA
Хочу заметить, что для обмена с SD-картой по SPI crc считать не надо.
(Вернее, надо, но только для одной команды - MMC_CMD_0_GO_IDLE. Поэтому можно отправлять всё время crc от этой команды).
Lisitsin
Инициализировал в 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 ; [
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.