Значение конфигурации шины CANBUS - PullRequest
0 голосов
/ 05 июля 2019

Какова логика конфигурации скорости передачи данных шины CAN следующим образом, где определяются числа?

  CAN_InitStructure.CAN_BS1 = CAN_BS1_2tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;
    CAN_InitStructure.CAN_Prescaler = 16;
    CAN_Init(CAN1, &CAN_InitStructure);

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Конфигурировать скорость передачи данных для CAN довольно сложно, но все контроллеры CAN работают примерно одинаково.

Вы хотите, чтобы точка выборки на бит была близка к идеальному положению 87,5% (согласно CANв рекомендации по автоматизации / CANopen).Чтобы получить его, вам нужно указать количество TQ (квантов времени) до точки выборки и после нее.

Длина каждого TQ определяется тактовыми импульсами CAN-контроллера, полученными и отделенными от системных тактовых импульсов, причем длина каждого TQ составляет 1 тактовый такт.16 TQ, как правило, идеально, так что вы захотите выбрать делитель после этого.Если вы используете системные тактовые частоты на 16 МГц, вы можете выбрать делитель на 16, чтобы получить тактовую частоту 1 МГц для CAN.Имейте в виду, что встроенный RC генератор не нужен для CAN!Для достаточной точности необходимо использовать внешний кристалл или генератор.

Сегменты перед точкой выборки обычно называют сегментом синхронизации (фиксированный 1 TQ), сегментом распространения и фазовым сегментом 1 - терминология немного отличается от контроллера к контроллеру,Эти сегменты вместе должны составлять 87,5% желаемой скорости передачи данных, а сегмент после точки выборки, обычно называемый фазовым сегментом 2, должен составлять остальное.

Ширина скачка синхронизации (SJW) не имеет ничего общего ссам расчет скорости передачи, но это связано.SJW определяет, сколько TQ разрешено отклонять тактовой частоте для данной скорости передачи данных - для 800 кбит / с или 1000 кбит / с вы должны установить его на 3, в противном случае 1 должно работать.

2 голосов
/ 05 июля 2019

Вы забыли о

CAN_InitStructure.SyncJumpWidth = CAN_SJW_1TQ;

Битрейт будет:

 BITRATE = (CANCLOCK / CAN_InitStructure.CAN_Prescaler) / (1 + CAN_InitStructure.CAN_BS1 + CAN_InitStructure.CAN_BS2)

Где CANCLOCK - периферийные часы CAN в Гц. Это зависит от конфигурации вашего дерева часов.

Ваша частота квантов времени TQF = CANCLOCK / CAN_InitStructure.CAN_Prescaler

Кванты времени TQ = 1/TQF (в секундах)

Время бита BITTIME = TQ * (CAN_InitStructure.SyncJumpWidth + CAN_InitStructure.CAN_BS1 + CAN_InitStructure.CAN_BS2)

Помните, что xxxx_3tq означает 3 TQs

...