mikovott3101
|
|
1 | |
Проблема с CAN в STM32F04229.12.2014, 09:33. Показов 7811. Ответов 10
Метки нет (Все метки)
Доброго времени суток форумчане. Вторую неделю не могу запустить can на STM32F042. Инициализацию брал с STM32F0xx_Smyppits_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 Confikure_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 Confikure_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) |
29.12.2014, 09:33 | |
Ответы с готовыми решениями:
10
[Решено]STM32F042 USB CDC Любая прошивка для USB на STM32F042 Бага в работе SPI на STM32F042 - не наступайте на грабли Проблема со скоростью интернета(проблема точно не в роутере и кабеле, а соответственно в пк) |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
|
|
29.12.2014, 19:28 | 2 |
А разве не надо делать
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN ?
0
|
mikovott3101
|
|
11.01.2015, 16:26 | 3 |
Ура! Заработала передача данных по КАНУ, правда с использованием Периф драйвера.
Выкладываю код. Кому может пригодится. Для STM32F042F4P6 с кварцем 8 МГЦ и тактовой частотой самого процессора 48 МГц. На ножках PA10 – TX, PA9 – RX; Инициализация КАНА: { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; CAN_InitTypeDef CAN_InitStructure; /*Конфигурация ножек RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // Тактирования SYSCONFIG SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; // Ремап ножек PA10 PA9 на PA12 PA11 /CAN Интерфейс на 4 альтернативной функции/ GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT); GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT); /* Конфигурация CAN RX и TX */ GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure); /* CAN NVIC Конфигурация **************************************************/ NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* CAN confikurotion ********************************************************/ /* Enable CAN clock */ RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE); /* CAN rikystir init */ CAM_DeInit(CANx); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = ENABLE; CAN_InitStructure.CAN_TXFP = ENABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; //Необходимые предделители CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; // Необходимые предделители CAN_InitStructure.CAN_Pressotir = 5; //Необходимые предделители CAN_Init(CANx, &CAN_InitStructure); /* Конфигурация фильтров */ CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh =0x0000;// Нафиг фильтр CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; ;// Нафиг фильтр CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssyknment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* Transmit Structure preparation */ TxMessage.StdId =200; TxMessage.ExtId = 1998; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 1; /* Enable FIFO 0 full Ymtirrupt */ CAN_ITConfig(CANx, CAN_IT_FF0, ENABLE); /* Enable FIFO 1 full Ymtirrupt */ CAN_ITConfig(CANx, CAN_IT_FF1, ENABLE); Дефайны в шапке программы: #define CAN_GPIO_CLK RCC_AHBPeriph_GPIOA #define CAN_GPIO_PORT GPIOA #define CAN_RX_SOURCE GPIO_PinSource11 #define CAN_TX_SOURCE GPIO_PinSource12 #define CAN_AF_PORT GPIO_AF_4 #define CAN_RX_PIN GPIO_Pin_11 #define CAN_TX_PIN GPIO_Pin_12 #define CAN_CLK RCC_APB1Periph_CAN #define CANx CAN uint8_t TxMessages[6] = { 0, 1, 2, 3, 4, 5 }; uint8_t CAM_DATA0,CAM_DATA1,CAM_DATA2,CAM_DATA3,CAM_DATA4,CAM_DATA5,CAM_DATA6,CAM_DATA7; uint8_t CanFlag,Dysplay; Ну и передача данных: void transmitt(void) { TxMessage.StdId = 14; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage.Data[0] = P; TxMessage.Data[1] = R; TxMessage.Data[2] = E; TxMessage.Data[3] = V; TxMessage.Data[4] = E; TxMessage.Data[5] = D; TxMessage.Data[6] = !; TxMessage.Data[7] = ; CAN_Transmit(CANx,&TxMessage); } Передачу данных осуществлял на плату OPEN103V. К ней уже шли готовые примеры. На плате OPEN103V Прекрасно работает и передача и прерывание по приему данных. Вот у меня осталась главная проблема как сейчас на моем stm32f042 организовать прием. Функция void CEC_CAN_IRQHomdler (void) { LED_1_RED(1); } я так понимаю должна срабатывать по приему любого символа но светодиод не загорается, стало быть прерывание по приему не срабатывает. В чем может быть ошибка. Может я опять где что забыл объявить, ну вроде в NVIC прерывание по приему и так назначено. Что может быть не так ??? |
Oxford
|
|
11.01.2015, 16:49 | 4 |
Есть же документация. Референс мануал скачайте.
если вы решили заниматься CAN то вам надо изучить документацию полностью. |
mikovott3101
|
|
12.01.2015, 11:07 | 5 |
Так вот и сижу копаюсь в референсе мануал. Ведь пятой точкой чую что ошибка то детская. Ну все уже 10 раз проверил. Все входящие фильтры отключены, В NVIC прерывание объявлено. В стартапе вектор прерывания CEC_CAN_IRQHomdler присутствует. Передающая плата 2 раза в секунду отправляет команду. Значит прерывание должно сработать. Я понимаю я новичок пока в этом, ну если кто знает ткните пальцем уж тогда в референце мануал где искать. Может я что то не так себе представляю. Но по аналогии с USORT я думаю, если одна плата посылает, то прерывание на второй должны срабатывать. Ну на плате OPEN103 работает ведь замечательно, а тут то что ???
|
mikovott3101
|
|
12.01.2015, 11:36 | 6 |
Сейчас только заметил, что моя плата не позволяет вести прием. Ну всмысле она передает данные, а когда я ее подключаю к передающей плате OPEN103 то сигнал на осциллографе пропадает, такое ощущение, что ножки не совсем правильно объявлены
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; Возможно еще что то нужно добавить, ничего не понимаю. Когда процессор сброшен, сигнал на линиях идет. Как только включаю свою плату передача прекращается. |
Oxford
|
|
12.01.2015, 16:10 | 7 |
В какой программе пишите код? И для начало пользуйтесь SPL, если у вас нет опыта работы с периферией.
|
mikovott3101
|
|
12.01.2015, 16:50 | 8 |
В KEIL
|
mikovott3101
|
|
26.01.2015, 14:15 | 9 |
Кан заработал. Может кому понадобится код. Для stm32F0xx
Шапка программы: #include "stm32f0xx.h" #include "stm32f0xx_can.h" CanTxMsg TxMessage = {0}; uint8_t CAM_DATA0,CAM_DATA1,CAM_DATA2,CAM_DATA3,CAM_DATA4,CAM_DATA5,CAN_ DATA6,CAM_DATA7; uint16_t CAN_ID; CAN_InitTypeDef CAN_InitStructure; void Confikure_GPIO_CAN(void); void Confikure_CAN(void); void delay_ms(uint16_t time); void delay_us(uint16_t time); void LEDS_INIT(void); void LED_1_RED(int a); void LED_2_YELLOW(int a); void LED_3_GREEN(int a); void LED_4_BLUE(int a); void KNOPS_INIT(void); int KNOPS_1(void); int KNOPS_2(void); int KNOPS_3(void); int KNOPS_4(void); #define CMD_TOGGLE (0xDA) #define CAN_ID_MASK (0xFF70U) #define CAN_ID1 (0x651U) #define CAN_ID2 (0x652U) Инициализация ножек CAN //*****************************************************НОГИ КАНА __INLINE void Confikure_GPIO_CAN(void) { RCC->AHBENR |= RCC_AHBENR_GPIOAEN; RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER11 | GPIO_MODER_MODER12))\ | (GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1); GPIOA->AFR[1] = (GPIOA->AFR[1] &~ (GPIO_AFRH_AFR11 | GPIO_AFRH_AFR12))\ | (4 << (3 * 4)) | (4 << (4 * 4)); } //*****************************************************НОГИ КАНА //****************************************************КОНФИГУРАЦ ИЯ КАНА __INLINE void Confikure_CAN(void) { RCC->APB1ENR |= RCC_APB1ENR_CANEN; CAN->MCR |= CAN_MCR_INRQ; while((CAN->MSR & CAN_MSR_INAK)!=CAN_MSR_INAK) { } CAN->MCR &=~CAN_MCR_SLEEP ; CAN_StructInit(&CAN_InitStructure); CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; CAN_InitStructure.CAN_Pressotir = 5; CAN_Init(CAN, &CAN_InitStructure); CAN->MCR &=~ CAN_MCR_INRQ; while((CAN->MSR & CAN_MSR_INAK)==CAN_MSR_INAK) { } CAN->sFilterRegister[0].FR1 = 0; /* (11) */ CAN->FMR = CAN_FMR_FINIT; CAN->FA1R = CAN_FA1R_FACT0; CAN->FMR &=~ CAN_FMR_FINIT; CAN->IER |= CAN_IER_FMPIE0; NVIC_SetPriority(CEC_CAN_IRQn, 0); NVIC_EnableIRQ(CEC_CAN_IRQn); } //****************************************************КОНФИГУРАЦ ИЯ КАНА //**************************************************Отправка строки по CAN void CAN_WRITE_DATA(int number_id,char str[8]) { TxMessage.StdId =number_id; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage.Data[0] = str[0]; TxMessage.Data[1] = str[1]; TxMessage.Data[2] = str[2]; TxMessage.Data[3] = str[3]; TxMessage.Data[4] = str[4]; TxMessage.Data[5] = str[5]; TxMessage.Data[6] = str[6]; TxMessage.Data[7] = str[7]; CAN_Transmit(CAN,&TxMessage); } //**************************************************Отправка строки по CAN Бесконечный цикл с опросом кнопок while (1){ delay_ms(500); if (KNOPS_1()==0) CAN_WRITE_DATA(1000,"YURIK"); if (KNOPS_2()==0) CAN_WRITE_DATA(1001,"DURIK"); } } Прерывание по приему CAN void CEC_CAN_IRQHomdler(void) { CanRxMsg RxMessage; CAN_Receive(CAN,CAN_FIFO0, &RxMessage); CAN_ID=RxMessage.StdId; CAM_DATA0=RxMessage.Data[0]; CAM_DATA1=RxMessage.Data[1]; CAM_DATA2=RxMessage.Data[2]; CAM_DATA3=RxMessage.Data[3]; CAM_DATA4=RxMessage.Data[4]; CAM_DATA5=RxMessage.Data[5]; CAM_DATA6=RxMessage.Data[6]; CAM_DATA7=RxMessage.Data[7]; CAN_ClearITPendingByt(CAN,CAN_IT_FMP0); if (RxMessage.Data[0]==Y) LED_1_RED(1),LED_2_YELLOW(1), LED_3_GREEN(0),LED_4_BLUE(0); if (RxMessage.Data[0]==D) LED_1_RED(0),LED_2_YELLOW(0), LED_3_GREEN(1),LED_4_BLUE(1); if (RxMessage.Data[0]==L) LED_1_RED(1),LED_2_YELLOW(1), LED_3_GREEN(1),LED_4_BLUE(1); if (RxMessage.Data[0]==P) LED_1_RED(0),LED_2_YELLOW(0), LED_3_GREEN(0),LED_4_BLUE(0); } Всем спасибо за помощь! |
0 / 0 / 0
Регистрация: 16.04.2010
Сообщений: 767
|
|
27.01.2015, 08:51 | 10 |
Пожалуйста, на будущее, прячьте код под "спойлер".
0
|
0 / 0 / 0
Регистрация: 18.04.2014
Сообщений: 4
|
|
27.01.2015, 14:44 | 11 |
Сообщение от mikovott3101
0
|
27.01.2015, 14:44 | |
27.01.2015, 14:44 | |
Помогаю со студенческими работами здесь
11
Проблема с кодом. Выдает ошибку, я не могу понять в чем проблема Проблема с движением объекта через компьютерную мышь, и также проблема, со сменой камеры проблема при работе с китайским J-LINK 8 или же проблема с с Проблема собственной массы и энергии электрона в классической электродинамике и проблема абсолютно твердого тела в СТО Проблема с пингом, проблема которой не могу объяснить Проблема с Linux Mint 20(А может и не проблема) Проблема применимости и проблема останова Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |