клас CAN – шина зв’язку controller area network¶
CAN реалізує підтримку як класичного CAN (bxCAN, використовується на OpenMV Cam M4 та M7), так і CAN FD (FDCAN, використовується на OpenMV Cam H7, H7 Plus та Pure Thermal). На фізичному рівні шина CAN складається з двох ліній: RX та TX. Щоб підключити OpenMV Cam до шини CAN, необхідно використовувати CAN-трансивер для перетворення логічних сигналів CAN від МК до правильних рівнів напруги на шині.
Класичний CAN у режимі зворотного зв’язку (без трансивера):
from pyb import CAN
can = CAN(1, CAN.LOOPBACK)
# Accept messages with id 123, 124, 125 or 126.
can.setfilter(0, CAN.LIST16, 0, (123, 124, 125, 126))
can.send("message!", 123) # send a message with id 123
can.recv(0) # receive a message on FIFO 0
CAN FD з усіма увімкненими додатковими функціями (FD-кадр, перемикання швидкості передачі, розширені ідентифікатори кадрів; фаза арбітражу 500 кбіт/с, фаза даних 1 Мбіт/с):
from pyb import CAN
can = CAN(
1,
CAN.NORMAL,
baudrate=500_000,
brs_baudrate=1_000_000,
sample_point=80,
)
# Accept any id in the range 0xFFF0 .. 0xFFFF.
can.setfilter(0, CAN.RANGE, 0, (0xFFF0, 0xFFFF))
can.send(b"a" * 64, 0xFFFF, fdf=True, brs=True, extframe=True)
can.recv(0)
Наступні функції модуля CAN та їх аргументи доступні як для класичних, так і для FD-контролерів CAN, якщо не зазначено інше.
Конструктори¶
- class pyb.CAN(bus: int | str, *args, **kwargs)¶
Створює об’єкт CAN на вказаній
bus(цілочисельний індекс периферійного пристрою, наприклад1дляCAN1,2дляCAN2). Без додаткових параметрів об’єкт створюється, але не ініціалізується (зберігаються попередні налаштування шини, якщо вони є); якщо передані додаткові аргументи, шина ініціалізується. ДивітьсяCAN.init()для доступних параметрів.CAN(2)підключений до однакових виводів заголовка на кожному OpenMV Cam, що підтримуєpyb.CAN(M4 / M7 / H7 / H7 Plus / Pure Thermal):Сигнал
Вивід заголовка
Примітки
RXP3TXP2Периферійний пристрій CAN забезпечує лише логічні сигнали; для підключення до реальної шини CAN необхідний зовнішній CAN-трансивер.
pyb.CANнедоступний на OpenMV Cam N6.Методи¶
- init(mode: int, prescaler: int = 100, *, sjw: int = 1, bs1: int = 6, bs2: int = 8, auto_restart: bool = False, baudrate: int = 0, sample_point: int = 75, num_filter_banks: int = 14, brs_sjw: int = 1, brs_bs1: int = 8, brs_bs2: int = 3, brs_baudrate: int = 0, brs_sample_point: int = 75) None¶
Ініціалізує шину CAN із заданими параметрами:
mode – одне з: NORMAL, LOOPBACK, SILENT, SILENT_LOOPBACK
prescaler – значення, на яке ділиться вхідна тактова частота CAN для формування номінального кванта часу біта. Значення дільника може бути від 1 до 1024 включно для класичного CAN, і від 1 до 512 включно для CAN FD.
sjw – ширина стрибка ресинхронізації в одиницях кванта часу для номінальних бітів; може мати значення від 1 до 4 включно для класичного CAN, і від 1 до 128 включно для CAN FD.
bs1 – визначає положення точки вибірки в одиницях кванта часу для номінальних бітів; може мати значення від 1 до 16 включно для класичного CAN, і від 2 до 256 включно для CAN FD.
bs2 – визначає положення точки передачі в одиницях кванта часу для номінальних бітів; може мати значення від 1 до 8 включно для класичного CAN, і від 2 до 128 включно для CAN FD.
auto_restart – встановлює, чи буде контролер автоматично намагатися відновити зв’язок після переходу в стан «шина вимкнена»; якщо це вимкнено, для виходу з цього стану можна використати
restart()baudrate – якщо задана швидкість передачі, відмінна від 0, ця функція спробує автоматично обчислити номінальний час біта CAN (замінюючи prescaler, bs1 та bs2), що задовольняє і baudrate (з точністю до 0,1%), і бажану sample_point (з точністю до 1%). Для більш точного контролю над тимінгом CAN встановіть параметри prescaler, bs1 та bs2 безпосередньо.
sample_point – визначає положення точки вибірки відносно всього номінального часу біта, виражене як ціле процентне значення. Стандартне значення sample_point – 75%. Цей параметр ігнорується, якщо baudrate не задано.
num_filter_banks – для класичного CAN це кількість банків, які будуть призначені CAN(1); решта з 28 призначаються CAN(2).
Решта параметрів присутні лише на платах із підтримкою CAN FD і налаштовують необов’язкову функцію перемикання швидкості передачі (BRS) CAN FD:
brs_prescaler – значення, на яке ділиться вхідна тактова частота CAN FD для формування кванта часу біта даних. Значення дільника може бути від 1 до 32 включно.
brs_sjw – ширина стрибка ресинхронізації в одиницях кванта часу для бітів даних; може мати значення від 1 до 16 включно
brs_bs1 – визначає положення точки вибірки в одиницях кванта часу для бітів даних; може мати значення від 1 до 32 включно
brs_bs2 – визначає положення точки передачі в одиницях кванта часу для бітів даних; може мати значення від 1 до 16 включно
brs_baudrate – якщо задана швидкість передачі, відмінна від 0, ця функція спробує автоматично обчислити час біта даних CAN (замінюючи brs_prescaler, brs_bs1 та brs_bs2), що задовольняє і brs_baudrate (з точністю до 0,1%), і бажану brs_sample_point (з точністю до 1%). Для більш точного контролю над тимінгом BRS встановіть параметри brs_prescaler, brs_bs1 та brs_bs2 безпосередньо.
brs_sample_point – визначає положення точки вибірки відносно всього номінального часу біта, виражене як ціле процентне значення. Стандартне значення brs_sample_point – 75%. Цей параметр ігнорується, якщо brs_baudrate не задано.
Квант часу tq – це базова одиниця часу для шини CAN. tq дорівнює значенню дільника CAN, поділеному на PCLK1 (частота внутрішньої периферійної шини 1); дивіться
pyb.freq()для визначення PCLK1.Один біт складається із сегмента синхронізації, який завжди дорівнює 1 tq. Далі йде бітовий сегмент 1, потім бітовий сегмент 2. Точка вибірки знаходиться після завершення бітового сегмента 1. Точка передачі знаходиться після завершення бітового сегмента 2. Швидкість передачі дорівнює 1/bittime, де bittime = (1 + BS1 + BS2) × tq.
Наприклад, на OpenMV Cam H7 (PCLK1 = 100 МГц), CAN зі швидкістю 250 кбіт/с і точкою вибірки 75% можна налаштувати як
prescaler=25, sjw=1, bs1=11, bs2=4:tq = 25 / 100 MHz = 250 ns,bittime = (1 + 11 + 4) × 250 ns = 4 µs, точка вибірки =(1 + 11) / 16 = 75%, і швидкість передачі1 / 4 µs = 250 kHz.Дивіться розділ bxCAN / FDCAN довідкового посібника STM32 для МК OpenMV Cam для отримання додаткової інформації.
- restart() None¶
Виконує програмний перезапуск контролера CAN без скидання його конфігурації.
Якщо контролер переходить у стан «шина вимкнена», він більше не братиме участі в активності на шині. Якщо контролер не налаштований на автоматичний перезапуск (дивіться
init()), цей метод можна використати для ініціювання перезапуску; контролер дотримуватиметься протоколу CAN для виходу зі стану «шина вимкнена» та переходу в стан активної помилки.
- state() int¶
Повертає стан контролера. Значення, що повертається, може бути одним із:
CAN.STOPPED– контролер повністю вимкнений та скинутий;CAN.ERROR_ACTIVE– контролер увімкнений та перебуває у стані активної помилки (обидва TEC і REC менше 96);CAN.ERROR_WARNING– контролер увімкнений та перебуває у стані попередження про помилку (принаймні один з TEC або REC дорівнює 96 або більше);CAN.ERROR_PASSIVE– контролер увімкнений та перебуває у стані пасивної помилки (принаймні один з TEC або REC дорівнює 128 або більше);CAN.BUS_OFF– контролер увімкнений, але не бере участі в активності шини (TEC перевищив 255).
- info(list: list | None = None) list¶
Отримує інформацію про стани помилок контролера та буфери TX і RX. Якщо надано list, це має бути об’єкт-список із щонайменше 8 елементами, які будуть заповнені інформацією. В іншому випадку буде створений та заповнений новий список. В обох випадках значенням, що повертається методом, є заповнений список.
Значення у списку:
Значення TEC
Значення REC
кількість разів, коли контролер переходив у стан попередження про помилку (обнуляється після 65535)
кількість разів, коли контролер переходив у стан пасивної помилки (обнуляється після 65535)
кількість разів, коли контролер переходив у стан «шина вимкнена» (обнуляється після 65535)
кількість очікуючих повідомлень TX
кількість очікуючих повідомлень RX у fifo 0
кількість очікуючих повідомлень RX у fifo 1
- setfilter(bank: int, mode: int, fifo: int, params: Tuple[int, ...], *, rtr: Tuple[bool, ...] | None = None, extframe: bool = False) None¶
Налаштовує банк фільтрів:
bank – банк фільтрів класичного контролера CAN або індекс фільтра CAN FD для налаштування.
mode – режим роботи фільтра, дивіться таблиці нижче.
fifo – вказує, у якому fifo (0 або 1) зберігати повідомлення, якщо воно приймається цим фільтром.
params – масив значень, що визначає фільтр. Вміст масиву залежить від аргументу mode.
Вміст масиву params для класичних CAN-контролерів (OpenMV Cam M4 / M7):
mode
Вміст params
CAN.LIST16Чотири 16-бітні ідентифікатори, які будуть прийняті.
CAN.LIST32Два 32-бітні ідентифікатори, які будуть прийняті.
CAN.MASK16Дві пари 16-бітних id/mask, наприклад
(1, 3, 4, 4). Перша пара (1, 3) приймає всі ідентифікатори з бітом 0 = 1 та бітом 1 = 0; друга пара (4, 4) приймає всі ідентифікатори з бітом 2 = 1.CAN.MASK32Одна пара 32-бітних id/mask (в іншому аналогічна
CAN.MASK16).Вміст масиву params для CAN FD-контролерів (OpenMV Cam H7 / H7 Plus / Pure Thermal):
mode
Вміст params
CAN.RANGEДва ідентифікатори, що утворюють діапазон прийнятих ідентифікаторів.
CAN.DUALДва ідентифікатори, які будуть прийняті (наприклад
(1, 2)).CAN.MASKОдна пара
(id, mask)(наприклад(0x111, 0x7FF)).rtr – для класичних контролерів CAN це масив булевих значень, що вказує, чи повинен фільтр приймати повідомлення із запитом на віддалену передачу. Якщо цей аргумент не вказано, за замовчуванням встановлюється
Falseдля всіх записів. Довжина залежить від mode:mode
len(rtr)Примітки
CAN.LIST164
CAN.LIST322
CAN.MASK162
CAN.MASK321
Для CAN FD цей аргумент ігнорується.
extframe – якщо True, кадр матиме розширений ідентифікатор (29 біт), інакше використовується стандартний ідентифікатор (11 біт).
- clearfilter(bank: int, extframe: bool = False) None¶
Очищає та вимикає банк фільтрів:
bank – банк фільтрів класичного контролера CAN або індекс фільтра CAN FD для очищення.
extframe – для контролерів CAN FD, якщо True, очищає розширений фільтр (налаштований з extframe=True), інакше очищає стандартний ідентифікатор (налаштований з extframe=False).
- recv(fifo: int, list: list | None = None, *, timeout: int = 5000) list¶
Приймає дані на шині:
fifo – ціле число, що вказує FIFO для прийому
list – необов’язковий об’єкт-список, що використовується як значення, що повертається
timeout – час очікування в мілісекундах для прийому.
Значення, що повертається: список із п’ятьох значень.
Ідентифікатор повідомлення.
Булеве значення, що вказує, чи є ідентифікатор повідомлення стандартним або розширеним.
Булеве значення, що вказує, чи є повідомлення RTR-повідомленням.
Значення FMI (індекс збігу фільтра).
Масив, що містить дані.
Якщо list має значення
None, буде виділено новий список, а також новий об’єкт bytes для зберігання даних (як п’ятий елемент списку).Якщо list не має значення
None, це має бути об’єкт-список з принаймні п’ятьма елементами. П’ятий елемент має бути об’єктом memoryview, створеним із bytearray або масиву типу „B“ або „b“, і цей масив повинен мати достатньо місця для щонайменше 8 байт. Об’єкт-список буде заповнений першими чотирма значеннями вище, а об’єкт memoryview буде змінений розмір відповідно до розміру даних та заповнений цими даними. Одні й ті ж об’єкти списку та memoryview можна повторно використовувати в подальших викликах цього методу, забезпечуючи можливість прийому даних без використання купи. Наприклад:buf = bytearray(8) lst = [0, 0, 0, 0, memoryview(buf)] # No heap memory is allocated in the following call can.recv(0, lst)
- send(data: int | bytes | bytearray, id: int, *, timeout: int = 0, rtr: bool = False, extframe: bool = False, fdf: bool = False, brs: bool = False) None¶
Надсилає повідомлення на шину:
data – дані для надсилання (ціле число або буферний об’єкт).
id – ідентифікатор повідомлення для надсилання.
timeout – час очікування в мілісекундах для надсилання.
rtr – булеве значення, що вказує, чи повинно повідомлення бути надіслане як запит на віддалену передачу. Якщо rtr має значення True, то для заповнення слоту DLC кадру використовується лише довжина data; фактичні байти в data не використовуються.
extframe – якщо True, кадр матиме розширений ідентифікатор (29 біт), інакше використовується стандартний ідентифікатор (11 біт).
fdf – для контролерів CAN FD, якщо встановлено True, кадр матиме формат FD-кадру, що підтримує корисне навантаження даних до 64 байт.
brs – для контролерів CAN FD, якщо встановлено True, увімкнено режим перемикання швидкості передачі, при якому фаза даних передається з іншою швидкістю. Дивіться
CAN.init()для параметрів налаштування тимінгу бітів даних.
Якщо timeout дорівнює 0, повідомлення розміщується в буфері одного з трьох апаратних буферів, і метод повертається негайно. Якщо всі три буфери зайняті, генерується виняток. Якщо timeout не дорівнює 0, метод чекає, поки повідомлення не буде передано. Якщо повідомлення не вдається передати протягом зазначеного часу, генерується виняток.
Значення, що повертається:
None.
- rxcallback(fifo: int, fun: Callable[[CAN, int], None] | None) None¶
Реєструє функцію для виклику, коли повідомлення потрапляє до порожнього FIFO:
fifo – приймаючий FIFO.
fun – функція, що викликається, коли FIFO стає непорожнім.
Функція зворотного виклику приймає два аргументи: перший – сам об’єкт CAN; другий – ціле число, що вказує причину зворотного виклику:
Причина
Значення
0Повідомлення прийнято до порожнього FIFO.
1FIFO заповнений.
2Повідомлення втрачено через заповнений FIFO.
Приклад використання rxcallback:
def cb0(bus, reason): print('cb0') if reason == 0: print('pending') if reason == 1: print('full') if reason == 2: print('overflow') can = CAN(1, CAN.LOOPBACK) can.rxcallback(0, cb0)
Константи¶
Константи режиму шини (аргумент
modeдляinit()):- NORMAL: int¶
Контролер бере нормальну участь на шині – передає власні кадри та підтверджує дійсні отримані кадри.
- LOOPBACK: int¶
Режим внутрішнього зворотного зв’язку: контролер відключається від виводів і маршрутизує передані кадри безпосередньо назад до шляху прийому. Корисний для самотестування без трансивера.
- SILENT: int¶
Режим лише прослуховування: контролер приймає кадри, але ніколи не керує шиною (без ACK, без передач). Корисний для моніторингу шини.
- SILENT_LOOPBACK: int¶
Поєднує
SILENTтаLOOPBACK: без активності на виводах і без підтверджень, з внутрішнім зворотним зв’язком TX у RX.
Константи стану контролера (повертаються
state()):- ERROR_ACTIVE: int¶
Контролер увімкнений та перебуває у стані активної помилки (обидва TEC і REC менше 96).
- ERROR_WARNING: int¶
Контролер увімкнений та перебуває у стані попередження про помилку (принаймні один з TEC або REC дорівнює 96 або більше).
- ERROR_PASSIVE: int¶
Контролер увімкнений та перебуває у стані пасивної помилки (принаймні один з TEC або REC дорівнює 128 або більше).
Режими фільтрів класичного CAN (аргумент
modeдляsetfilter()на OpenMV Cam M4 / M7):Режими фільтрів CAN FD (аргумент
modeдляsetfilter()на OpenMV Cam H7 / H7 Plus / Pure Thermal):