#include "can.h" #include "delay.h" #include "SWM341.h" // Device header CAN_RXMessage canrx0,cantx0; uint8_t CAN0_error=0; uint8_t CAN0_FrameReceiveFlag=0,CAN0_FrameSendFlag=0; void CAN0_Init(void) { CAN_InitStructure CAN_initStruct; 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(CAN0, &CAN_initStruct); CAN_SetFilter32b(CAN0, CAN_FILTER_1, 0xFFFFFFFF, 0x00000000); //接收ID为任意值的帧 // 0 匹配,1 不管 // CAN_SetFilter32b(CAN0, CAN_FILTER_1, 0x00122122, 0x1FFFFFFE); //接收ID为0x00122122、0x00122123的扩展包 CAN_SetFilter16b(CAN0, CAN_FILTER_2, 0x122, 0x7FE, 0x101, 0x7FF); //接收ID为0x122、123、0x101的标准包 NVIC_SetPriority(CAN0_IRQn, 5); CAN_Open(CAN0); } int CAN0_SendMsg(CAN_RXMessage msg) { while(CAN_TXBufferReady(CAN0) == 0){DelayMs(1);} //单次发送 // CAN_Transmit(CAN, CAN_FRAME_EXT, msg.id, msg.data, msg.size, 1); // while(CAN_TXComplete(CAN) == 0){DelayMs(1);} //多次重发 CAN0_error=0; CAN_Transmit(CAN0, CAN_FRAME_EXT, msg.id, msg.data, msg.size, 0); for(uint16_t i=0; CAN_TXComplete(CAN0)==0; i++) {if(i>100){CAN_AbortTransmit(CAN0);CAN0_error=1;}DelayMs(1);}//超时,终止发送 return CAN_TXSuccess(CAN0); } void CAN0_Handler(void) { uint32_t int_sr = CAN_INTStat(CAN0);if(int_sr & CAN_IF_RXDA_Msk){CAN_Receive(CAN0, &canrx0);CAN0_FrameReceiveFlag=1;} } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CAN_RXMessage canrx1,cantx1; uint8_t CAN1_error=0; uint8_t CAN1_FrameReceiveFlag=0,CAN1_FrameSendFlag=0; void CAN1_Init(void) { CAN_InitStructure CAN_initStruct; PORT_Init(PORTM, PIN1 , PORTM_PIN1_CAN1_RX, 1); //GPIOM.1 配置为 CAN1 输入引脚 PORT_Init(PORTM, PIN0 , PORTM_PIN0_CAN1_TX, 0); //GPIOM.0 配置为 CAN1 输出引脚 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(CAN1, &CAN_initStruct); CAN_SetFilter32b(CAN1, CAN_FILTER_1, 0xFFFFFFFF, 0x00000000); //接收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的标准包 NVIC_SetPriority(CAN1_IRQn, 6); CAN_Open(CAN1); } int CAN1_SendMsg(CAN_RXMessage msg) { while(CAN_TXBufferReady(CAN1) == 0){DelayMs(1);} //单次发送 // CAN_Transmit(CAN1, CAN_FRAME_EXT, msg.id, msg.data, msg.size, 1); // while(CAN_TXComplete(CAN1) == 0){DelayMs(1);} //多次重发 CAN1_error=0; CAN_Transmit(CAN1, CAN_FRAME_EXT, msg.id, msg.data, msg.size, 0); for(uint16_t i=0; CAN_TXComplete(CAN1)==0; i++) {if(i>100){CAN_AbortTransmit(CAN1);CAN1_error=1;}DelayMs(1);}//超时,终止发送 return CAN_TXSuccess(CAN1); } void CAN1_Handler(void) { uint32_t int_sr = CAN_INTStat(CAN1); if(int_sr & CAN_IF_RXDA_Msk) { CAN_Receive(CAN1, &canrx1); CAN1_FrameReceiveFlag=1; } } void InitCAN(void) { CAN0_Init(); CAN1_Init(); } void can_test(int i) { uint8_t tx_data[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; if((i%500)==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发出波形 } if(CAN0_FrameReceiveFlag) { if(canrx0.size > 0) { printf("\r\nReceive %s: %08X, ", canrx0.format == CAN_FRAME_STD ? "STD" : "EXT", canrx0.id); for(int i = 0; i < canrx0.size; i++) printf("%02X, ", canrx0.data[i]); } else if(canrx0.remote == 1) //远程帧 { printf("\r\nReceive %s Remote Request", canrx0.format == CAN_FRAME_STD ? "STD" : "EXT"); } CAN0_FrameReceiveFlag=0; } if(CAN1_FrameReceiveFlag) { if(canrx1.size > 0) { printf("\r\nReceive %s: %08X, ", canrx1.format == CAN_FRAME_STD ? "STD" : "EXT", canrx1.id); for(int i = 0; i < canrx1.size; i++) printf("%02X, ", canrx1.data[i]); } else if(canrx1.remote == 1) //远程帧 { printf("\r\nReceive %s Remote Request", canrx1.format == CAN_FRAME_STD ? "STD" : "EXT"); } CAN1_FrameReceiveFlag=0; } }