Jump to content
Tokes

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

Recommended Posts

Здравствуйте. Отчаялся найти хорошее пояснение с примерами как считать 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 получилась.

 

Share this post


Link to post
Share on other sites

В HEX-представлении опущен старший бит.

Как считать CRC даже в википедии не сложно написано.

Share this post


Link to post
Share on other sites

Драйверы MOSFET/IGBT Infineon – силой нужно управлять!

Специалисты Infineon усовершенствовали традиционные кремниевые MOSFET и IGBT и выпустили компоненты на базе принципиально иных материалов – нитрида галлия и карбида кремния. Мы создали подборку полезных материалов, чтобы вы разобрались во всех тонкостях и стали экспертом по управлению силовыми приборами нового поколения CoolMOS, CoolGaN, CoolSiC!

Подробнее

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

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

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

Edited by Tokes

Share this post


Link to post
Share on other sites

Снижена цена на DC/DC и AC/DC преобразователи Mornsun в Компэл!

Компэл снизил цены на всю продукцию Mornsun. В ассортименте – как широко известные и популярные позиции, так и новинки. Доступны AC/DC, неизолированные DC/DC-преобразователи или импульсные стабилизаторы (семейство K78/R3), изолированные DC/DC, и новейшее поколение R4.

Подробнее

Новинки гибридных конденсаторов: преимущества технологии

Гибридные конденсаторы унаследовали от полимерных конденсаторов такие достоинства как устойчивость к импульсам тока, повышенную надежность и низкое собственное сопротивление, а также высокую емкость и низкий ток утечки, как у алюминиевых электролитов. Благодаря этому гибридные конденсаторы могут с успехом заменить традиционные алюминиевые конденсаторы.

Подробнее

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

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);
}

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения


  • Программатор ST-Link V2 для STM32

  • Similar Content

    • By Corename
      Доброго времени суток.
      Передо мной стоит задача - нужно подключить к AVR датчик уровня топлива, который работает по Omnicomm-совместимому протоколу. Описание протокола есть: http://www.fuelmetrix.ru/files/LLS_public/%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20v5.pdf
      Я - новичек в этом деле. Пишу в CVAVR. Освоил АЦП, LCD, 1-Wire. По USART данные не передавал.
      Сижу, читаю протокол - даже не знаю, с какой стороны подойти к написанию кода. Обычно во всем разбирался сам, а тут - тупик. Опыта нет. Кроме всего прочего еще и сбил напрочь с толку CRC.
      Пожалуйста, помогите разобраться, как правильно писать, с чего начать и т.д.
      Если не в том разделе тему создал - приношу свои извинения заранее...
    • Guest
      By Guest
      приветствую всех
      подскажите, кто и как защищает свои прошивки?
      не МК, залочивая его, а именно прошивку
      что понимается под этим:
      - чтобы не поменяли в ней копирайты,
      - не изменили что-либо в программе.
      ничего лучше, чем время от времени вычитывать или всю память, или куски, и считать CRC этой части я не придумал
      я понимаю, что спец расковыряет прошивку на "раз-два", но его работа и стоить будет наверняка подороже моих поделок
      и второй, так сказать, подвопрос:
      как привязать программу к МК?
      не все имеют индивидуальный номер
×
×
  • Create New...