Обновить

Пуск bxCAN-Трансивера на STM32

Уровень сложностиПростой
Время на прочтение15 мин
Охват и читатели11K
Всего голосов 10: ↑9 и ↓1+13
Комментарии13

Комментарии 13

Многие STM32 микроконтроллеры обладают CAN трансивером.

Всё же CAN-контроллерами они обладают, а не CAN-трансиверами, исправьте.

Не принципиально, можно и так и эдак называть.

Учите матчасть. Контроллер и трансивер - разные устройства, работающие в паре, но один отвечает за кодирование, другое - за физику. Автор в базовой терминологии не разобрался.

Тот, что за физику отвечает, обычно называется драйвер шины)

Трансивер - приемопередатчик. А драйвер - это просто преобразователь уровней. Называть его приемопередатчиком некорректно.

Он и драйвер, и приемопередатчик, и содержит в себе еще разные второстепенные функции. И все производители называют его трансивером.

Всё же CAN-контроллерами они обладают, а не CAN-трансиверами, исправьте.

Учите матчасть. Контроллер и трансивер - разные устройства

Ееее! Прям как я в своё время описывал :)))

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

Для прототипирования и первых шагов лучше брать HAL и конфигать периферию в CubeMX.

Оk. Заменил на CAN MAC.

Важный момент по CAN на STM32.
Надо отключать CAN-периферию от шины на время инициализации.

Буквально переводить CAN_RX и CAN_TX на GPIO вход.

Иначе внешний обильный трафик на шине может препятствовать нормальному ходу алгоритма инициализации и функция HAL_CAN_Init у вас свалится в timeout или error.

При установке INRQ=1 CAN контроллер может просто не перейти в режим инициализации

“ Once software has set the INRQ bit, the CAN hardware waits until the current CAN activity (transmission or reception) is completed before entering the initialization mode. Hardware signals this event by setting the INAK bit in the CAN_MSR register.”

У меня тоже есть такая плата. Пытался настроить CAN1 но подключен он на пины PD0,PD1. А как ремапить с PA11, PA12?

Схема у меня есть. Вот как код писать? На stm32f103 есть замечательная возможность: AFIO->MAPR |= AFIO_MAPR_CAN_REMAP_REMAP2; и можно переназначить пины. А в stm32f407 есть такая возможность? Ведь по умолчанию CAN1 подключен к PA11, PA12. Или достаточно такой конструкции:

//Настройка порта PD1 - CAN1 TX
GPIOD->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR1;//Очень высокая скорость
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_1;//PUSH-PULL
GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR1;//В ноль
GPIOD->MODER &= ~GPIO_MODER_MODER1;//В ноль
GPIOD->MODER |= GPIO_MODER_MODER1_1;//Выводы в альтернативную функцию
GPIOD->AFR[0] &= ~(0b1001 << 1 4);//Очищение перед записью
GPIOD->AFR[0] |= (0b1001 << 1
4);//Альтернативная функция 9 для CAN1

//Настройка порта PD0 - CAN1 RX
GPIOD->MODER &= ~GPIO_MODER_MODER0;
GPIOD->MODER |= GPIO_MODER_MODER0_1;
GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR0;
GPIOD->AFR[0] &= ~(0b1001 << 0 4);
GPIOD->AFR[0] |= (0b1001 << 0
4);

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации