Stm32f103 частота can шины

Настройка модуля CAN на микроконтроллере STM32F103. Часть 1

Заказал как-то в Китае такую вот отладочную плату. На ней имеется USB/UART конвертер на микросхеме PL2303, две кнопки для экспериментов, кнопка питания, кнопка сброса, два светодиода для экспериментов, светодиод питания, стабилизатор на 3.3В, два разъема мини-USB, разъем JTAG для подключения отладчика, например J-Link. В комплекте также шел USB-кабель, изображенный на фото. Плата питается от USB-порта компьютера.

Сегодня я попробую написать драйвер для модуля CAN и поделиться своими наработками.

Сразу скажу, что разжевывать информация что такое CAN шина не буду, но приведу пару документов, где можно почитать о CAN шине на русском языке:

Еще одно важное замечание: изначально на плате нет драйвера CAN-шины (микросхемы, согласующей уровни сигналов шины и цифровые уровни микроконтроллера). Я запаял микросхему MCP2551, но есть и другие аналоги, подходящие по ногам.

Итак начнем. Проект я буду создавать в среде CooCox IDE версии 1.7.8. Здесь сразу можно выбрать нужные библиотеки и они автоматически добавятся в проект. Из всего изобилия я выбираю только CMSIS core и CMSIS_boot. Признаться четсно, библиотека от STM32 stm32f10x_stdperiph_lib мне не нравится из-за своей избыточности, хотя я частенько подсматриваю код ее исходников, когда разбираюсь с каким-либо новым модулем. Возможно наш драйвер не будет сильно отличаться от уже готового драйвера библиотеки StdPeriph, но я считают, что материал лучше запоминается, когда все пробуешь делать сам с нуля.

CMSIS core содержит описание всех регистров микроконтроллера, а также обработчики прерываний по умолчанию и т.д. В CMSIS_boot содержатся все необходимы функции для инициализации контроллера, те, что выполняются до запуска функции main. Здесь происходит настройка системы тактирования. Очень приятная вещь, контроллер уже сразу настраивается на тактирование от внешнего генератора 8МГц и частота шины SYSCLK выбирается максимальная 72 МГц. При желании можно покопаться в файле system_stm32f10x.c и настроить другую частоту, а также выбрать другой источник тактирования.

В нашем проекте мы не будем перенастраивать систему тактирования и остановимся на частоте SYSCLK = 72 МГц.

Инициализация

Как обычно начинаем с инициализации модуля CAN1. Здесь нужно выполнить следующие действия:

Нормальный режим подразумевает прием и передачу сообщений, режим петли позволяет отладить работу модуля, сообщения, которые он отправляет поступают в приемный буффер обратно и не выходят наружу.

Самым сложным пунктом здесь является настройка скорости передачи. Но на самом деле сложного ничего нет, нужно руководствоваться несколькими правилами. Как известно, максимальная скорость передачи CAN-шины может достигать 1 Мбит/с. Т.е. время минимального битового интервала определяется по формуле:

TBIT = 1/Скорость передачи

Выходит, что для скорость передачи данных 1 Мбит/с битовый интервал долже быть равен 1 мкс (или 1000 нс).

Битовый интервал рабивается еще на более мелкие интервалы, называемые квантами TQ (Time Quanta). Обязательным условием правильной настройки бит тайминга (скорости передачи) является равенство TBIT = 8. 25TQ. Из мануала следует, что битовый интервал состоит из трех частей:

Что это такое можете почитать подробно в мануале на контроллер. Из илюстрации видно, что SYNC_SEG всегда равен 1TQ, а сумма (BS1 + BS2) = 7. 24TQ. При этом BS1 = 1..16TQ, BS2 = 1. 8TQ.

Выбираем Pinout->Periphrerals->CAN->Mater Mode.

Переходим на вкладку Configuration и нажимам кнопку CAN.

Допустим мы хотим получить скорость передачи данных 1 Мбит/с. Тогда нужно настроить битовый интервал длительностью 1000 нс. Устанавливаем делитель шины тактирования PCLK1 = 36МГц/4, т.е. BRP = 4, тогда время одного кванта получится около 111 нс. Отсюда получаем, что битовый интервал равен 9TQ. SYNC_SEG = 1TQ. Остается (BS1+BS2) = 8TQ. Устанавливаем их значение по 4TQ. В своем проект я создал таблицу настроек для скоростей передачи 1 Мбит/с, 500 кбит/с, 250 кбит/с, 125 кбит/с и 62,5 кбит/с. Вот какие временный настройки я получил:

Структура t_can_timing не случайно имеет такой формат. Он совпадает с форматом регистра CAN_BTR за исключением полей выбора режима работы. Необходимо также заметить, что от всех коэффициентов, полученных в STM32CubeMX отнимается единица.

Источник

STM32 и протокол CAN. Настройка в STM32CubeMx.

Приветствую всех на сайте MicroTechnics! Недавно мы разбирались с теоретическими аспектами работы протокола CAN – контролем ошибок, организацией арбитража сообщений на шине и т. д. Так вот, сегодня, как и обещал, займемся практической стороной вопроса – реализуем прием и передачу данных по CAN на микроконтроллере STM32.

Для настройки периферии будем использовать STM32CubeMx, в качестве среды разработки я, как обычно, беру IAR. Осталось упомянуть про выбранный контроллер – им сегодня будет STM32F103VE. Но, как вы помните, при работе с STM32 нет никакой проблемы в том, чтобы перейти на другой микроконтроллер или другую IDE 🙂

Итак, первый шаг заключается в настройке в Cube всей имеющейся периферии. Не буду подробно останавливаться на том, что не касается непосредственно CAN, все можно найти в нашем курсе по этой вот ссылке.

В итоге у нас задействованы следующие пины контроллера:

Здесь мы уже активировали модуль CAN:

Но пока мы его только включили, необходимо еще выполнить настройку. И самым важным параметром является, конечно, скорость обмена данными. В случае с CAN ситуация не совсем такая, как с другими модулями STM32, для задания скорости мы должны настроить временные характеристики интерфейса, а не просто задать конкретное число:

Давайте разберемся, что это за значения и за что они отвечают. Время передачи одного бита в CAN складывается из:

Читайте также:  Как правильно поставить поршневые кольца 402 двигатель

Все длительности оцениваются через понятие кванта времени, для задания которого мы устанавливаем значение предделителя (в этом проекте он равен 8). Таким образом, мы получаем длительность 1 кванта:

Первый сегмент на этой схеме – SYNC_SEG – используется для синхронизации всех узлов сети CAN. Ожидается, что фронт сигнала должен находиться внутри именно этого сегмента.

Второй сегмент – BS1 (Bit segment 1). Стандарт CAN включает в себя два сегмента – PROP_SEG и PHASE_SEG1. Оба этих сегмента в STM32 относятся к сегменту BS1. PROP_SEG нужен для компенсации физических задержек в сети. А PHASE_SEG1 используется для компенсации ошибки смещения фазы сигнала.

Сегмент BS1 определяет положение sample point (точки захвата). В этой точке модуль CAN анализирует уровень сигнала на шине, то есть определяет принят рецессивный или доминантный бит.

И третий сегмент – BS2 (Bit segment 2). Он представляет из себя сегмент PHASE_SEG2 интерфейса CAN. Его назначение такое же как и у PHASE_SEG1.

Сегмент BS2 определяет положение transmit point (точки передачи), то есть того момента времени, когда модуль CAN выдает на линию определенный бит.

Длительности этих сегментов таковы:

Устанавливая длительности различных сегментов, мы получаем время передачи одного бита в квантах. Зная, длительность самого кванта, мы легко получаем время передачи бита в секундах. А уже из этого мы рассчитываем скорость передачи данных по шине. Только при настройке CAN нужно пройти в обратном направлении 🙂

Пусть мы хотим задать скорость обмена равной 500 Кбит/с. Тогда время передачи одного бита:

Длительность одного кванта мы уже задали равной 222,2 нс. Таким образом, время 1-го бита в квантах:

Эти 9 квантов нужно распределить между тремя сегментами. SYNC_SEG фиксирован (1 квант), значит остается 8 квантов на сегменты BS1 и BS2. Ставим в этом примере поровну – по 4 кванта и получаем нужную нам скорость обмена данными. И, наконец, можем двигаться дальше!

Включаем прерывания CAN и генерируем код:

В main() находим функцию инициализации CAN:

Но на самом деле, на этом настройка не заканчивается. Дело в том, что в STM32 есть очень полезная функция фильтрации сообщений по ID. Как вы помните, ID в CAN относится не к устройству в сети, а к сообщению. То есть одно и то же устройство может рассылать сообщения с разными ID. А поскольку сеть является широковещательной, то приемник будет получать кучу сообщений, среди которых ему нужны только некоторые. И вот для этого и существует фильтрация сообщений. Благодаря аппаратной поддержке не нужно программно проверять ID всех принятых сообщений, можно всего лишь изначально настроить периферию на прием только нужных сообщений!

Настраивается этот механизм следующим образом:

Собственно, за «пропускаемые» через фильтр ID отвечают эти поля структуры CAN_FilterTypeDef:

В данном случае все значения равны 0x0000, это означает, что абсолютно все сообщения будут проходить через фильтр.

Значения FilterIdHigh и FilterIdLow определяют идентификатор, с которым будет сравниваться ID принятого сообщения. А FilterMaskIdHigh и FilterMaskIdLow отвечают за битовую маску, которая, в свою очередь, определяет, какие биты идентификатора будут проверяться, а какие – нет. Единица в маске означает, что бит, который соответствует положению этой единицы, будет проверен.

Сейчас на примере все станет понятно! 🙂

Итак, пусть мы хотим принимать только сообщения с ID из диапазона – 0x200 – 0x20F. Тогда настройка будет такой:

Обратите внимание, что для стандартного идентификатора значения необходимо сместить влево на 5 бит.

Запишем в двоичном виде значения 0x200 – 0x20F, смещенные на 5 битов:

Получается, что мы должны проверять 7 старших битов ID, одинаковые во всех идентификаторах. И, в итоге, получаем значение битов маски равным 0x7F0

Источник

STM32. Настройка таймингов работы CAN

Настройка таймингов работы CAN шины является одним из наиболее важных моментов в настройке bxCan. Если ошибиться, то устройство может оказаться полностью работоспособным в режиме отладки и отказаться работать при подключении к рабочей шине CAN.

Наверное больше всего возникает вопросов в том, что же это такое и как правильно эти тайминги настроить.

Опять теория

Синхронизация и тайминги в CAN — важный и сложный вопрос, но благодаря сложности и продуманности становится не так важна возможная рассинхронизация и нестабильность тактовых частот узлов сети, а связь становится возможной даже в сложных условиях, когда на линию могут воздействовать различные помехи.

Так давайте же разберемся в этом подробнее:

Механизм синхронизации битов контролирует шину и выполняет выборку и корректировку точек захвата бита (Sample Point) путем синхронизации при начале передаче бита и ресинхронизации при прекращении передачи этого бита.

Этот процесс можно объяснить путем простого деления номинального времени передачи бита на три сегмента:

Сегмент синхронизации (SYNC_SEG): изменение бита, как ожидается, произойдет в течение этого отрезка времени. Он имеет фиксированную длину одного кванта времени (1 х tq).
Сегмент фазы 1 (BS1): определяет местоположение точки захвата (Sample Point). Он включает в себя Prop_Seg и PHASE_SEG1 стандарта CAN. Его продолжительность программируется от 1 до 16 квантов времени, но может быть автоматически увеличена для компенсации положительной фазы дрейфов из-за различий в частоте работы на различных узлах сети.
Сегмент фазы 2 (BS2): определяет местоположение точки передачи. Он представляет собой PHASE_SEG2 стандарта CAN. Его продолжительность программируется от 1 до 8 квантов времени, но также может быть автоматически изменена в сторону уменьшения для компенсации отрицательной фазы заносов.

Начало передачи определяется в момент первого перехода шины из доминантного в рецессивное состояние, при условии что сам контроллер не посылает рецессивный бит.

Читайте также:  Какие двигатели не устанавливаются на мотоцикл

Если этот переход обнаружен в сегменте BS1 вместо сегмента Sync_Seg, то сегмент BS1 продлевается таким образом, чтобы достичь точки захвата бита путем увеличения длительности сегментов на значение SJW. И наоборот, если переход обнаружен в сегменте BS2 вместо Sync_Seg, то BS2 укорачивается так, чтобы точка захвата сформировалась раньше. Таким образом происходит постоянная пересинхронизация с целью синхронизации с другими узлами шины. (Забавно звучит 🙂 )

Согласно стандарту CAN, оптимальный момент времени для Sample Point составляет 87.5% от номинальной длительности передачи бита.

Стоит заметить, что для предотвращения ошибок программирования, конфигурация регистра CAN_BTR (Bit Timing Register) возможна только тогда, когда bxCan находится в режиме ожидания.

Теперь, когда Вы это все прочитали и половину не поняли, опишу простыми словами (далее цитата с одного из форумов, очень понравилась :)) :

Бит поделен на сегменты, каждый сегмент состоит из квантов, кол-во которых вы настраиваете:

Сумма этих квантов * период кванта = периоду бита выбранной скорости.

BS1 и BS2 в разных узлах сети могут быть разные, это зависит еще от частоты микроконтроллера, аппаратными средствами может изменяться на величину SJW.

Реализация

Разобравшись с теорией, приступим к реализации.

Тактирование

Рассмотрим все на примере STM32F103C8 в CooCox CoIDE.

Разработчики уже позаботились о нас и при создании чистого проекта по умолчанию настраивает работу микроконтроллера на максимальную для него частоту. В нашем случае это STM32F103C8 с максимальной частотой работы 72MHz.

Но нам нужны не стандартные настройки, а свои, так как играясь с калькулятором (см. ниже) мы выяснили, что нам нужна частота периферии 16MHz. Для экспериментов я создал проект в STM32CubeMX и поигрался с Clock configuration. Получилась следующая картинка:

С теорией разобрались, теперь реализуем это все в коде:

Код я постарался по максимуму прокомментировать, нам осталось только вставить его в наш проект.

Небольшое замечание: если на Вашем устройстве не используется внешний кварц, то по этому коду микроконтроллер будет настроен на частоту работы в 8MHz.

Также, в строке 47 приведенного код стоит функция получения текущих настроек тактовой частоты. В рабочем проекте ее можно убрать.

Если остановится на ней отладчиком и отследить содержимое переменной RCC_Clocks, то мы увидим примерно следующее содержание:

Видно, что после инициализации у нас процессор работает на частоте 64000000 (64MHz), а частота работы периферии APB1 составляет 16000000 (16MHz). Мы добились желаемого результата.

Настройка таймингов

Настроив тактирование нашего контроллера (напомню, учимся на STM32F103Cx), перейдем к настройке таймингов.

Для этого удобнее всего пользоваться калькуляторами, я, например, пользуюсь вот этим. Достаточно выбрать семейство микроконтроллеров, указать частоту шины и нажать кнопку «Request Table». Калькулятор нам предложит различные комбинации таймингов и желтым цветом укажет на оптимальные:

Поигравшись с частотой работы периферии, мы видим, что оптимальным для нас будет частота в 16MHz. На эту частоту работы мы и настроили чуть выше работу периферии микроконтроллера. Теперь же опишем в нашей программе настройку таймингов работы CAN шины.

Для начала опишем определения прескалера, чтобы было удобнее в дальнейшем настраивать скорость на нашем устройстве:

Значения прескалера выбрали исходя из результатов работы калькулятора с настройкой на частоту работы периферии нашего микроконтроллера равной 16MHz.

Теперь выполним саму инициализацию CAN:

Описание всех параметров мы рассматривали в предыдущей статье (STM32. Реализация протокола CAN на базе МК STM32F103), здесь же рассмотрим только те параметры, которые непосредственно связаны с настройкой таймингов шины:

Заключение

Я очень надеюсь, что это статья поможет новичкам. Мне самому пришлось изучать кучу форумов и мануалы от ST, чтобы разобраться с правильной настройкой CAN. Именно поэтому я постарался максимально просто расписать здесь настройку таймингов, чтобы у начинающих в этом непростом деле быстрее сложилось понимание данного процесса.

За основу для статьи как обычно взяты материалы Programming Reference (перевод мой) для микроконтроллеров STM32 серии F103x с моими комментариями и пояснениями. А также информация с некоторых форумов.

Во вложение добавлены исходники примера настройки таймингов CAN и тактирования контроллера с тестовым примером отправки данных по шине.

Источник

Использование модулей CAN на STM32 для разных целей

В последнее время, к сожалению, выросла цена на многие импортные радиодетали, в том числе и на отладочные платы с микроконтроллерами. А потребность в изготовлении разных поделок к счастью не пропала. Волей случая у меня в руках оказалось несколько интересных модулей от компании Starline, которая выпускает автомобильные сигнализации и много других полезных вещей (Можете поспрашивать у установщиков сигнализаций, или на сайте производителя). Целей раскрыть секреты работы этих модулей не стояло. Но ввиду их хорошего изготовления и оснащения оставить пропадать их без дела наше время тоже нехорошо.
Вкратце о модулях:
Модуль CAN — STM32F103RBT8 + SST25V016 + TJA1042, силовые ключи, микросхемы питания.
Модуль 2CAN — STM32F105RBT8 + SST25V032 + TJA1048, микросхемы питания.

(процессоры STM32F103 и STM32F105 (7) друг от друга функционально отличаются блоками тактирования, USB и CAN, надо обратить на это внимание далее)
Вооружившись тестером, разрисовал схемы модулей, возможно с ошибками. Наиболее интересным естественно оказывается модуль 2CAN, он позволяет одновременную работу USB FS и двух приемопередатчиков CAN. У первого модуля либо CAN, либо USB.
Скриншот схемы модуля CAN:

для поделок организация ввода вывода неплохая, но модуль 2CAN для интеграции в автомобиль интереснее, схема:

Так как на некоторых компонентах была неизвестная мне маркировка, то соответственно, я рисовал своё видение схемы.

Читайте также:  Вмятина на лбу есенина

Из модуля CAN на досуге сделал два полезных устройства – блок управления ходовыми огнями, и блок тестирования шаговых двигателей. Причем управление этими блоками осуществлялось как с внешних датчиков, так и по шине USB. Со стороны компьютера, подключенные блоки виделись как устройства с последовательным портом RS232. Причины изготовления блока управления ходовыми огнями – установленные китайские жгут чрезмерным током свои же светодиоды, от любой импульсной помехи выгорают с дымом. Блок их управления, не защищены от влаги, нет защиты от помех по питанию, нет экранировки. На CAN модуль была возложена функция управления логикой работы ходовых огней и дублирующих сигналов поворота, управление силовым транзистором повышающего преобразователя напряжения (на линейки светодиодов требуется порядка 24В), управление силовыми транзисторами, подающие питание на 4 линейки светодиодов, задержка выключения света в течение заданного времени после выключения зажигания.

Вот внутренности фонарей:

В вот так выглядят внутренности драйвера после непродолжительной работы:

Помехи от проводов от китайского ксенона погасили ходовые огни :). Ну а если делать с большим запасом надежности, и использовать модуль CAN, получается примерно так (еще без корпуса на этапе настройки под капризы заказчика):

Схема обвязки для модуля довольно простая (скриншот):

Устройство тестирования шаговых двигателей, применяемых в автомобиле, задавать режим работы можно с компьютера (через терминал), и с кнопок тоже:

Это все конечно баловство, но работает. Вот подключится к блокам управления автомобиля уже интереснее. Модуль 2CAN решил подключить к центральному блоку управления легкового автомобиля, и по USB подключить его к персональному компьютеру, чтобы иметь возможность видеть какими данными обмениваются многочисленные блоки управления в автомобиле (оснащенного CAN шиной), и по необходимости самому посылать произвольные команды. Для начала, чтобы потренироваться пересылать данные по CAN шине между собой (двумя интегрированными на модуле блоками CAN), желательно сделать вот такую схему:

