igler_u 0 3 февраля, 2013 Опубликовано 3 февраля, 2013 · Жалоба Придется дальше время поубивать на поиски решения. заработало и у меня Изначальная проблема была - запустить CAN2 (на stm32f105rc/vc), который при настройках, аналогичных CAN1, работать отказывался... При экспериментах выяснилось, что CAN2 работает только на отправку. Принять на него что-либо не получается, при этом передающая сторона докладывает, что всё отправлено, все OK. Для решения проблемы необходимо произвести дополнительные настройки: - первым делом при настройке второго CAN нужно затактировать CAN1! - далее (как говорилось ранее/выше) нужно настроить фильтры под второй CAN: в структуре инициализации параметр CAN_FilterNumber для CAN2 должен иметь номер с 14 по 27. альтернативно - использовать функцию CAN_SlaveStartBank(номер нужного фильтра), которая изменяет номер начального фильтр для CAN2. Регистры фильтров у CAN1 и CAN2 общие, и настраиваются они в CAN1 (для этого он должен быть затактирован). При этом в окне регистров CAN2 (в Keil) флаг FINIT - режим инициализации фильтров, в котором приём не активен! - будет находится в установленном состоянии (то есть что-то не то показыавется). Видимо, так как настройки фильтров общие, смотреть их для CAN2 нужно в настройках для CAN1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexanderB 0 3 июля, 2013 Опубликовано 3 июля, 2013 · Жалоба заработало и у меня Изначальная проблема была - запустить CAN2 (на stm32f105rc/vc), который при настройках, аналогичных CAN1, работать отказывался... При экспериментах выяснилось, что CAN2 работает только на отправку. Принять на него что-либо не получается, при этом передающая сторона докладывает, что всё отправлено, все OK. Для решения проблемы необходимо произвести дополнительные настройки: - первым делом при настройке второго CAN нужно затактировать CAN1! - далее (как говорилось ранее/выше) нужно настроить фильтры под второй CAN: в структуре инициализации параметр CAN_FilterNumber для CAN2 должен иметь номер с 14 по 27. альтернативно - использовать функцию CAN_SlaveStartBank(номер нужного фильтра), которая изменяет номер начального фильтр для CAN2. Регистры фильтров у CAN1 и CAN2 общие, и настраиваются они в CAN1 (для этого он должен быть затактирован). При этом в окне регистров CAN2 (в Keil) флаг FINIT - режим инициализации фильтров, в котором приём не активен! - будет находится в установленном состоянии (то есть что-то не то показыавется). Видимо, так как настройки фильтров общие, смотреть их для CAN2 нужно в настройках для CAN1. Таже проблема:( Не могу настроить оба CANа. Камень STM32F105RC. Из CAN1 данные отправляются и даже поступают на вход CAN2 (В регистре CAN_RF0R значнеие FMP0 становится 0х01), но если пытаюсь послать это же сообщение еще раз, то программа зависает:(((((((((( Вы можете привести листинг где вы сконфигурировали фильтры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexanderB 0 3 июля, 2013 Опубликовано 3 июля, 2013 · Жалоба Таже проблема:( Не могу настроить оба CANа. Камень STM32F105RC. Из CAN1 данные отправляются и даже поступают на вход CAN2 (В регистре CAN_RF0R значнеие FMP0 становится 0х01), но если пытаюсь послать это же сообщение еще раз, то программа зависает:(((((((((( Вы можете привести листинг где вы сконфигурировали фильтры? Все заработало!!!!!!!!!!!! Всем спасибо. Был прецеплен startup_HD вместо нужного startup_CL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ROOS81 0 12 июля, 2013 Опубликовано 12 июля, 2013 (изменено) · Жалоба Привет всем! Камень STM32F407 Пытаюсь настроить прием по CAN . Порты PD0 и PD1 (can1 RX , can1 TX) светодиод PB9 (плата от ТЕРРАЭЛЕКТРОНИКИ TE-stm32fx07) передачу настроил, работает нормально а вот прием никак... Может кто подскажет где собака порылась :smile3046: #include "stm32f4xx.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_can.h" #include "misc.h" #include "system_stm32f4xx.h" #define USE_CAN1 /* #define USE_CAN2 */ #ifdef USE_CAN1 #define CANx CAN1 #else /* USE_CAN1 */ #define CANx CAN1 #endif /* USE_CAN1*/ void NVIC_Config(); void Rxmsg (); void main() { SystemInit(); CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; GPIO_InitTypeDef GPIO_InitStructure; // Enable GPIO clock RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // Configure CAN1 as alternate function GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // Connect PXx to CAN 1 2 GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1); //CAN_RX = PD0 GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1); //CAN_TX = PD1 // init CAN1 RCC_APB1PeriphClockCmd (RCC_APB1Periph_CAN1, ENABLE); CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Prescaler = 16;// 125kbs CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//LoopBack CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_14tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq; CAN_DeInit(CAN1); CAN_Init(CAN1, &CAN_InitStructure); // IT Configuration for CAN1 FIFO 0 message received interrupt CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); // IT Configuration for CAN1 FIFO 1 message received interrupt CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE); /* CAN filter init */ #ifdef USE_CAN1 CAN_FilterInitStructure.CAN_FilterNumber = 0; #else /* USE_CAN1 */ CAN_FilterInitStructure.CAN_FilterNumber = 0; #endif /* USE_CAN1 */ CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment =CAN_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); uint8_t TransmitMailbox = 0; CanTxMsg TxMessage; CanRxMsg RxMessage; uint32_t i = 0; void NVIC_Config() { NVIC_InitTypeDef NVIC_InitStructure; /* Enable CANx RX0 interrupt IRQ channel */ #ifdef USE_CAN1 NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; #else /* USE_CAN1 */ NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; #endif /* USE_CAN1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void Rxmsg() { RxMessage.StdId = 0x00; RxMessage.ExtId = 0x00; RxMessage.IDE = CAN_ID_STD; RxMessage.DLC = 0; RxMessage.FMI = 0; for (i = 0; i < 8; i++) { RxMessage.Data[i] = 0; } CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); } while(1){ CSsendmsg (),Rxmsg(); if (RxMessage.Data[0]== 0x01) GPIOB->BSRRL = GPIO_Pin_9; int time = 3000000; while(time>1){time--;} time = 3000000; while(time>1){time--;} GPIOB->BSRRH = GPIO_Pin_9; }} Изменено 12 июля, 2013 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться