Доброго времени суток форумчане. Вторую неделю не могу запустить can на STM32F042. Инициализацию брал с STM32F0xx_Snippets_Package_V1.0.0 с примера работы для STM32F072. Пример скорее всего рабочий. Но процессор у меня в корпусе 20 ножек. По там нет кановских ножек PA_11 и PA_12. Их нужно ремапить на ноги PA_9 и PA_10. Во всем остальном вроде как инициализация должна подойти для моего процессора. Но осциллограф молчит . Инициализация вешается на цикле
while((CAN->MSR & CAN_MSR_INAK)==CAN_MSR_INAK)
{
}
Инициализация в loopback режиме. С каном только начал работать, поэтому мало что в нем понимаю. Во всем интернете не нашел не одного примера инициализации кроме приведенного выше для F0 линейки STM. Думаю может я ремапнул ноги как то не правильно или еще где какая детская ошибка ? В описании примера написано что на ноге PA12 я могу отследить, работает ли передача. Но увы… Привожу код инициализации, может кто чем поможет.
Инициализация ног КАН
__INLINE void Configure_GPIO_CAN(void)
{
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; // Добавил ремап для ног PA_9, PA_10
GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER11 | GPIO_MODER_MODER12))\
| (GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1); /* (1) */
GPIOA->AFR[1] = (GPIOA->AFR[1] &~ (GPIO_AFRH_AFR11 | GPIO_AFRH_AFR12))\
| (4 << (3 * 4)) | (4 << (4 * 4));
}
Инициализация Кана:
__INLINE void Configure_CAN(void)
{
RCC->APB1ENR |= RCC_APB1ENR_CANEN;
CAN->MCR |= CAN_MCR_INRQ; /* (1) */
while((CAN->MSR & CAN_MSR_INAK)!=CAN_MSR_INAK) /* (2) */
{
}
CAN->MCR &=~ CAN_MCR_SLEEP; /* (3) */
CAN->BTR |= CAN_BTR_LBKM | 2 << 20 | 3 << 16 | 5 << 0; /* (4) */
CAN->MCR &=~ CAN_MCR_INRQ;
Передачу данных осуществлял на плату OPEN103V. К ней уже шли готовые примеры. На
плате OPEN103V Прекрасно работает и передача и прерывание по приему данных. Вот у
меня осталась главная проблема как сейчас на моем stm32f042 организовать прием.
Функция
void CEC_CAN_IRQHandler (void) {
LED_1_RED(1);
}
я так понимаю должна срабатывать по приему любого символа но светодиод не
загорается, стало быть прерывание по приему не срабатывает. В чем может быть ошибка.
Может я опять где что забыл объявить, ну вроде в NVIC прерывание по приему и так
Не думал, что в этой серии работает CAN. Просто сейчас ищу маленький МК (оптимально что-нибудь типа QFN-16, QFN-24) для одной штуки с CAN.
И для подбора МК по необходимым параметрам (а мне нужно лишь ADC и CAN) использовал STM32CubeMX, но там почему то CAN и USB был неактивным для выбора. Получается, что этот куб от STM меня обманул
Но вообщем по делу:) После прочтения этой статьи выбор пал на STM32F042G6U6 в 24-ногом корпусе 4х4 мм. Как понимаю, CAN должен на нём завестись, т.к. в нём есть PA9 и PA10. И вопрос вот в чём: будет ли стабильная передача по CAN, если не будет внешнего кварца?
Насчет стабильной передачи без кварца я Х.З. Ну а насчет процессора. Да я для производства выбрал STM32F042F4P6 в удобном 20 ножковом корпусе. Вроде пока все работает как надо. Немножко запара была с тем, что там помимо ремапа функции кана необходимо было добавить ремап самих ножек, так как там нужно использовать PA11, PA12. То нужно было сначала переремапить ножки PA9 и PA10 на PA11 и PA12 а уж потом шаманить с остальным кодом.
Спасибо большое за ответ. Попробую сначала на макетке какой-нибудь без кварца что-нибудь погонять.
А по поводу опечатки в вправду, хотел написать в 28 ногом корпусе:)