#include "config.h" INT8U CAN_TX_Cnt, CAN_RX_Cnt; CanRxMsg CAN_RX_Buffer[CAN_RX_BUFF_Size]; CanTxMsg CAN_TX_Buffer[CAN_TX_BUFF_Size]; void CAN1_Init(void) { CAN_GPIO_Init(); CAN_NVIC_Init(); CAN_STBY_Init(); //CAN1_Polling(); //环回测试 CAN1_InterruptMode(); //初始化为中断模式 } INT8U CAN1_Polling(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage; CanRxMsg RxMessage; INT32U i = 0; INT8U TransmitMailbox = 0; /* CAN register init */ CAN_DeInit(CAN); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; // 时间触发通信禁止 CAN_InitStructure.CAN_ABOM = ENABLE; // 离线退出是在中断置位清0后退出 CAN_InitStructure.CAN_AWUM = DISABLE; // 自动唤醒模式:清零sleep CAN_InitStructure.CAN_NART = DISABLE; // 自动重新传送豹纹,知道发送成功 CAN_InitStructure.CAN_RFLM = DISABLE; // FIFO没有锁定,新报文覆盖旧报文 CAN_InitStructure.CAN_TXFP = DISABLE; // 发送报文优先级确定:标志符 CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack; // 回环模式 CAN_InitStructure.CAN_SJW = CAN_SJW_2tq; // 1tq、BS1、BS2的值跟波特率有关 CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler = 4; // 分频系数为5 CAN_Init(CAN, &CAN_InitStructure); // 初始化CAN1 /* 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; // 设定标准标识符(11位,扩展的为29位) TxMessage.RTR = CAN_RTR_Data; // 传输消息的帧类型为数据帧(还有远程帧) TxMessage.IDE = CAN_Id_Extended; // 消息标志符实验标准标识符 TxMessage.DLC = 8; // 发送两帧,一帧8位 TxMessage.Data[0] = 'H'; // 第1帧数据 TxMessage.Data[1] = 'A'; // 第2帧数据 TxMessage.Data[2] = 'I'; // 第3帧数据 TxMessage.Data[3] = 'F'; // 第4帧数据 TxMessage.Data[4] = 'E'; // 第5帧数据 TxMessage.Data[5] = 'N'; // 第6帧数据 TxMessage.Data[6] = 'G'; // 第7帧数据 TxMessage.Data[7] = ' '; // 第8帧数据 TransmitMailbox = CAN_Transmit(CAN, &TxMessage); i = 0; // 用于检查消息传输是否正常 while ((CAN_TransmitStatus(CAN, TransmitMailbox) != CANTXOK) && (i != 0xFF)) { i++; } i = 0; // 检查返回的挂号的信息数目 while ((CAN_MessagePending(CAN, CAN_FIFO0) < 1) && (i != 0xFF)) { i++; } /* receive */ RxMessage.StdId = 0x11; RxMessage.IDE = 0; RxMessage.DLC = 0; RxMessage.Data[0] = 0x00; RxMessage.Data[1] = 0x00; RxMessage.Data[2] = 0x00; RxMessage.Data[3] = 0x00; RxMessage.Data[4] = 0x00; RxMessage.Data[5] = 0x00; RxMessage.Data[6] = 0x00; RxMessage.Data[7] = 0x00; CAN_Receive(CAN, CAN_FIFO0, &RxMessage); if (RxMessage.StdId != 0x11) { return (0x80); } if (RxMessage.IDE != CAN_Id_Extended) { return (0x81); } if (RxMessage.DLC != 8) { return (0x82); } /* 判断发送的信息和接收的信息是否相等 */ if ((RxMessage.Data[0] != 'H') && \ (RxMessage.Data[1] != 'A') && \ (RxMessage.Data[2] != 'I') && \ (RxMessage.Data[3] != 'F') && \ (RxMessage.Data[4] != 'E') && \ (RxMessage.Data[5] != 'N') && \ (RxMessage.Data[6] != 'G') && \ (RxMessage.Data[7] != ' ')) { return (0x83); } return (1); /* Test Passed */ } void CAN1_InterruptMode(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN register init */ CAN_DeInit(CAN); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; // 时间触发通信禁止 CAN_InitStructure.CAN_ABOM = ENABLE; // 离线退出是在中断置位清0后退出 CAN_InitStructure.CAN_AWUM = DISABLE; // 自动唤醒模式:清零sleep CAN_InitStructure.CAN_NART = DISABLE; // 自动重新传送豹纹,知道发送成功 CAN_InitStructure.CAN_RFLM = DISABLE; // FIFO没有锁定,新报文覆盖旧报文 CAN_InitStructure.CAN_TXFP = DISABLE; // 发送报文优先级确定:标志符 CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; // 正常模式 CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; // 1tq、BS1、BS2的值跟波特率有关 CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler = 4; // 分频系数为1 CAN_Init(CAN, &CAN_InitStructure); // 初始化CAN1 /* 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(CAN, CAN_IT_FMP0, ENABLE); //中断使能 } void CAN1_WriteTxBuffer(INT8U *ptr, INT32U Len, INT32U StdID, INT32U ExtID) { INT8U NumOfPake, NumOfSingle; NumOfPake = Len / 8; NumOfSingle = Len % 8; while (NumOfPake--) { CAN_TX_Buffer[CAN_TX_Cnt].StdId = StdID; // 标准标识符为0 CAN_TX_Buffer[CAN_TX_Cnt].ExtId = ExtID; // 设置扩展标示符(29位) CAN_TX_Buffer[CAN_TX_Cnt].IDE = CAN_ID_EXT; // 使用扩展标识符 CAN_TX_Buffer[CAN_TX_Cnt].RTR = CAN_RTR_DATA; // 消息类型为数据帧,一帧8位 CAN_TX_Buffer[CAN_TX_Cnt].DLC = 8; MEM_Copy(ptr, (INT8U *) & ((CAN_TX_Buffer[CAN_TX_Cnt]).Data[0]), 8); //复制8字节数据 ptr += 8; CAN_TX_Cnt++; } if (NumOfSingle != 0) { CAN_TX_Buffer[CAN_TX_Cnt].StdId = StdID; // 标准标识符为0 CAN_TX_Buffer[CAN_TX_Cnt].ExtId = ExtID; // 设置扩展标示符(29位) CAN_TX_Buffer[CAN_TX_Cnt].IDE = CAN_ID_EXT; // 使用扩展标识符 CAN_TX_Buffer[CAN_TX_Cnt].RTR = CAN_RTR_DATA; // 消息类型为数据帧,一帧8位 CAN_TX_Buffer[CAN_TX_Cnt].DLC = NumOfSingle; MEM_Copy(ptr, (INT8U *) & ((CAN_TX_Buffer[CAN_TX_Cnt]).Data[0]), NumOfSingle); //复制剩下的数据 CAN_TX_Cnt++; } } void CAN1_Transmit(void) { if (CAN_TX_Cnt > 0) { CAN_TX_Cnt--; CAN_Transmit(CAN, &CAN_TX_Buffer[CAN_TX_Cnt]); } } void CEC_CAN_IRQHandler(void) { if (CAN_GetITStatus(CAN, CAN_IT_FMP0) == SET) { CAN_Receive(CAN, CAN_FIFO0, &CAN_RX_Buffer[CAN_RX_Cnt]); CAN_FIFORelease(CAN, CAN_FIFO0); CAN_ClearITPendingBit(CAN, CAN_IT_FMP0); if (CAN_RX_Cnt > CAN_RX_BUFF_Size) { CAN_RX_Cnt = 0; } else { CAN_RX_Cnt++; } CAN_IAP_AppUpdata(); //IAP升级程序 CAN_RX_Cnt = 0; } }