123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /**
- ************************************************************************************************
- * @文件 : can.c
- * @作者 : 樊春春
- * @版本 : V1.0
- * @时间 : 2022/05/30 22:47:14
- * @邮箱 : [email protected]
- * @说明 : CAN初始化
- ************************************************************************************************
- **/
- #include "can.h"
- #include "fly_param.h"
- #include <string.h>
- CanRxMsg can1_recv_msg;
- CanRxMsg can2_recv_msg;
- CanData_TypeDef CanDataCan1; // CAN1数据
- CanData_TypeDef CanDataCan2; // CAN2数据
- void can_network_init(void)
- {
- CAN_InitTypeDef can_parameter;
- CAN_FilterInitTypeDef can_filter;
- CAN_StructInit(&can_parameter);
- CAN_FilterInit(&can_filter);
- /* initialize CAN register */
- CAN_DeInit(CAN1);
- CAN_DeInit(CAN2);
- /* initialize CAN parameters */
- can_parameter.CAN_TTCM = DISABLE;
- can_parameter.CAN_ABOM = DISABLE;
- can_parameter.CAN_AWUM = DISABLE;
- can_parameter.CAN_NART = DISABLE;
- can_parameter.CAN_RFLM = DISABLE;
- can_parameter.CAN_TXFP = DISABLE;
- can_parameter.CAN_Mode = CAN_Mode_Normal;
- can_parameter.CAN_SJW = CAN_SJW_1tq;
- can_parameter.CAN_BS1 = CAN_BS1_10tq; // CAN_BT_BS1_6TQ;
- can_parameter.CAN_BS2 = CAN_BS2_3tq; // CAN_BT_BS2_4TQ;
- /* 1MBps */
- #if CAN_BAUDRATE == 1000
- can_parameter.prescaler = 5;
- /* 500KBps */
- #elif CAN_BAUDRATE == 500
- can_parameter.prescaler = 10;
- /* 250KBps */
- #elif CAN_BAUDRATE == 250
- can_parameter.CAN_Prescaler = 12; // 24;//20;
- /* 125KBps */
- #elif CAN_BAUDRATE == 125
- can_parameter.prescaler = 40;
- /* 100KBps */
- #elif CAN_BAUDRATE == 100
- can_parameter.prescaler = 50;
- /* 50KBps */
- #elif CAN_BAUDRATE == 50
- can_parameter.prescaler = 100;
- /* 20KBps */
- #elif CAN_BAUDRATE == 20
- can_parameter.prescaler = 250;
- #else
- #error "please select list can baudrate in private defines in main.c "
- #endif
- /* initialize CAN */
- CAN_Init(CAN1, &can_parameter);
- CAN_Init(CAN2, &can_parameter);
- /* initialize filter */
- 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 = CAN_FIFO0;
- can_filter.CAN_FilterActivation = ENABLE;
- CAN_FilterInit(&can_filter);
- /* CAN1 filter number */
- can_filter.CAN_FilterNumber = 15;
- 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 = CAN_FIFO0;
- can_filter.CAN_FilterActivation = ENABLE;
- CAN_FilterInit(&can_filter);
- can_nvic_config();
- /* CAN FIFO0 消息接收中断使能 */
- CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
- /* CAN FIFO0 消息接收中断使能 */
- CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
- }
- void can_nvic_config(void)
- {
- /* configure CAN0 NVIC */
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- /* configure CAN1 NVIC */
- NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_Init(&NVIC_InitStructure);
- }
- /*!
- \brief this function handles CAN0 RX0 exception
- \param[in] none
- \param[out] none
- \retval none
- */
- void CAN1_RX0_IRQHandler(void)
- {
- /* check the receive message */
- CAN_Receive(CAN1, CAN_FIFO0, &can1_recv_msg);
- if ((can1_recv_msg.IDE == CAN_Id_Extended) && (CAN_MSG_LEN == can1_recv_msg.DLC))
- {
- memcpy(CanDataCan1.buf, can1_recv_msg.Data, CAN_MSG_LEN);
- CanDataCan1.can_id = can1_recv_msg.ExtId;
- InsertQueue(&CanQueueCan1, CanDataCan1);
- }
- OSSemPost(can1_sem);
- }
- /*!
- \brief this function handles CAN1 RX0 exception
- \param[in] none
- \param[out] none
- \retval none
- */
- void CAN2_RX0_IRQHandler(void)
- {
- /* check the receive message */
- CAN_Receive(CAN1, CAN_FIFO0, &can2_recv_msg);
- if (CAN_MSG_LEN == can2_recv_msg.DLC)
- {
- memcpy(CanDataCan2.buf, can2_recv_msg.Data, CAN_MSG_LEN);
- if (can2_recv_msg.IDE == CAN_Id_Extended)
- {
- CanDataCan2.can_id = can2_recv_msg.ExtId;
- }
- else
- {
- CanDataCan2.can_id = can2_recv_msg.StdId;
- }
- InsertQueue(&CanQueueCan2, CanDataCan2);
- }
- OSSemPost(can2_sem);
- }
|