Перейти к содержанию
    

Алгоритм CRC16 для SD карты на ассемблере AVR

Здравствуйте, уважаемые коллеги!

Столкнулся с такой проблемой. Перерыл весь интернет, не могу найти алгоритм подсчёта контрольной суммы для чтения сектора 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может вы используете другое начальное значение? Например вы используете 0, а они 0xFFFF или наоборот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может вы используете другое начальное значение? Например вы используете 0, а они 0xFFFF или наоборот.

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

 

к примеру

Name : CRC-16 CCITT

Poly : 0x1021 x^16 + x^12 + x^5 + 1

Изменено пользователем aiwa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу заметить, что для обмена с SD-картой по SPI crc считать не надо.

(Вернее, надо, но только для одной команды - MMC_CMD_0_GO_IDLE. Поэтому можно отправлять всё время crc от этой команды).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Инициализировал в 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 ; [

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...