Stm32 Serial Communication Protocol
#Введение# CAN - многоадресный протокол передачи данных, обладающий высокой помехоустойчивостью. С его помощью реализуются сети с несколькими master-устройствами, встроенными контролем и коррекцией ошибок и скоростью в пределах 20 Kb/s – 1 Mb/s.
CAN эффективен, дешев и прост в использовании и реализации, поэтому широко применяется не только для автомобилей, но и в промышленности, авиастроении, медицине, а также робототехнике. Все больше микроконтроллеров получают поддержку CAN - в том числе и линейка STM32F4. Используемая мной плата STM32F407-Discovery обладает двумя CAN модулями. От каждого из них выводятся по две ножки – RX и TX. В рамках данной статьи я буду передавать и принимать пакеты «внутри» микроконтроллера. Если же вы собрались объединить несколько устройств в сеть, то простое соединение соответствующих TX RX устройствах не сработает, к тому же, может вывести из строя весь порт CAN модуля микроконтроллера.
Показать больше stm32, device protocol, implement protocol, implement protocol using, programming serial port using dma, study file transfer using stop wait.
Поэтому потребуется трансивер, например - SN65HVD230. #Настройка CAN в CubeMX# ##Pinout## На вкладке Pinout ставим галочку напротив CAN1, в качестве TX и RX автоматически назначаются пины PD1 и PD0.
##Тайминги## Переходим на вкладку Configuration и выбираем CAN1. Здесь нужно настроить тайминги – важную особенность протокола CAN. Рассмотрим схему передачи одного бита в CAN: Вся передача делится на кванты времени. BS1 (Bit segment 1) определяет место точки захвата бита, BS2 – место точки передачи. Во время получения данных, приемник определяет, когда началась передача бита, то есть произошел перепад сигнала. В норме, это должно произойти на границу sync и BS1, если это произошло раньше, микроконтроллер уменьшает сегмент BS1, если же позже – увеличивает BS2. Таким образом, происходит постоянная автоподстройка частоты приемника с частотой остальных устройств на шине.
Параметр SJW определяет число квантов времени, на которое контроллер будет изменять BS1 и BS2. Выставленные мною параметры при частоте тактирования в 42 МГц соответствуют скорости передачи в 50 kb/s.
Расчет можно произвести так: Длительность кванта.(1+BS1+BS2) = длительность передачи одного бита, (1 / длительность передачи бита) = скорость передачи данных. Впрочем, cubemx и так все считает за нас. ##Режим работы## Режим работы выбираем silent and loopback. В этом режиме все данные будут обрабатываться внутри микроконтроллера, без вывода на шину, то есть выход TX замыкается на RX. Так можно проверить работоспособность CAN не отходя от кассы. Просто отправляем пакеты себе же, принимаем и обрабатываем.
Также можно включить прерывания. В них нет большой необходимости, чисто в целях отладки. #Фильтрация# Еще одной важной особенностью является обязательная настройка фильтра, используемого для отслеживания сообщений по идентификатору (маске идентификатора). Без него устройство откажется принимать сообщения, так как в общем случае отсутствие фильтрации будет вызывать постоянное переполнение буфера и невозможность обработать все сообщения по мере поступления, а также увеличится нагрузка на процессор. В данном случае настроим фильтр без ограничений. CANFilterConfTypeDef canFilterConfig; canFilterConfig.FilterNumber = 0; //номер фильтра canFilterConfig.FilterMode = CANFILTERMODEIDMASK; // режим работы фильтра canFilterConfig.FilterScale = CANFILTERSCALE32BIT;// разрядность canFilterConfig.FilterIdHigh = 0x0000; // старшая и младшая части фильтра canFilterConfig.FilterIdLow = 0x0000; canFilterConfig.FilterMaskIdHigh = 0x0000.
Virtual Com Port Отладочную плату ипользуем ту же: STM32F4-DISCOVERY. Проект создаём из проекта I2CLCD80. Назовем его USBOTGCDC. Запустим проект в Cube, включим USBOTGFS в режим DeviceOnly В USBDEVICE в разделе Class For FS IP выберем пункт Communication Device Class (Virtual Port Com). Лапки портов PD4-PD7, PB8, PB9 отключим, это пережиток прошлых занятий В Clock Configuration выберем следующие делители (нажмите на картинку для увеличения изображения) В Configuration ничего не трогаем, т.к. Прерывания там выставились сами.
Сгенерируем и запустим проект, подключим lcd.c и настроим программатор на автоперезагрузку. Соберем проект. Прошьём контроллер. У нас появится неизвестное устройство, скачаем драйвер на наше виртуальное устройство usb. Для этого зайдем на сайт st.com, в строке поиска там вводим virtual com port, скачиваем и устанавливаем драйвер.
Затем желательно зайти в папку с установленным драйвером, выбрать папку, соответствующую разрядности нашей операционной системы, и запускаем также установку и оттуда. У нас скорей всего устройство установится с ошибкой (код 10) Есть несколько типов решений, мне понравился именно этот, т.к. Более простой: в файле usbdcdc.h заменим размер пакета, вместо 512 напишем 256 в данной строке: #define CDCDATAHSMAXPACKETSIZE 256 /. Endpoint IN & OUT Packet size./ Соберём, прошьём и увидим, что ошибка исчезла. Начнём писать код.
Сначала попытаемся передать данные на ПК.