///////////////////////////////////////////////////////////////////////////////////////// // Turn off motor drives void DriveOff() { for (int ch = 0; ch < CAN_Ch_COUNT; ch++) { if (!CAN_Ch_Enabled[ch]) continue; for (int node = 0; node < NODE_COUNT; node++) { if (!NODE_Enabled[ch][node]) continue; // set communication mode PREPARED: printf("set communication mode STOPPED...\n"); can_nmt_node_stop(CAN_Ch[ch], JointNodeID[ch][node]); // flush can messages: printf("flush can messages...\n"); can_flush(CAN_Ch[ch], JointNodeID[ch][node]); } } }
static int can_init(const can_cfg_t *cfg) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; RCC_ClocksTypeDef RCC_Clocks; #ifdef CONFIG_CAN1_REMAP RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /*RX = PB8, TX = PB9 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE); #else RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*RX = PA11 TX = PA12 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); #endif /* CAN register init */ CAN_DeInit(CAN1); CAN_StructInit(&CAN_InitStructure); //get apb clock RCC_GetClocksFreq(&RCC_Clocks); /* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = ENABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = ENABLE; CAN_InitStructure.CAN_Mode = (cfg -> silent) ? CAN_Mode_Silent : CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; CAN_InitStructure.CAN_Prescaler = RCC_Clocks.PCLK1_Frequency/cfg->baud/(1+3+5); CAN_Init(CAN1, &CAN_InitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 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_FilterFIFOAssignment=0 ; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); #if ENABLE_CAN_INT NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); #ifndef STM32F10X_CL NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; #else NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; #endif NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); circle_header = 0; circle_tailer = 0; circle_number = 0; #endif can_flush(); return 0; }