Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2020, 09:10

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Как считать 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
Сообщения: 4902
Откуда: Кемеровская область, Киселевск
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
Сообщения: 710
Откуда: Германия
Ха-ха. И не таких раскалывали.
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
Сообщения: 4902
Откуда: Кемеровская область, Киселевск
Согласно 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
Сообщения: 3965
Откуда: Звенигород
В кан шине после идентификатора как раз и идет количество данных, по умолчанию 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
Сообщения: 3558
Откуда: Китай, Пекин
надо бы ветку в алгоритмы перенести

_________________
unirail.org


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

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


;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 26 май 2020, 08:20 
Только пришел

Зарегистрирован: 26 май 2020, 07:48
Сообщения: 17
Добрый день. Есть несколько пакетов с расчитанной CRC. Сам посчитать и выйти на рассчитанную не могу.
0x197, 0x4, 0xaf 0x4c 0x0f 0xc0
0x197, 0x4, 0x20 0x4d 0x0f 0xc0
0x197, 0x4, 0xac 0x4e 0x0f 0xc0
0x197, 0x4, 0xa5 0x40 0x0f 0xc0
197-id пакета, 0х4 длина, далее данные где байт 0 CRC. Есть кусок описания:
Signaltyp: 8 Bit, Unsigned Integer (Byte 0, Bit 0...Byte 0, Bit 7)
Standard protection application CRC
This signal uses the application CRC-ID = 63 (Dec)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 26 май 2020, 08:39 
Только пришел

Зарегистрирован: 26 май 2020, 07:48
Сообщения: 17
И второй
0x3FD, 0x5, 0x03 0x00 0x80 0x0C 0xFF
0x3FD, 0x5, 0x9E 0x01 0x80 0x0C 0xFF
0x3FD, 0x5, 0x24 0x02 0x80 0x0C 0xFF
0x3FD, 0x5, 0xB9 0x03 0x80 0x0C 0xFF
3FD-id пакета, 0х5 длина, далее данные где байт 0 CRC. Есть кусок описания:
Signaltyp: 8 Bit, Unsigned Integer (Byte 0, Bit 0...Byte 0, Bit 7)
Standard protection application CRC
This signal uses the application CRC-ID = 57 (Dec)


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 710
Откуда: Германия
M-I-Kostin писал(а):
0x197, 0x4, 0xaf 0x4c 0x0f 0xc0
...
This signal uses the application CRC-ID = 63 (Dec)


Дописать перед данными 63, 0:
0x3F 0x00 0x4C 0x0F 0xC0

Потом считать с полиномом 0x1D, начальное значение 0, xor 0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 27 май 2020, 11:23 
Только пришел

Зарегистрирован: 26 май 2020, 07:48
Сообщения: 17
dev писал(а):
M-I-Kostin писал(а):
0x197, 0x4, 0xaf 0x4c 0x0f 0xc0
...
This signal uses the application CRC-ID = 63 (Dec)


Дописать перед данными 63, 0:
0x3F 0x00 0x4C 0x0F 0xC0

Потом считать с полиномом 0x1D, начальное значение 0, xor 0.

Мир! Дружба! Жвачка!
Спасибо Большое!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 27 май 2020, 12:07 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Вот я читаю тему, читаю... Не понимаю: для каких целей нужно софтово CAN эмулировать? Может, вы еще и его транспортный уровень будете эмулировать софтово?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 27 май 2020, 13:45 
Только пришел

Зарегистрирован: 26 май 2020, 07:48
Сообщения: 17
Eddy_Em писал(а):
Вот я читаю тему, читаю... Не понимаю: для каких целей нужно софтово CAN эмулировать? Может, вы еще и его транспортный уровень будете эмулировать софтово?

На софте идет отладка, делаю некий шлюз на стм32, для связи нескольких шин данных. Впихиваю, невпихуемоЕ)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 27 май 2020, 13:48 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Тогда зачем софтовый, когда есть аппаратный CAN?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как считать CRC в CAN Шине
СообщениеДобавлено: 27 май 2020, 13:59 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 710
Откуда: Германия
Это CRC внутри данных, а не стандартный CAN-овский.


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


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


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

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


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

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

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