/******************************************************************************* * @file can.c * @author: MQjehovah mail:MQjehovah@hotmail.com * @version 1.0.0 * @date 2020.10.23 * @brief ****************************************************************************** * @attention *******************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "adc.h" /* Definition ----------------------------------------------------------------*/ extern short int Cur_ADC; extern short int Temp_ADC; /* Functions -----------------------------------------------------------------*/ /******************************************************************************* * @brief CAN1初始化 * @param None * @retval None * @note None *******************************************************************************/ void CAN1_Config(u16 bound) { u8 brp = 3000 / bound; GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; 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); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); //CAN单元设置 CAN_InitStructure.CAN_TTCM = DISABLE; //ENABLE:时间触发通信模式 DISABLE:非时间触发通信模式 CAN_InitStructure.CAN_ABOM = ENABLE; //软件自动离线管理 CAN_InitStructure.CAN_AWUM = DISABLE; //ENABLE:监测到can消息退出休眠模式 DISABLE:清除CAN->MCR的SLEEP位退出休眠模式 CAN_InitStructure.CAN_NART = DISABLE; //ENABLE:无论发送成功与否只法一次 DISABLE:发送不成功一直重发 CAN_InitStructure.CAN_RFLM = DISABLE; //ENABLE:FIFO溢出后丢弃后面的报文 DISABLE:溢出后新的覆盖旧的 CAN_InitStructure.CAN_TXFP = ENABLE; //ENABLE:优先级由请求顺序决定 DISABLE:优先级由报文标识符决定 CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //模式设置 CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //Tbs1范围CAN_BS1_1tq ~ CAN_BS1_16tq CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq CAN_InitStructure.CAN_Prescaler = brp; //分频系数(Fdiv)为brp+1 CAN_Init(CAN1, &CAN_InitStructure); //初始化CAN1 //配置过滤器 CAN_FilterInitStructure.CAN_FilterNumber = 0; //过滤器0 CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //标识符屏蔽位模式 CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //过滤器位宽32位 CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; //32位ID CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; //32位MASK CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //过滤器0关联到FIFO0 CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //激活过滤器0 CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化 // Motor_Cmd(Addr_Left,DISABLE); // Motor_Cmd(Addr_Right,DISABLE); // delay_ms(20);//CAN命令包发送完成 CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //FIFO0消息挂号中断允许. } /******************************************************************************* * @brief CAN1中断 * @param None * @retval None * @note 速度模式s顺时针n逆时针 定位模式S顺时针N逆时针 *******************************************************************************/ CanRxMsg BLcanbuf; FlagStatus BL_Deal_Flag = RESET; void USB_LP_CAN1_RX0_IRQHandler(void) { CanRxMsg RxMessagebuf; CAN_Receive(CAN1, CAN_FIFO0, &RxMessagebuf); // CanRx_TimeOut_Cnt = 3000; //500ms if (RxMessagebuf.StdId == 0x7df) { // if ((RxMessagebuf.Data[0] == 'S') || (RxMessagebuf.Data[0] == 'P') || (RxMessagebuf.Data[0] == 'X') || (RxMessagebuf.Data[0] == 'D')) // { // Com_No_T1 = RxMessagebuf.Data[7]; // if (Com_No_T1 != Com_No_OLD_T1) // { // if (RecDone_T1 == RESET) // RecDone_T1 = SET; // else // return; // memcpy(&uComRx_T1, RxMessagebuf.Data, 8); // Com_No_OLD_T1 = Com_No_T1; // } // else // { // if (Say_Hello_T1 == 0) // Say_Hello_T1 = 1; // else // return; // uComTx_T1.mode = RxMessagebuf.Data[0]; // } // } } } int CanTx_TimeOut_Cnt = 0; /********************************************************************** * Description : None * Input : None * Output : None * Return : None * Attention : None **********************************************************************/ u8 can_send_message(u8 index, u32 id, u8 dlc, u8 *data) { u8 mbox; CanTxMsg TxMessage; TxMessage.StdId = id; // 标准标识符 TxMessage.ExtId = id; // 设置扩展标示符 TxMessage.IDE = 0; // 标准帧 TxMessage.RTR = 0; // 数据帧 TxMessage.DLC = dlc; // 要发送的数据长度 CanTx_TimeOut_Cnt = 50; //25ms memcpy(TxMessage.Data, data, 8); do { mbox = CAN_Transmit(CAN1, &TxMessage); } while ((mbox == CAN_TxStatus_NoMailBox) && (CanTx_TimeOut_Cnt != 0)); while ((CAN_TransmitStatus(CAN1, mbox) != CAN_TxStatus_Ok) && (CanTx_TimeOut_Cnt != 0)) ; CanTx_TimeOut_Cnt = 0; return 1; } /*********************************END OF FILE**********************************/