реклама на сайте
подробности

 
 
> Алгоритм CRC16 для SD карты на ассемблере AVR, полином X16+X12+X5+1
Lisitsin
сообщение Aug 9 2017, 15:11
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 1-10-10
Из: Рязань
Пользователь №: 59 868



Здравствуйте, уважаемые коллеги!
Столкнулся с такой проблемой. Перерыл весь интернет, не могу найти алгоритм подсчёта контрольной суммы для чтения сектора 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 - Aug 9 2017, 16:01


--------------------
с Уважением,
Lisitsin
Vasil.Lisitsin@yandex.ru
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aiwa
сообщение Aug 10 2017, 14:54
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Сергей Борщ @ Aug 10 2017, 16:46) *
Может вы используете другое начальное значение? Например вы используете 0, а они 0xFFFF или наоборот.

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

к примеру
Цитата
Name : CRC-16 CCITT
Poly : 0x1021 x^16 + x^12 + x^5 + 1


Сообщение отредактировал aiwa - Aug 10 2017, 15:02
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 10 2017, 16:18
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 02:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016