реклама на сайте
подробности

 
 
> Проблема с CAN в STM32F042, STM32F042
megavolt31
сообщение Dec 30 2014, 05:54
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 30-12-14
Пользователь №: 84 364



Доброго времени суток форумчане. Вторую неделю не могу запустить 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;

while((CAN->MSR & CAN_MSR_INAK)==CAN_MSR_INAK) /* (6) */
{
}
// Из цикла программа не выходит!!!
GPIOA->ODR ^= GPIO_ODR_5;
CAN->FMR = CAN_FMR_FINIT; /* (7) */
CAN->FA1R = CAN_FA1R_FACT0; /* (8) */
#if (FILTER_LIST)
CAN->FM1R = CAN_FM1R_FBM0; /* (9) */
CAN->sFilterRegister[0].FR1 = CAN_ID2 << 5 | CAN_ID1 << (16+5); /* (10) */
#else
CAN->sFilterRegister[0].FR1 = CAN_ID1 << 5 | CAN_ID_MASK << 16; /* (11) */
#endif
CAN->FMR &=~ CAN_FMR_FINIT; /* (12) */
CAN->IER |= CAN_IER_FMPIE0; /* (13) */

NVIC_SetPriority(CEC_CAN_IRQn, 1); /* (16) */
NVIC_EnableIRQ(CEC_CAN_IRQn); /* (17) */
}
Передача данных:
Void TRANSMIT() {
if ((CAN->TSR & CAN_TSR_TME0) == CAN_TSR_TME0) /* (1) */
{
CAN->sTxMailBox[0].TDTR = 1;
CAN->sTxMailBox[0].TDLR = CMD;
CAN->sTxMailBox[0].TIR = (uint32_t)(CAN_ID << 21
| CAN_TI0R_TXRQ); /* (4) */
}
} // Из Референсе мануал на STM32F0
Дефайны программы.
#define CMD_TOGGLE (0xDA)
#define CAN_ID_MASK (0xFF70U)
#define CAN_ID1 (0x651U)
#define CAN_ID2 (0x652U)
#define FILTER_LIST (0)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01344 секунд с 7
ELECTRONIX ©2004-2016