Инструменты пользователя

Инструменты сайта


chibios:hal:can

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
chibios:hal:can [2014/12/10 02:35]
Ruslan Popov
chibios:hal:can [2014/12/12 03:23] (текущий)
Ruslan Popov [Расчёт параметров]
Строка 1: Строка 1:
 +====== CAN ======
  
 +[[http://​chibios.sourceforge.net/​html/​group___c_a_n.html|Документация на модуль]]
 +
 +===== Общая информация =====
 +
 +CANTX на ноге микроконтроллёра всегда держит 3.3В и только в момент передачи прижимает её к земле. Нога ISO1050, подключенная к ноге CANRX микроконтроллёра,​ всегда держит 4.5В и в момент приёма данных,​ прижимает её к земле.
 +
 +{{:​chibios:​hal:​iso1050.png|Изолированный вариант драйвера}}{{:​chibios:​hal:​tja1050.png|Обычный вариант драйвера}}
 +
 +На CAN шине, т.е. после интерфейса ISO1050, всё немного меняется. Сигнал передаётся в виде двух компонентов,​ H и L. При отсутствии пакетов на шине, оба компонента держатся на уровне 2.5В, формируя "​нуль"​. При сигнале,​ H компонент возрастает относительно "​нуля",​ а L компонент падает,​ позволяя нам увидеть вот такую картинку.
 +
 +{{ :​chibios:​hal:​can-signal-oscilloscope.jpg |}}
 +
 +===== Настройки RTOS =====
 +
 +Разрешаем использование CAN в ''​mcuconf.h'':​
 +
 +<​file>#​define STM32_CAN_USE_CAN1 ​                 TRUE
 +#define STM32_CAN_CAN1_IRQ_PRIORITY ​        ​11</​file>​
 +
 +Разрешаем использование CAN в ''​halconf.h'':​
 +
 +<​file>#​define HAL_USE_CAN ​                TRUE
 +#define CAN_USE_SLEEP_MODE ​         TRUE</​file>​
 +
 +===== Конфигурация платы =====
 +
 +Рассмотрим случай,​ когда используется CAN на альтернативных выводах,​ т.е. на PB8 и PB9. Настраиваю его так:
 +
 +<​file>#​define VAL_GPIOBCRH ​           0x......B8</​file>​
 +
 +Кроме этого, надо указать,​ что CAN переопределён на альтернативные выводы:​
 +
 +<​file>​void boardInit(void) {
 +    AFIO->​MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE | AFIO_MAPR_CAN_REMAP_REMAP2;​
 +}</​file>​
 +
 +А JTAG я всегда выключаю :)
 +
 +===== Расчёт параметров =====
 +
 +Из документации (страница 645 RM0008) известно следующее:​
 +
 +<​file>​
 +BaudRate = 1 / NominalBitTime
 +NominalBitTime = 1 * (tq + tBS1 + tBS2)
 +где:
 +  tBS1 = tq * (TS1[3:0] + 1),
 +  tBS2 = tq * (TS2[2:0] + 1),
 +  tq = (BRP[9:0] + 1) x tPCLK,
 +  tPCLK = длительность одного цикла шины APB,
 +  BRP[9:0], TS1[3:0] и TS2[2:0] определены в регистре CAN_BTR.
 +</​file>​
 +
 +В лоб делаем функцию вычисления скорости передачи по имеющимся параметрам:​
 +
 +<​file>​def can_baud_rate(apb1,​ brp, ts1, ts2):
 +    Tpclk = 1 / apb1
 +    Tq = (brp + 1) * Tpclk
 +    Tbs1 = (ts1 + 1) * Tq
 +    Tbs2 = (ts2 + 1) * Tq
 +    Tbit = 1 * Tq + Tbs1 + Tbs2
 +    rate = 1 / Tbit
 +    return rate</​file>​
 +
 +Немного оптимизировав,​ получаем:​
 +
 +<​file>​def optimized_can_baud_rate(apb1,​ brp, ts1, ts2):
 +    return apb1 / ((1 + brp) * (3 + ts1 + ts2))</​file>​
 +
 +Ещё есть [[http://​www.kvaser.com/​support/​calculators/​bit-timing-calculator/​|онлайн калькулятор]] для параметров CAN пакета.
 +===== Использование =====
 +
 +Конфигурационные параметры:​
 +
 +  * ''​CAN_BTR_BRP(n)''​ - длительность кванта,​ n = [0..511];
 +  * ''​CAN_BTR_TS1(n)''​ - длительность до sample point, n = [1..16];
 +  * ''​CAN_BTR_TS2(n)''​ - длительность до transmit point, n = [1..8];
 +  * ''​CAN_BTR_SJW(n)''​ - длительность ресинхронизации,​ n = [1..4].
 +
 +~~DISQUS~~
chibios/hal/can.txt · Последние изменения: 2014/12/12 03:23 — Ruslan Popov