Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2018, 06:34

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Как считать CRC в CAN Шине
СообщениеДобавлено: 29 янв 2018, 20:03 
Только пришел
Аватара пользователя

Зарегистрирован: 10 дек 2012, 19:06
Сообщения: 13
Откуда: Гомель
Здравствуйте. Есть конкретный пакет с уже рассчитанной CRC: DATA, 0x0CF00400, 0x8, 0xF0 0x7D 0x7D 0x00 0x00 0x00 0xF0 0xFF, 0x72FC, ACK

Эта посылка была отловлена на CAN шине из грузовика на скорости 250 кбит/с. Знающие говорят, что это протокол J1939. Мне надо сделать устройство, которое будет ловить пакеты, считать CRC и если сумма верна - давать ACK. Ну и попутно кидать ещё один пакет. У меня затык на расчёте CRC. Я не знаю, как его считать, поэтому не знаю, хватит ли той же tiny13A для этих целей. Толстые контроллеры с CAN контроллером на борту рассматривать не хочется.

Здесь - http://blog.qartis.com/can-bus/ есть пример, но я в него вставлял свои данные из примера выше и никак не смог получить эту чексумму.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 29 янв 2018, 20:20 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3691
Откуда: Кемеровская область, Киселевск
The polynomial that CAN bus uses for the CRC calculation is x15+ x14+ x10+ x8+ x7+ x4+ x3+ x0 (according to the official documentation).

CRC-15-CAN используется.

_________________
RADIOWOLF.RU


Последний раз редактировалось Oxford 29 янв 2018, 20:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 29 янв 2018, 20:25 
Только пришел
Аватара пользователя

Зарегистрирован: 10 дек 2012, 19:06
Сообщения: 13
Откуда: Гомель
...пожалуйста, как конкретно эта CRC получилась.
Общие фразы мне не нужны, я сам таких понаходил с пару сотен.

Попробую уточнить, что я хочу :)
Если есть готовый алгоритм - это будет просто супер. Если есть псевдокод - тоже супер. Если есть пошаговая инструкция типо "взять такие-то биты и с ними сделать такие-то действия" тоже супер. А общие фразы вроде "на википедии написано" я уже проработал - ничего не написано конкретного там по моему мнению. Если кто-то уверен в обратном - с пруфами, пожалуйста :)

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

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

И полная ли это картина получится?
Прошу прощения за сумбурное изложение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 29 янв 2018, 21:31 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 576
Откуда: Германия
Ха-ха. И не таких раскалывали.
0x0CF00400 - это ID. Добавляем промежуточные 5 бит и длину:

0x0CF00400 => 0b1100111100000000010000000000 => 0b 1100111100 11 000000010000000000 0 00 1000 => 0x19E6020008

Итого, полное сообщение: 0x19, 0xE6, 0x02, 0x00, 0x08, 0xF0, 0x7D, 0x7D, 0x00, 0x00, 0x00, 0xF0, 0xFF
CRC от него: 0x72FC


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 29 янв 2018, 21:46 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3691
Откуда: Кемеровская область, Киселевск
Согласно 72FC это P(x) = x14+ x13+ x12+ x9+ x7+ x6+ x5+ x4+ x3+ x2
А где у вас длина данных указана в сообщении?

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 29 янв 2018, 22:06 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3761
Откуда: Звенигород
В кан шине после идентификатора как раз и идет количество данных, по умолчанию 8.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 30 янв 2018, 02:34 
Только пришел
Аватара пользователя

Зарегистрирован: 10 дек 2012, 19:06
Сообщения: 13
Откуда: Гомель
dev, всё верно, всё сошлось, огромнейшее спасибо! На схем.нет не вы мне скидывали пример с кодом? :)
В любом случае листинг оттуда вполне корректно посчитал эту контрольную сумму, теперь попробую впихнуть это в attiny13, надеюсь, её хватит.

Оставлю код здесь, для поисковиков, на русском информации такой чрезвычайно мало :(
Его бы прокомментировать хорошенько, конечно, я постараюсь дописать.

Спасибо за помощь, добрые люди!

Show код подсчёта CRC-15, CRC CAN calculate, подсчёт контрольной суммы CAN


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 30 янв 2018, 05:42 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1301
Откуда: Китай, Пекин
надо бы ветку в алгоритмы перенести


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 30 янв 2018, 11:03 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 576
Откуда: Германия
Tokes писал(а):
dev, всё верно, всё сошлось, огромнейшее спасибо! На схем.нет не вы мне скидывали пример с кодом? :)


;)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB