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

Как считать CRC в CAN Шине


Tokes

Рекомендуемые сообщения

Здравствуйте. Отчаялся найти хорошее пояснение с примерами как считать CRC CAN frame. Ранее с CRC не сталкивался.

Пишут, что вот это: x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1 - есть полином, он же многочлен CRC-15 конкретно для CAN шины. Есть у меня кадр CAN сообщения от SOF до EOF. Какие именно я должен взять данные и что конкретно я должен с ними сделать.

Возвращаясь к полиному. Пишут, что HEX его - 0x4599. То есть в бинарном представлении 0100 0101 1001 1001. Я вижу, что все "x" в степени соответствуют их порядковому номеру справа-налево. Кроме x^15. Он тут равен нулю. Так что значит всё же эта запись, как её читать правильно?

Например, конкретный пакет с уже посчитанным CRC: DATA, 0x0CF00400, 0x8, 0xF0 0x7D 0x7D 0x00 0x00 0x00 0xF0 0xFF, 0x72FC, ACK

Дайте информацию, пожалуйста, как конкретно эта CRC получилась.

 

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@Vascom , не могли бы вы пояснить, почему он опущен в числе, а в формуле указан?

@dev , вставил я в этот код свои данные - uint8_t data[] = { 0xF0, 0x7D, 0x7D, 0x00, 0x00, 0x00, 0xF0, 0xFF }; , на выходе получилось другое число - 0x3E58. Что никак не похоже на 0x72FC.

p.s. пробовал инвертировать, т.е. считать с 8 по 1 байт - всё равно не то.

Изменено пользователем Tokes
Ссылка на комментарий
Поделиться на другие сайты

В официальной документации протокола я нашёл что-то типа этого:

CRC SEQUENCE
The frame check sequence is derived from a cyclic redundancy code best suited for
frames with bit counts less than 127 bits (BCH Code).
In order to carry out the CRC calculation the polynomial to be divided is defined as the
polynomial, the coefficients of which are given by the destuffed bit stream consisting of
START OF FRAME, ARBITRATION FIELD, CONTROL FIELD, DATA FIELD (if
present) and, for the 15 lowest coefficients, by 0. This polynomial is divided (the
coefficients are calculated modulo-2) by the generator-polynomial:
X15 + X14 + X10 + X8 + X7 + X4 + X3 + 1.
The remainder of this polynomial division is the CRC SEQUENCE transmitted over the
bus. In order to implement this function, a 15 bit shift register CRC_RG(14:0) can be
used. If NXTBIT denotes the next bit of the bit stream, given by the destuffed bit
sequence from START OF FRAME until the end of the DATA FIELD, the CRC
SEQUENCE is calculated as follows:

CRC_RG = 0; // initialize shift register
REPEAT
CRCNXT = NXTBIT EXOR CRC_RG(14);
CRC_RG(14:1) = CRC_RG(13:0); // shift left by
CRC_RG(0) = 0; // 1 position
IF CRCNXT THEN
CRC_RG(14:0) = CRC_RG(14:0) EXOR (4599hex);
ENDIF
UNTIL (CRC SEQUENCE starts or there is an ERROR condition)
After the transmission / reception of the last bit of the DATA FIELD, CRC_RG contains
the CRC sequence.

Я с трудом могу переложить это на Си.
Помогите допилить этот вариант, пожалуйста :)


unsigned int CRC_RG = 0; // initialize shift register
while (CRC SEQUENCE starts or there is an ERROR condition) {
CRCNXT = NXTBIT ^ CRC_RG(14);
CRC_RG(14:1) = CRC_RG(13:0); // shift left by
CRC_RG(0) = 0; // 1 position
if (CRCNXT)
CRC_RG(14:0) = CRC_RG(14:0) ^ 0x4599);
}

 

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...