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...

  • Сообщения

    • Посмотрел видео и понял, что это далеко не все, что необходимо для дачи... Главное - нет никакой системы автозапуска генератора. Это устройство (что на видео), как я понял, не переведется на резерв, если резерв в момент пропадания основного питания будет обесточен. Т.е. основное питание пропало, генератор не запущен, значит, нет и резервного, и это устройство останется в положении "основного питания". После запуска генератора оно должно перейти на резерв - это, я думаю, будет обеспечено. Но вот как будет организован запуск генератора - остается за кадром. А это главное в "беспереббойном" питании дачи.  Можно все сделать на основе "настоящего" ПЛК, а можно что-то придумать самому... Чем я и планирую заняться со временем. 
    • Вопрос на сколько он тихий?  Для меня это важно. 
    • В общем-то все просто  - у ИИП с обычным выпрямителем и конденсаторным сглаживанием, коэффициент мощности - 0,5-0,65. Как это влияет на потребление тока ? Действующее среднеквадратичное значение тока (что тут сделаешь, математика) становится значительно выше, чем при Км=1. Действующее значение греет кабель. В этом плане, @BAFI прав. Но активные мощности при этом, вполне могут быть одинаковыми. Измерял прибором сетевые параметры ЗУ, вот такая картина, полностью подтверждающая вышесказанное. Действующий (греющий кабель) несинусоидальный ток - 2,58А, Действующее, с кривыми верхушками, несинусоидальное напряжение - 241,2В. Кажущаяся мощность - 2,58*241,2=622 Вольт*Ампера, а активная, с учетом наложения тока и напряжения - только 359 Ватт, за нее и плачУ. Коэфф. мощности 359/622=0,57, что и пишет прибор. Если Км был бы 1, то потребляемый RMS ток составил бы не 2,58 А, а только 1,49 Ампера, что, согласитесь, гораздо меньше. Для симисторных регуляторов пылесосов все еще намного хуже с Км. Активку экономим, а действующий ток по-прежнему велик и безобразен (искажение формы).
    • На mouser.com 27952 стоит 2 евро, а 2156 - 1,90. Разница 10 центов. У китайцев не знаю, какая разница. Я у них только резисторы покупаю и иногда конденсаторы Имхо, с обвязкой у 27952 попроще будет, чем у последней. Но с ней поиграться ещё предстоит
    • Без заморочек и за дёшево оно плохо получается. Кмк на Али лезут за подешевле, как в том Анектоте:собрал Грюндик из деталей от Супры. Но и в РФ, практикуется перерепродажа алишечных товаров в 3дорога. По поводу "непризнанной республики" не знаю, у меня в городе иногда даже ип самому открыть не сильно дороже чем с местными спикулянтами связываться, тоже и с работой, иногда выгодней самому купить оборудование, арендовать помещение и сделать как положено, а не побыстрее-подешевле - ради зароботка. 
    • Пайку и выводы транзистора можно покрыть лаком. В три слоя. От воды вполне защитит.

  • Bluetooth стерео аудио модуль на основе чипа BK8000L

  • 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...