/** * @brief Configures the CAN, transmit and receive using interrupt. * @param None * @retval PASSED if the reception is well done, FAILED in other case */ TestStatus CAN_Interrupt(void) { CAN_InitTypeDef sCAN; CAN_RTRReplyTypeDef RTRReply; CAN_RTRMessageTypeDef RTRMes; CAN_FilterInitTypeDef Filter; uint32_t i = 0; /* Set the HCLK division factor = 1 for CAN1*/ CAN_BRGInit(MDR_CAN1,CAN_HCLKdiv1); /* CAN register init */ CAN_DeInit(MDR_CAN1); /* CAN cell init */ CAN_StructInit (&sCAN); sCAN.CAN_ROP = ENABLE; sCAN.CAN_SAP = ENABLE; sCAN.CAN_STM = ENABLE; sCAN.CAN_ROM = DISABLE; sCAN.CAN_PSEG = CAN_PSEG_Mul_2TQ; sCAN.CAN_SEG1 = CAN_SEG1_Mul_3TQ; sCAN.CAN_SEG2 = CAN_SEG2_Mul_2TQ; sCAN.CAN_SJW = CAN_SJW_Mul_2TQ; sCAN.CAN_SB = CAN_SB_3_SAMPLE; sCAN.CAN_BRP = 1; CAN_Init (MDR_CAN1,&sCAN); CAN_Cmd(MDR_CAN1, ENABLE); /* Enable CAN1 interrupt */ NVIC_EnableIRQ(CAN1_IRQn); /* Enable CAN1 GLB_INT and RX_INT interrupts */ CAN_ITConfig( MDR_CAN1, CAN_IT_GLBINTEN | CAN_IT_RXINTEN, ENABLE); /* Enable CAN1 interrupt from receive buffer */ CAN_RxITConfig( MDR_CAN1 ,(1<<rx_buf), ENABLE); /* config buffer for receive RTR reply*/ CAN_Receive(MDR_CAN1, rx_buf, DISABLE); Filter.Filter_ID = 0x00005678; Filter.Mask_ID = 0x0000FFFF; CAN_FilterInit(MDR_CAN1, rx_buf, &Filter); /* config buffer for transmit RTR reply*/ RTRReply.ID = 0x00005678; RTRReply.IDE = CAN_ID_EXT; RTRReply.DLC = 2; RTRReply.Data[0] = 0x7777; RTRReply.Data[1] = 0x0; CAN_RTRReply(MDR_CAN1, rtr_reply_buf, &RTRReply); Filter.Filter_ID = 0x00001234; Filter.Mask_ID = 0x0000FFFF; CAN_FilterInit(MDR_CAN1, rtr_reply_buf, &Filter); /* config buffer for transmit RTR request*/ RTRMes.ID = 0x00001234; RTRMes.IDE = CAN_ID_EXT; RTRMes.PRIOR_0 = DISABLE; /* transmit RTR*/ CAN_SendRTR(MDR_CAN1, rtr_request_buf, &RTRMes); /* initialize the value that will be returned */ ret = 0xFF; /* receive message with interrupt handling */ i=0; while((ret == 0xFF) && (i < 0xFFF)) { i++; } if (i == 0xFFF) { ret=0; } /* disable interrupt handling */ CAN_ITConfig(MDR_CAN1, CAN_IT_GLBINTEN | CAN_IT_RXINTEN, DISABLE); return (TestStatus)ret; }
/** * @brief Configures the CAN. * @param None * @retval None */ void CAN_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* GPIO clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIO_CAN, ENABLE); /* Configure CAN pin: RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_RX; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIO_CAN, &GPIO_InitStructure); /* Configure CAN pin: TX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_TX; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIO_CAN, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_CAN , ENABLE); /* CAN1 Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* CAN register init */ CAN_DeInit(CAN1); 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 = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = 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 = 4; 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); /* Transmit */ TxMessage.StdId = 0x321; TxMessage.ExtId = 0x01; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 1; }
u32 platform_can_setup( unsigned id, u32 clock ) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; GPIO_InitTypeDef GPIO_InitStructure; int cbaudidx = -1; // Configure IO Pins -- This is for STM32F103RE 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 ); // Select baud rate up to requested rate, except for below min, where min is selected if ( clock >= can_baud_rate[ CAN_BAUD_COUNT - 1 ] ) // round down to peak rate if >= peak rate cbaudidx = CAN_BAUD_COUNT - 1; else { for( cbaudidx = 0; cbaudidx < CAN_BAUD_COUNT - 1; cbaudidx ++ ) { if( clock < can_baud_rate[ cbaudidx + 1 ] ) // take current idx if next is too large break; } } /* Deinitialize CAN Peripheral */ CAN_DeInit( CAN1 ); 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=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; CAN_InitStructure.CAN_SJW=can_baud_sjw[ cbaudidx ]; CAN_InitStructure.CAN_BS1=can_baud_bs1[ cbaudidx ]; CAN_InitStructure.CAN_BS2=can_baud_bs2[ cbaudidx ]; CAN_InitStructure.CAN_Prescaler=can_baud_pre[ cbaudidx ]; 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=CAN_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); return can_baud_rate[ cbaudidx ]; }
void can_init( can_speed_typedef can_spd, can_std_typedef can_typ ) { GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; // GPIO clock enable, had been init in uart1_init //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA , ENABLE); /* Configure CAN pin: RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure CAN pin: TX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* CANx Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* CAN register init */ CAN_DeInit(CAN1); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; //time triggered communication mode //CAN_InitStructure.CAN_ABOM = DISABLE; //automatic bus-off management CAN_InitStructure.CAN_ABOM = ENABLE; //EN:离线后,自动开启恢复过程 CAN_InitStructure.CAN_AWUM = DISABLE; //automatic wake-up mode //CAN_InitStructure.CAN_NART = DISABLE; //no-automatic retransmission mode CAN_InitStructure.CAN_NART = ENABLE; //EN:只发一次,不管结果;DIS: 自动重传,直到成功 //CAN_InitStructure.CAN_RFLM = DISABLE; //Receive FIFO Locked mode CAN_InitStructure.CAN_RFLM = ENABLE; //EN: 溢出时丢弃新报文, DIS: 保留新报文 //CAN_InitStructure.CAN_TXFP = DISABLE; //transmit FIFO priority CAN_InitStructure.CAN_TXFP = ENABLE; //EN: 优先级由发送顺序决定, DIS:优先级由报文ID决定 // CAN_Mode_Normal ((uint8_t)0x00) /*!< normal mode */ // CAN_Mode_LoopBack ((uint8_t)0x01) /*!< loopback mode */ // CAN_Mode_Silent ((uint8_t)0x02) /*!< silent mode */ // CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /*!< loopback combined with silent mode */ //CAN_InitStructure.CAN_Mode = CAN_Mode_Silent_LoopBack; //CAN work mode CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //CAN work mode //Baud = 24M(APB1) / (Prescaler) / 8(TqCount) CAN_InitStructure.CAN_SJW=CAN_SJW_2tq; //重同步单元 CAN_InitStructure.CAN_BS1=CAN_BS1_3tq;//采样点前 CAN_InitStructure.CAN_BS2=CAN_BS2_4tq;//采用点后 if ( can_spd == CAN_500K ) { CAN_InitStructure.CAN_Prescaler = 6 ;//500K } else { CAN_InitStructure.CAN_Prescaler = 12 ;//250K } CAN_Init(CAN1, &CAN_InitStructure); /* CAN filter init */ //1, 共有14组过滤器(0~13),每组有2个32位寄存器:CAN_FxR0,CAN_FxR1 //2, CAN_FMR的FBMx位,设置过滤器工作在屏蔽模式(0)或列表模式(1) //3, CAN_FilterFIFOAssignment 决定报文存去FIFO0 或 FIFO1 //4, 目前策略:已知的ID,通过屏蔽模式列出,保存到FIFO0 // 未知的ID,全部保存到 FIFO1,将来上传到服务器上供分析 //Filter number 0 CAN_FilterInitStructure.CAN_FilterNumber = 0; //CAN_FilterMode: CAN_FilterMode_IdMask or CAN_FilterMode_IdList CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //CAN_FilterScale: CAN_FilterScale_16bit or CAN_FilterScale_32bit CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //如果Filter=0xF0, Mask=0x00,那么可以收到0xF0-0xFF共16个ID的信息。 //还是Filter=0xF0, Mask=0xFF,那么只能收到0xF0这一个ID信息。 //还是Filter=0xF0, Mask=0xF8,那么可以收到0xF8-0xFF共8个ID的信息。 //还是Filter=0xF0, Mask=0xFC,那么可以收到0xFC-0xFF共4个ID的信息。 //即 Mask对应位=1时,接收到的信息ID对应位必须=Filter的对应位才能确认处理 // Mask对应位=0时,Filter对应位=1时,接收到的信息ID对应位必须=1才能确认处理 // Mask对应位=0时,Filter对应位=0时,接收到的信息ID对应位=0,=1都能确认处理 if ( can_typ == CAN_EXT ) { //0x18DAF111 CAN_FilterInitStructure.CAN_FilterIdHigh = ((0x18DAF111)>>16)&0x1FFF;//29 bits,左对齐 CAN_FilterInitStructure.CAN_FilterIdLow = 0x18DAF111&0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x1FFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; }
/** * @brief Configures the CAN. * @param None * @retval None */ static void CAN_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; CAN_InitTypeDef CAN_InitStructure; /* CAN GPIOs configuration **************************************************/ /* Enable GPIO clock */ RCC_AHBPeriphClockCmd(CAN_GPIO_CLK, ENABLE); /* Connect CAN pins to AF7 */ GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT); GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT); /* Configure CAN RX and TX pins */ 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 configuration **************************************************/ NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* CAN configuration ********************************************************/ /* Enable CAN clock */ RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE); /* CAN register init */ CAN_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 Baudrate = 1MBps (CAN clocked at 36 MHz) */ CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 2; CAN_Init(CANx, &CAN_InitStructure); /* CAN filter init "FIFO0" */ CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x6420; CAN_FilterInitStructure.CAN_FilterIdLow = 0x2461; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* Transmit Structure preparation */ TxMessage.StdId = 0x321; TxMessage.ExtId = 0x00; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 1; /* Enable FIFO 0 full Interrupt */ CAN_ITConfig(CANx, CAN_IT_FF0, ENABLE); /* Enable FIFO 1 full Interrupt */ CAN_ITConfig(CANx, CAN_IT_FF1, ENABLE); }
/** * @brief Configures the CAN. * @param None * @retval None */ void CAN_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* CAN GPIOs configuration **************************************************/ /* Enable GPIO clock */ RCC_AHB1PeriphClockCmd(Open207Z_CAN_GPIO_CLK, ENABLE); /* Connect CAN pins to AF9 */ GPIO_PinAFConfig(Open207Z_CAN_GPIO_PORT, Open207Z_CAN_RX_SOURCE, Open207Z_CAN_AF_PORT); GPIO_PinAFConfig(Open207Z_CAN_GPIO_PORT, Open207Z_CAN_TX_SOURCE, Open207Z_CAN_AF_PORT); /* Configure CAN RX and TX pins */ GPIO_InitStructure.GPIO_Pin = Open207Z_CAN_RX_PIN | Open207Z_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(Open207Z_CAN_GPIO_PORT, &GPIO_InitStructure); /* CAN configuration ********************************************************/ /* Enable CAN clock */ RCC_APB1PeriphClockCmd(Open207Z_CAN_CLK, ENABLE); /* CAN register init */ CAN_DeInit(Open207Z_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 = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; /* CAN Baudrate = 1MBps (CAN clocked at 30 MHz) */ CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 2; CAN_Init(Open207Z_CANx, &CAN_InitStructure); /* CAN filter init */ #ifdef OpenCAN1 CAN_FilterInitStructure.CAN_FilterNumber = 0; #endif #ifdef OpenCAN2 CAN_FilterInitStructure.CAN_FilterNumber = 14; #endif 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); /* Transmit Structure preparation */ TxMessage.StdId = 0x321; TxMessage.ExtId = 0x01; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 1; /* Enable FIFO 0 message pending Interrupt */ CAN_ITConfig(Open207Z_CANx, CAN_IT_FMP0, ENABLE); }
/** * @brief Configures the CAN, transmit and receive by polling * @param None * @retval PASSED if the reception is well done, FAILED in other case */ TestStatus CAN_Polling(void) { CAN_InitTypeDef sCAN; CAN_TxMsgTypeDef TxMsg; CAN_RxMsgTypeDef RxMsg; uint32_t i = 0; /* Set the HCLK division factor = 1 for CAN1*/ CAN_BRGInit(MDR_CAN1,CAN_HCLKdiv1); /* CAN register init */ CAN_DeInit(MDR_CAN1); /* CAN cell init */ CAN_StructInit (&sCAN); sCAN.CAN_ROP = ENABLE; sCAN.CAN_SAP = ENABLE; sCAN.CAN_STM = ENABLE; sCAN.CAN_ROM = DISABLE; sCAN.CAN_PSEG = CAN_PSEG_Mul_2TQ; sCAN.CAN_SEG1 = CAN_SEG1_Mul_5TQ; sCAN.CAN_SEG2 = CAN_SEG2_Mul_5TQ; sCAN.CAN_SJW = CAN_SJW_Mul_4TQ; sCAN.CAN_SB = CAN_SB_3_SAMPLE; sCAN.CAN_BRP = 4; CAN_Init (MDR_CAN1,&sCAN); CAN_Cmd(MDR_CAN1, ENABLE); /* Disable all CAN1 interrupt */ CAN_ITConfig( MDR_CAN1, CAN_IT_GLBINTEN | CAN_IT_RXINTEN | CAN_IT_TXINTEN | CAN_IT_ERRINTEN | CAN_IT_ERROVERINTEN, DISABLE); /* Enable CAN1 interrupt from receive buffer */ CAN_RxITConfig( MDR_CAN1 ,(1<<rx_buf), ENABLE); /* Enable CAN1 interrupt from transmit buffer */ CAN_TxITConfig( MDR_CAN1 ,(1<<tx_buf), ENABLE); /* receive buffer enable */ CAN_Receive(MDR_CAN1, rx_buf, DISABLE); /* transmit */ TxMsg.IDE = CAN_ID_EXT; TxMsg.DLC = 0x08; TxMsg.PRIOR_0 = DISABLE; TxMsg.ID = 0x12345678; TxMsg.Data[1] = 0x01234567; TxMsg.Data[0] = 0x89ABCDEF; CAN_Transmit(MDR_CAN1, tx_buf, &TxMsg); i = 0; while(((CAN_GetStatus(MDR_CAN1) & CAN_STATUS_TX_READY) != RESET) && (i != 0xFFF)) { i++; } CAN_ITClearRxTxPendingBit(MDR_CAN1, tx_buf, CAN_STATUS_TX_READY); i = 0; while(((CAN_GetStatus(MDR_CAN1) & CAN_STATUS_RX_READY) == RESET) && (i != 0xFFF)) { i++; } /* receive */ CAN_GetRawReceivedData(MDR_CAN1, rx_buf, &RxMsg); CAN_ITClearRxTxPendingBit(MDR_CAN1, rx_buf, CAN_STATUS_RX_READY); CAN_Cmd(MDR_CAN1, DISABLE); if(RxMsg.Rx_Header.IDE != TxMsg.IDE) { return FAILED; } if(RxMsg.Rx_Header.DLC != TxMsg.DLC) { return FAILED; } if(RxMsg.Rx_Header.ID != TxMsg.ID) { return FAILED; } if(RxMsg.Data[1] != TxMsg.Data[1]) { return FAILED; } if(RxMsg.Data[0] != TxMsg.Data[0]) { return FAILED; } else { return PASSED; /* Test Passed */ } }
/*! \fn void can_init(void) * * \brief 初始化CAN1总线 * * \param 无 * * \exception 无 * * \return 无 */ void can_init(void) { CAN_InitTypeDef CAN_InitStructure = {0}; CAN_FilterInitTypeDef CAN_FilterInitStructure = {0}; /*! 使能CAN1时钟(最大36MHz) */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE); /*! 配置CAN1端口 */ can_gpio_configuration(); /*! 配置NVIC */ can_nvic_configuration(); /* 初始化CAN寄存器 */ CAN_DeInit(CAN1); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ /*! 时间触发通信模式 */ CAN_InitStructure.CAN_TTCM = DISABLE; /*! 离线恢复:ENABLE开启自动恢复 */ CAN_InitStructure.CAN_ABOM = DISABLE; /*! 自动唤醒模式 */ CAN_InitStructure.CAN_AWUM = DISABLE; /*! 禁止自动重传模式:ENABLE使能 */ CAN_InitStructure.CAN_NART = DISABLE; /*! 接收FIFO锁定模式 */ CAN_InitStructure.CAN_RFLM = DISABLE; /*! 发送优先级:ENABLE由发送请求次序决定 */ CAN_InitStructure.CAN_TXFP = ENABLE; /*! 模式 */ CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//CAN_Mode_Silent_LoopBack; //CAN_Mode_Normal; /* CAN Baudrate = 500KBps = 36MHz/(1*SJW+BS1+BS2) */ CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_2tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; CAN_InitStructure.CAN_Prescaler = 12; CAN_Init(CAN1, &CAN_InitStructure); /*! 报文滤波器设置 */ #if 0 /*! 过滤器组 */ CAN_FilterInitStructure.CAN_FilterNumber = 0; /*!屏蔽位模式和标识符列表模式 */ CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; /*! 过滤器组位宽:16位时可以设置4个ID */ CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit; /*! ID */ CAN_FilterInitStructure.CAN_FilterIdHigh = (CAN_ID_1<<5) & 0xFFE0; //FR2L CAN_FilterInitStructure.CAN_FilterIdLow = (CAN_ID_2<<5) & 0xFFE0; //FR1L CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (CAN_ID_3<<5) & 0xFFE0; //FR2H CAN_FilterInitStructure.CAN_FilterMaskIdLow = (CAN_ID_4<<5) & 0xFFE0; //FR1H /*! FIFO */ CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); #else /*! 过滤器组 */ CAN_FilterInitStructure.CAN_FilterNumber = 0; /*!屏蔽位模式和标识符列表模式 */ CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; /*! 过滤器组位宽 */ CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; /*! ID */ CAN_FilterInitStructure.CAN_FilterIdHigh = (uint16_t)((0x00400000<<3)>>16); CAN_FilterInitStructure.CAN_FilterIdLow = (uint16_t)(0x00400000<<3); CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;//0x0000;//(uint16_t)((0xFFFF00FF<<3)>>16); CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;//0x0000;//(uint16_t)(0xFFFF00FF<<3); /*! FIFO */ CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); #endif /*! CAN1中断设置 */ /*! CAN_IT_TME:发送邮箱空中断使能 */ /*! CAN_IT_FMP0:FIFO0消息挂号中断使能 */ /*! CAN_IT_FF0:FIFO0满中断使能 */ /*! CAN_IT_FOV0:FIFO0溢出中断使能 */ /*! CAN_IT_EWG:错误警告中断使能(>=96) */ /*! CAN_IT_EPV:错误被动中断使能(>127) */ /*! CAN_IT_ERR:错误中断使能 */ CAN_ITConfig(CAN1, CAN_IT_TME|CAN_IT_FMP0, ENABLE); }
/******************************************************************************* * Function Name : * Description : * Output : * Return : *******************************************************************************/ _CAN::_CAN(bool loopback) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; NVIC_InitTypeDef NVIC_InitStructure; if(me==NULL) { #ifndef __SIMULATION__ GPIO_InitTypeDef GPIO_InitStructure; GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = 1<<CAN_RXPIN; GPIO_Init(CAN_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Pin = 1<<CAN_TXPIN; GPIO_Init(CAN_GPIO, &GPIO_InitStructure); GPIO_PinAFConfig(CAN_GPIO, CAN_RXPIN, GPIO_AF_CAN); GPIO_PinAFConfig(CAN_GPIO, CAN_TXPIN, GPIO_AF_CAN); #endif RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); // glej opis driverja, šmafu, treba inicializirat c RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE); CAN_StructInit(&CAN_InitStructure); CAN_DeInit(__CAN__); 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; //... pomembn.. da ne zamesa mailboxov in jih oddaja po vrstnem redu vpisovanja... ni default !!! CAN_InitStructure.CAN_TXFP=ENABLE; //... prijava instance za ISR RX_ISR(this); TX_ISR(this); if(loopback) CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; else CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; CAN_InitStructure.CAN_SJW=CAN_SJW_4tq; CAN_InitStructure.CAN_BS1=CAN_BS1_10tq; CAN_InitStructure.CAN_BS2=CAN_BS2_4tq; CAN_InitStructure.CAN_Prescaler=4; CAN_Init(__CAN__,&CAN_InitStructure); CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0; CAN_FilterInitStructure.CAN_FilterIdLow=0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; // filtri za PFM in EC CAN_FilterInitStructure.CAN_FilterIdHigh=Com2CanIoc<<5; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=Com2CanEc20<<5; CAN_FilterInitStructure.CAN_FilterNumber=__FILT_BASE__+0; CAN_FilterInit(&CAN_FilterInitStructure); CAN_FilterInitStructure.CAN_FilterIdHigh=Can2ComIoc<<5; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=Can2ComEc20<<5; CAN_FilterInitStructure.CAN_FilterNumber=__FILT_BASE__+1; CAN_FilterInit(&CAN_FilterInitStructure); // CAN_FilterInitStructure.CAN_FilterIdHigh=SprayCommand<<5; // CAN_FilterInitStructure.CAN_FilterMaskIdHigh=SprayStatus<<5; // CAN_FilterInitStructure.CAN_FilterNumber=__FILT_BASE__+2; // CAN_FilterInit(&CAN_FilterInitStructure); CAN_FilterInitStructure.CAN_FilterIdHigh=Sys2Ergm<<5; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=Ergm2Sys<<5; CAN_FilterInitStructure.CAN_FilterNumber=__FILT_BASE__+2; CAN_FilterInit(&CAN_FilterInitStructure); CAN_FilterInitStructure.CAN_FilterIdHigh=Sys2Ioc<<5; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=Sys2Ec<<5; CAN_FilterInitStructure.CAN_FilterNumber=__FILT_BASE__+3; CAN_FilterInit(&CAN_FilterInitStructure); CAN_FilterInitStructure.CAN_FilterIdHigh=Ioc2Sys<<5; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=Ec2Sys<<5; CAN_FilterInitStructure.CAN_FilterNumber=__FILT_BASE__+4; CAN_FilterInit(&CAN_FilterInitStructure); CAN_FilterInitStructure.CAN_FilterIdHigh=Ec2Sync<<5; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0<<5; CAN_FilterInitStructure.CAN_FilterNumber=__FILT_BASE__+5; CAN_FilterInit(&CAN_FilterInitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = CAN1_TX_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = CAN2_TX_IRQn; NVIC_Init(&NVIC_InitStructure); CAN_ITConfig(__CAN__, CAN_IT_FMP0, ENABLE); com=NULL; } }
/** * @brief Configures the CAN, transmit and receive using interrupt. * @param None * @retval PASSED if the reception is well done, FAILED in other case */ TestStatus CAN_Interrupt(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage; uint32_t i = 0; /* CAN register init */ CAN_DeInit(CAN1); 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=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=1; CAN_Init(CAN1, &CAN_InitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=1; 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=CAN_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* CAN FIFO0 message pending interrupt enable */ CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); /* transmit 1 message */ TxMessage.StdId=0x00; TxMessage.ExtId=0x1234; TxMessage.IDE=CAN_ID_EXT; TxMessage.RTR=CAN_RTR_DATA; TxMessage.DLC=2; TxMessage.Data[0]=0xDE; TxMessage.Data[1]=0xCA; CAN_Transmit(CAN1, &TxMessage); /* initialize the value that will be returned */ ret = 0xFF; /* receive message with interrupt handling */ i=0; while((ret == 0xFF) && (i < 0xFFF)) { i++; } if (i == 0xFFF) { ret=0; } /* disable interrupt handling */ CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE); return (TestStatus)ret; }
void CAN1_Configuration(void (*send_handler)(uint16_t, int8_t), void (*receive_handler)(CanRxMsg*), uint16_t IdHigh, uint16_t IdHighMask, uint16_t IdLow, uint16_t IdLowMask) { CAN_InitTypeDef can; CAN_FilterInitTypeDef can_filter; GPIO_InitTypeDef gpio; NVIC_InitTypeDef nvic; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_CAN1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_CAN1); gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_11; gpio.GPIO_Mode = GPIO_Mode_AF; gpio.GPIO_Speed = GPIO_Speed_100MHz; gpio.GPIO_OType = GPIO_OType_PP; gpio.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &gpio); can1_rh = receive_handler; can1_sh = send_handler; nvic.NVIC_IRQChannel = CAN1_RX0_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = ITP_CAN1_RX0_PREEMPTION; nvic.NVIC_IRQChannelSubPriority = ITP_CAN1_RX0_SUB; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); nvic.NVIC_IRQChannel = CAN1_TX_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = ITP_CAN1_TX_PREEMPTION; nvic.NVIC_IRQChannelSubPriority = ITP_CAN1_TX_SUB; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); CAN_DeInit(CAN1); CAN_StructInit(&can); can.CAN_TTCM = DISABLE; can.CAN_ABOM = DISABLE; can.CAN_AWUM = DISABLE; can.CAN_NART = DISABLE; can.CAN_RFLM = DISABLE; can.CAN_TXFP = ENABLE; can.CAN_Mode = CAN_Mode_Normal; can.CAN_SJW = CAN_SJW_1tq; can.CAN_BS1 = CAN_BS1_9tq; can.CAN_BS2 = CAN_BS2_4tq; can.CAN_Prescaler = 3; CAN_Init(CAN1, &can); can_filter.CAN_FilterNumber = 0; can_filter.CAN_FilterMode = CAN_FilterMode_IdMask; can_filter.CAN_FilterScale = CAN_FilterScale_16bit; can_filter.CAN_FilterIdHigh = IdHigh << 5; can_filter.CAN_FilterIdLow = IdLow << 5; can_filter.CAN_FilterMaskIdHigh = IdHighMask << 5; can_filter.CAN_FilterMaskIdLow = IdLowMask << 5; can_filter.CAN_FilterFIFOAssignment = 0; can_filter.CAN_FilterActivation = ENABLE; CAN_FilterInit(&can_filter); CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE); }
/** * @brief Configures the CAN, transmit and receive by polling * @param None * @retval PASSED if the reception is well done, FAILED in other case */ TestStatus CAN_Polling(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage; CanRxMsg RxMessage; uint32_t i = 0; uint8_t TransmitMailbox = 0; /* CAN register init */ CAN_DeInit(CAN1); 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=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=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); /* transmit */ TxMessage.StdId=0x11; TxMessage.RTR=CAN_RTR_DATA; TxMessage.IDE=CAN_ID_STD; TxMessage.DLC=2; TxMessage.Data[0]=0xCA; TxMessage.Data[1]=0xFE; TransmitMailbox=CAN_Transmit(CAN1, &TxMessage); i = 0; while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF)) { i++; } i = 0; while((CAN_MessagePending(CAN1, CAN_FIFO0) < 1) && (i != 0xFF)) { i++; } /* receive */ RxMessage.StdId=0x00; RxMessage.IDE=CAN_ID_STD; RxMessage.DLC=0; RxMessage.Data[0]=0x00; RxMessage.Data[1]=0x00; CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); if (RxMessage.StdId!=0x11) { return FAILED; } if (RxMessage.IDE!=CAN_ID_STD) { return FAILED; } if (RxMessage.DLC!=2) { return FAILED; } if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE) { return FAILED; } return PASSED; /* Test Passed */ }
void Init_CAN(int can_num,uint8_t CAN_Mode,GPIO_TypeDef *tx_port,uint16_t tx_pin,GPIO_TypeDef *rx_port,uint16_t rx_pin){ /* Define InitTypeDef ---------------------------------------------------*/ CAN_InitTypeDef CAN_InitStructure; /* initialize InitTypeDef -----------------------------------------------*/ CAN_StructInit(&CAN_InitStructure); /* Supply clock source --------------------------------------------------*/ if(can_num == 1){ CAN_DeInit(CAN1); RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN1, ENABLE); }else if(can_num == 2){ CAN_DeInit(CAN2); RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN2, ENABLE); } /* Define gpio_config ---------------------------------------------------*/ Init_port(GPIO_Mode_AF,tx_port,tx_pin,GPIO_PuPd_UP,GPIO_OType_PP); Init_port(GPIO_Mode_AF,rx_port,rx_pin,GPIO_PuPd_UP,GPIO_OType_PP); if(can_num == 1){ GPIO_PinAFConfig(tx_port, Pin_select_source(tx_pin), GPIO_AF_CAN1);//Tx GPIO_PinAFConfig(rx_port, Pin_select_source(rx_pin), GPIO_AF_CAN1);//Rx }else if(can_num == 2){ GPIO_PinAFConfig(tx_port, Pin_select_source(tx_pin), GPIO_AF_CAN2);//Tx GPIO_PinAFConfig(rx_port, Pin_select_source(rx_pin), GPIO_AF_CAN2);//Rx } /* Set up CAN function -------------------------------------------------*/ /* タイムトリガ通信モードの有効化・無効化を設定する */ CAN_InitStructure.CAN_TTCM = ENABLE; /* 自動バスオフ管理(Automatic Bus-Off Management)の有効化・無効化を設定する */ CAN_InitStructure.CAN_ABOM = DISABLE; /* 自動再起動モードの有効化・無効化を設定する */ CAN_InitStructure.CAN_AWUM = DISABLE; /* 自動再送信禁止を有効化・無効化する DISABLE: 自動再送信禁止を無効化(つまり再送信は有効) ENABLE: 自動再送信禁止。正常に送信されなくても送信は1回だけ行われる */ CAN_InitStructure.CAN_NART = DISABLE; /* 受信FIFOロックモードの有効化・無効化を設定する */ CAN_InitStructure.CAN_RFLM = DISABLE; /* 送信FIFOの送信順序を指定する。DISABLE:メッセージIDで送信順序が決定される ENABLE:ソフトウェアで送信要求が発生された順番で送信される */ CAN_InitStructure.CAN_TXFP = DISABLE; /* CANのModeを設定する */ // CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_Mode = CAN_Mode; /* 再同期ジャンプ幅(CANハードウェアが再同期を行う際のビット幅)を時間単位の数で設定する */ CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; /* CANビットタイミングレジスタ(CAN_BTR)のTS1[3:0]を設定する。 */ CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; /* CANビットタイミングレジスタ(CAN_BTR)のTS2[2:0]を設定する */ CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; /* ボーレートプリスケーラ設定する 1〜1024 APB1=42MHz*/ CAN_InitStructure.CAN_Prescaler = 3; //1Mbps if(can_num == 1){ CAN_Init(CAN1, &CAN_InitStructure); }else if(can_num == 2){ CAN_Init(CAN2, &CAN_InitStructure); } #ifdef USE_INTERRUPT_CAN_RX NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); if(can_num == 1){ NVIC_Configuration(CAN1_RX0_IRQn); CAN_ITConfig(CAN1, CAN_IT_FMP0,ENABLE);//message pending Interrupt /* CAN_ITConfig(CAN1, CAN_IT_EWG, ENABLE);//Error passive Interrupt CAN_ITConfig(CAN1, CAN_IT_EPV, ENABLE);//Error passive Interrupt CAN_ITConfig(CAN1, CAN_IT_BOF, ENABLE);//Bus-off Interrupt CAN_ITConfig(CAN1, CAN_IT_LEC, ENABLE);//tLast error code Interrupt CAN_ITConfig(CAN1, CAN_IT_ERR, ENABLE);//Error Interrupt */ }else if(can_num == 2){ NVIC_Configuration(CAN2_RX0_IRQn); CAN_ITConfig(CAN2, CAN_IT_FMP0,ENABLE);//message pending Interrupt /* CAN_ITConfig(CAN2, CAN_IT_EWG, ENABLE);//Error passive Interrupt CAN_ITConfig(CAN2, CAN_IT_EPV, ENABLE);//Error passive Interrupt CAN_ITConfig(CAN2, CAN_IT_BOF, ENABLE);//Bus-off Interrupt CAN_ITConfig(CAN2, CAN_IT_LEC, ENABLE);//tLast error code Interrupt CAN_ITConfig(CAN2, CAN_IT_ERR, ENABLE);//Error Interrupt */ } #endif #ifdef USE_INTERRUPT_CAN_TX if(can_num == 1){ CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);//Transmit mailbox empty Interrupt }else if(can_num == 2){ CAN_ITConfig(CAN2, CAN_IT_TME, ENABLE);//Transmit mailbox empty Interrupt } #endif }
//fungsi inisialisasi CAN (Controller Area Network) static void CAN_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //NVIC_InitTypeDef NVIC_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN GPIOs configuration **************************************************/ /* Connect CAN pins to AF7 */ GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT); GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT); /* Configure CAN RX and TX pins */ 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); /* NVIC configuration *******************************************************/ nvicEnableVector(STM32_CAN1_RX0_NUMBER, CORTEX_PRIORITY_MASK(STM32_CAN_CAN1_IRQ_PRIORITY)); /* CAN configuration ********************************************************/ /* Enable CAN clock */ rccEnableAPB1(RCC_APB1ENR_CAN1EN, 2); //alamat header --> os/hal/platforms/ /* CAN register init */ //CAN_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 = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */ CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 2; CAN_Init(CANx, &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); /*TxMessage.StdId = 0x111; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage2.StdId = 0x222; TxMessage2.RTR = CAN_RTR_DATA; TxMessage2.IDE = CAN_ID_STD; TxMessage2.DLC = 8; TxMessage3.StdId = 0x333; TxMessage3.RTR = CAN_RTR_DATA; TxMessage3.IDE = CAN_ID_STD; TxMessage3.DLC = 8; TxMessage3.StdId = 0x444; TxMessage3.RTR = CAN_RTR_DATA; TxMessage3.IDE = CAN_ID_STD; TxMessage3.DLC = 8; */ /* Mengaktifkan FIFO 0 message pending Interrupt */ CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE); }
/** * @brief Configures the CAN, transmit and receive using interrupt. * @param None * @retval PASSED if the reception is well done, FAILED in other case */ TestStatus CAN_Interrupt(void) { CAN_InitTypeDef sCAN; CAN_TxMsgTypeDef TxMsg; uint32_t i = 0; /* Set the HCLK division factor = 1 for CAN1*/ CAN_BRGInit(MDR_CAN1,CAN_HCLKdiv1); /* CAN register init */ CAN_DeInit(MDR_CAN1); /* CAN cell init */ CAN_StructInit (&sCAN); sCAN.CAN_ROP = ENABLE; sCAN.CAN_SAP = ENABLE; sCAN.CAN_STM = ENABLE; sCAN.CAN_ROM = DISABLE; sCAN.CAN_PSEG = CAN_PSEG_Mul_2TQ; sCAN.CAN_SEG1 = CAN_SEG1_Mul_3TQ; sCAN.CAN_SEG2 = CAN_SEG2_Mul_2TQ; sCAN.CAN_SJW = CAN_SJW_Mul_2TQ; sCAN.CAN_SB = CAN_SB_3_SAMPLE; sCAN.CAN_BRP = 1; CAN_Init (MDR_CAN1,&sCAN); CAN_Cmd(MDR_CAN1, ENABLE); /* Enable CAN1 interrupt */ NVIC_EnableIRQ(CAN1_IRQn); /* Enable CAN1 GLB_INT and RX_INT interrupts */ CAN_ITConfig( MDR_CAN1, CAN_IT_GLBINTEN | CAN_IT_RXINTEN, ENABLE); /* Enable CAN1 interrupt from receive buffer */ CAN_RxITConfig( MDR_CAN1 ,(1<<rx_buf), ENABLE); /* Enable CAN1 interrupt from transmit buffer */ CAN_TxITConfig( MDR_CAN1 ,(1<<tx_buf), ENABLE); /* receive buffer enable */ CAN_Receive(MDR_CAN1, rx_buf, DISABLE); /* transmit */ TxMsg.IDE = CAN_ID_EXT; TxMsg.DLC = 0x04; TxMsg.PRIOR_0 = DISABLE; TxMsg.ID = 0x15555555; TxMsg.Data[1] = 0; TxMsg.Data[0] = 0x12345678; CAN_Transmit(MDR_CAN1, tx_buf, &TxMsg); /* initialize the value that will be returned */ ret = 0xFF; /* receive message with interrupt handling */ i=0; while((ret == 0xFF) && (i < 0xFFF)) { i++; } if (i == 0xFFF) { ret=0; } /* disable interrupt handling */ CAN_ITConfig(MDR_CAN1, CAN_IT_GLBINTEN | CAN_IT_RXINTEN, DISABLE); return (TestStatus)ret; }
void can_init() { RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE); // Configure CAN pins GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 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); CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN register init */ CAN_DeInit(CAN1); CAN_StructInit(&CAN_InitStructure); /* 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 = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; /* CAN Baudrate = 125KBps*/ CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_2tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; CAN_InitStructure.CAN_Prescaler = 48; 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); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); }
EXPORT Std_ReturnType Can_Hw_InitController(uint8 controller,const Can_ControllerConfigType* config) { CAN_HW_t *canHw; uint8_t tq; uint8_t tqSync; uint8_t tq1; uint8_t tq2; uint32_t clock; Can_UnitType *canUnit; uint8 cId = controller; const Can_ControllerConfigType *canHwConfig; const Can_HardwareObjectType *hohObj; canUnit = CAN_GET_PRIVATE_DATA(controller); canHw = GetController(cId); canHwConfig = CAN_GET_CONTROLLER_CONFIG(Can_Global.channelMap[cId]); // Start this baby up CAN_DeInit(canHw); /* CAN filter init. We set up two filters - one for the master (CAN1) and * one for the slave (CAN2) * * CAN_SlaveStartBank(n) denotes which filter is the first of the slave. * * The filter registers reside in CAN1 and is shared to CAN2, so we only need * to set up this once. */ // We let all frames in and do the filtering in software. CAN_FilterInitTypeDef CAN_FilterInitStructure; 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=CAN_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; // Init filter 0 (CAN1/master) CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInit(&CAN_FilterInitStructure); // Init filter 1 (CAN2/slave) CAN_FilterInitStructure.CAN_FilterNumber=1; CAN_FilterInit(&CAN_FilterInitStructure); // Set which filter to use for CAN2. CAN_SlaveStartBank(1); // acceptance filters hohObj = canHwConfig->Can_Hoh; --hohObj; do { ++hohObj; if (hohObj->CanObjectType == CAN_OBJECT_TYPE_RECEIVE) { // TODO Hw filtering } }while( !hohObj->Can_EOL ); // Clock calucation // ------------------------------------------------------------------- // // * 1 TQ = Sclk period( also called SCK ) // * Ftq = Fcanclk / ( PRESDIV + 1 ) = Sclk // ( Fcanclk can come from crystal or from the peripheral dividers ) // // --> // TQ = 1/Ftq = (PRESDIV+1)/Fcanclk --> PRESDIV = (TQ * Fcanclk - 1 ) // TQ is between 8 and 25 clock = McuE_GetSystemClock()/2; tqSync = config->CanControllerPropSeg + 1; tq1 = config->CanControllerSeg1 + 1; tq2 = config->CanControllerSeg2 + 1; tq = tqSync + tq1 + tq2; CAN_InitTypeDef CAN_InitStructure; CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=ENABLE; CAN_InitStructure.CAN_AWUM=ENABLE; CAN_InitStructure.CAN_NART=DISABLE; CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; if(config->Can_Loopback){ CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; }else{ CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; } CAN_InitStructure.CAN_SJW=config->CanControllerPropSeg; CAN_InitStructure.CAN_BS1=config->CanControllerSeg1; CAN_InitStructure.CAN_BS2=config->CanControllerSeg2; CAN_InitStructure.CAN_Prescaler= clock/(config->CanControllerBaudRate*1000*tq); if(CANINITOK != CAN_Init(canHw,&CAN_InitStructure)) { return E_NOT_OK; } canUnit->state = CANIF_CS_STOPPED; Can_EnableControllerInterrupts(cId); return E_OK; }
void can_hw_init(void) { GPIO_InitTypeDef gpio; NVIC_InitTypeDef nvic; CAN_InitTypeDef can; CAN_FilterInitTypeDef can_filter; /* Enable peripheral clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* Configure CAN pin: RX */ gpio.GPIO_Pin = GPIO_Pin_11; gpio.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &gpio); /* Configure CAN pin: TX */ gpio.GPIO_Pin = GPIO_Pin_12; gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio); /* NVIC configuration */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); nvic.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 0x00; nvic.NVIC_IRQChannelSubPriority = 0x00; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); /* CAN register init */ CAN_DeInit(CAN1); CAN_StructInit(&can); /* CAN cell init */ can.CAN_TTCM = DISABLE; can.CAN_ABOM = CAN_ERR_RESUME; can.CAN_AWUM = DISABLE; can.CAN_NART = DISABLE; can.CAN_RFLM = DISABLE; can.CAN_TXFP = DISABLE; can.CAN_Mode = CAN_Mode_Normal; can.CAN_SJW = CAN_SJW_TQ; can.CAN_BS1 = CAN_BS1_TQ; can.CAN_BS2 = CAN_BS2_TQ; can.CAN_Prescaler = CAN_PRESCALER; can.CAN_ABOM = ENABLE; CAN_Init(CAN1, &can); /* CAN filter init */ can_filter.CAN_FilterNumber = 0; can_filter.CAN_FilterMode = CAN_FilterMode_IdMask; can_filter.CAN_FilterScale = CAN_FilterScale_32bit; can_filter.CAN_FilterIdHigh = 0x0000; can_filter.CAN_FilterIdLow = 0x0000; can_filter.CAN_FilterMaskIdHigh = 0x0000; can_filter.CAN_FilterMaskIdLow = 0x0000; can_filter.CAN_FilterFIFOAssignment = 0; can_filter.CAN_FilterActivation = ENABLE; CAN_FilterInit(&can_filter); /* transmit struct init */ can_tx_msg.StdId = 0x0; can_tx_msg.ExtId = 0x0; can_tx_msg.RTR = CAN_RTR_DATA; #ifdef USE_CAN_EXT_ID can_tx_msg.IDE = CAN_ID_EXT; #else can_tx_msg.IDE = CAN_ID_STD; #endif can_tx_msg.DLC = 1; CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); }
void CAN_App_Init(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; NVIC_InitTypeDef NVIC_InitStructure; CANGPIO_Configuration(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* CAN register init */ CAN_DeInit(CAN1); 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=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; //----- Debug use--- #if 1 // 生产测试用 CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=100;//20K 42MHZ 42/(1+bs1+bs2)/prescaler #else // ----- 北斗扩展信息 ---------- switch(BD_EXT.CAN_1_Mode&0x60000000) //mode { case 0x20000000: CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;break; case 0x40000000: CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;break; case 0x60000000: CAN_InitStructure.CAN_Mode=CAN_Mode_Silent;break; } switch(BD_EXT.CAN_1_Mode&0x0000FFFF) // CAN Baud { /* 5k 10k 20k 50k 125k 250k 500k --default 20k 42MHZ max */ case 5: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=400;//5K 42/(1+bs1+bs2)/prescaler break; case 10: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=200;//10K 42/(1+bs1+bs2)/prescaler break; case 20: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=100;//20K 42/(1+bs1+bs2)/prescaler break; case 50: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=40;//50K 42/(1+bs1+bs2)/prescaler break; case 125: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=16;//125K 42/(1+bs1+bs2)/prescaler break; case 250: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=8;//250K 42/(1+bs1+bs2)/prescaler break; case 500: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=4;//500K 42/(1+bs1+bs2)/prescaler break; default: return; } #endif 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); //----------------------------- /* Enable CAN1 RX0 interrupt IRQ channel */ NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); }
void CAN_Configuration(void) { /* CAN1 Periph clock enable */ CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN register init */ CAN_DeInit(CAN1); CAN_DeInit(CAN2); 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 = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = 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 = 16;//2 4=1m 8=500k CAN_Init(CAN1, &CAN_InitStructure); CAN_Init(CAN2, &CAN_InitStructure); /* CAN filter init */ 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_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInit(&CAN_FilterInitStructure); CAN_FilterInitStructure.CAN_FilterNumber=14; CAN_FilterInit(&CAN_FilterInitStructure); GPIO_InitTypeDef GPIO_InitStructure; /* Configure CAN1 pin: RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure CAN1 pin: TX */ 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); /* Configure CAN pin: RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure CAN pin: TX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); }