#include "can.h" #include "delay.h" #define FILTER_CHECK 0xFFFFFFFF #define FILTER_MASK 0x00000000 uint8_t CAN_FrameReceiveFlag[CAN_CHANNEL] = {0}; uint8_t CAN0_FrameSendFlag[CAN_CHANNEL] = {0}; CAN_RXMessage canrx0[CAN_CHANNEL], cantx0[CAN_CHANNEL]; uint8_t CAN_error[CAN_CHANNEL] = {0}; void _CAN_Init(CAN_TypeDef *CAN_PORT) { CAN_InitStructure CAN_initStruct; if(CAN_PORT==CAN1) { PORT_Init(PORTM, PIN1 , PORTM_PIN1_CAN1_RX, 1); //GPIOM.1 配置为 CAN1 输入引脚 PORT_Init(PORTM, PIN0 , PORTM_PIN0_CAN1_TX, 0); //GPIOM.0 配置为 CAN1 输出引脚 } if(CAN_PORT==CAN0) { PORT_Init(PORTA, PIN9 , PORTA_PIN9_CAN0_RX , 1); //GPIOA.9 配置为 CAN0 输入引脚 PORT_Init(PORTA, PIN10, PORTA_PIN10_CAN0_TX, 0); //GPIOA.10 配置为 CAN0 输出引脚 } CAN_initStruct.Mode = CAN_MODE_NORMAL; CAN_initStruct.CAN_bs1 = CAN_BS1_5tq; CAN_initStruct.CAN_bs2 = CAN_BS2_4tq; CAN_initStruct.CAN_sjw = CAN_SJW_2tq; CAN_initStruct.Baudrate = CAN_BPS; CAN_initStruct.RXNotEmptyIEn = 1; CAN_initStruct.ArbitrLostIEn = 0; CAN_initStruct.ErrPassiveIEn = 0; CAN_Init(CAN_PORT, &CAN_initStruct); CAN_SetFilter32b(CAN_PORT, CAN_FILTER_1, FILTER_CHECK, FILTER_MASK); //接收ID为任意值的帧 // 0 匹配,1 不管 // CAN_SetFilter32b(CAN1, CAN_FILTER_1, 0x00122122, 0x1FFFFFFE); //接收ID为0x00122122、0x00122123的扩展包 // CAN_SetFilter16b(CAN1, CAN_FILTER_2, 0x122, 0x7FE, 0x101, 0x7FF); //接收ID为0x122、123、0x101的标准包 if(CAN_PORT==CAN1) { NVIC_SetPriority(CAN1_IRQn, 6); } if(CAN_PORT==CAN0) { NVIC_SetPriority(CAN0_IRQn, 6); } CAN_Open(CAN_PORT); } int CAN_SendMsg(CAN_TypeDef *CAN_PORT,CAN_RXMessage msg) { int Index = CAN_PORT==CAN0?0:1; while(CAN_TXBufferReady(CAN_PORT) == 0) { DelayUs(1); } //单次发送 // CAN_Transmit(CAN1, CAN_FRAME_EXT, msg.id, msg.data, msg.size, 1); // while(CAN_TXComplete(CAN1) == 0){DelayMs(1);} //多次重发 CAN_error[Index] = 0; CAN_Transmit(CAN_PORT, CAN_FRAME_EXT, msg.id, msg.data, msg.size, 0); for(uint16_t i = 0; CAN_TXComplete(CAN_PORT) == 0; i++) { if(i > 100) { CAN_AbortTransmit(CAN_PORT); CAN_error[Index] = 1; } DelayUs(10); }//超时,终止发送 int result = CAN_TXSuccess(CAN_PORT); return result; } void CAN_Handler(CAN_TypeDef *CAN_PORT) { int Index = CAN_PORT==CAN0?0:1; uint32_t int_sr = CAN_INTStat(CAN_PORT); if(int_sr & CAN_IF_RXDA_Msk) { CAN_Receive(CAN_PORT, &canrx0[Index]); CAN_FrameReceiveFlag[Index] = 1; } } void CAN0_Handler(void) { CAN_Handler(CAN0); } void CAN1_Handler(void) { CAN_Handler(CAN1); } void can_test(int j) { uint8_t tx_data[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; if((j % 50000) == 1) { CAN_Transmit(CAN0, CAN_FRAME_EXT, 0x178, tx_data, 8, 1); //方便调试,测量SWM341 CAN发出波形 CAN_Transmit(CAN1, CAN_FRAME_EXT, 0x188, tx_data, 8, 1); //方便调试,测量SWM341 CAN发出波形 } for(int i=0;i 0) { printf("\r\nReceive %s: %08X, ", canrx0[i].format == CAN_FRAME_STD ? "STD" : "EXT", canrx0[i].id); for(int i = 0; i < canrx0[i].size; i++) printf("%02X, ", canrx0[i].data[i]); } else if(canrx0[i].remote == 1) //远程帧 { printf("\r\nReceive %s Remote Request", canrx0[i].format == CAN_FRAME_STD ? "STD" : "EXT"); } CAN_FrameReceiveFlag[i] = 0; } } }