Хотя бы так:

С другой стороны:

Но если вы подключаетесь уже к готовой функционирующей сети CAN, то это делать нет необходимости. К модулю допаяны светодиоды и кнопка, для отладки и наблюдения за работой модуля. И контакты для программирования по SWD. Что и куда подробно написано в комментариях в проекте. Модуль также при подключении к компьютеру по USB и будет определяться как последовательный порт (с использованием драйвера от ST). На что надо обратить внимание, блоки CAN микроконтроллера будут инициализироваться если:

Выводы микроконтроллера правильно сконфигурированы.

Выводы подключены к микросхемам – драйверам CAN шины.

На CAN шине выставлено правильное напряжение.

форма сигналов должна быть примерно такой:

Небольшая проблема возникла при приеме сигналов в модуль CAN2 (Sleave), нет смысла искать ответа в интернете и на форумах, в большинстве случаев будет лишняя трата времени, да и примеры готовые то в eclipse, то Iar, или вообще на ассемблере. А Я вот пишу в Keil (можно скачать бесплатно, немного обрезанную функционально версию). Оказывается, надо любить внимательно читать комментарии в стандартной библиотеке от STM. Необходимо просто правильно настраивать фильтр приема сообщений, и вот как раз на CAN2 (CAN Sleave) там отдельная процедура дополнительная. Для примера и приведу инициализацию CAN Sleave:

И фильтр сообщений:

Обработчик прерываний CAN Sleave:

Добавлю и тактирование процессора stm32f105 (у stm32f103 все проще):

Все подробно можно посмотреть будет уже в проекте (KEIL).

Что в итоге получилось:


Слева направо: плата STM32L в качестве программатора, модуль 2CAN, центральный блок управления автомобиля с двумя шинами CAN (высокоскоростная и низкоскоростная).

Вид без корпуса на процессор блока управления:

После того как запрограммировали модуль (прямо из KEIL, ST-Link SWD), через пару секунд после подключения USB кабеля в micro-USB разъем модуля 2CAN в компьютере определяется последовательный порт. Добавляем драйвера по необходимости, настраиваем номер порта, запускаем терминал, подаем команду «?»+«Enter», модуль отвечает своим меню:

Подаем питание на блок управления автомобиля (в соответствии с документацией производителя), и видим сообщения, в которых блок управления пытается понять где сам автомобиль:

Сигнал CANH на приборе(CANL зеркален по горизонтали и немного смещен):

В остальном все заработало без проблем. Данные с блока управления автомобиля по его шинам CAN High Speed (500) и CAN Low Speed (250) сыпались в терминал без ошибок и пропусков. Более глобальной цели на данный момент я не ставил. В проекте часть кода заимствована из выложенных проектов других людей, часть написал, конечно сам. Добавлял комментарии на русском. Так как управление модулем происходило по виртуальному последовательному порту, через программу «Терминал», в микроконтроллере постоянно работает процедура, принимающая данные от компьютера, разбирающая их на команды и аргументы. Нажав в терминале «?» и «Enter», получим от микроконтроллера список доступных команд и аргументов. По крайней мере, можно наверняка найти и другие недорогие способы использования для подобных вещей. В остальном, думаю разберетесь. Если что, можно задавать вопросы. Попробую выложить заодно файлы проектов, схем и документации, как появится возможность на этой страничке. Или если есть куда выложить мег. 70 полного архива, включающего полную документации и библиотеки. Извиняюсь за стиль кода и изложение, так как программирование не моя основная работа, делал все урывками, и ушло на все времени две недели.

Или спрашивайте тут, постараюсь ответить (статья начала 2015 года).

Далее, на примере данного блока напишу работу с автомобилем.

(в связи с кончиной сайта, где я раньше публиковался, ветка общения со специалистами пропала к сожалению)

С уважением, Астанин Сергей.
ICQ 164487932
Проект приложен.
схемы в лучшем разрешении в pdf в архивах.

Источник

Ответы на самые частые вопросы пользователей рунета
Добавить комментарий

Adblock
detector