https://blog.csdn.net/prolop87/article/details/122671441?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168135467916800192285929%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168135467916800192285929&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-122671441-null-null.142v83insert_down38,201v4add_ask,239v2insert_chatgpt&utm_term=cubemx%20can&spm=1018.2226.3001.4187
main.c
uint8_t Rx_Flag;
uint8_t Tx_Flag;
uint8_t RxBuf[8];
uint8_t TxBuf[8];
uint8_t key;
CAN_Filter_Init(); //设置CAN1过滤器
HAL_CAN_Start(&hcan1); //使能CAN功能
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING); // 使能中断
//if(Rx_Flag) //如果接收标志位被置1,则开展逻辑判断
// {
printf("Receive Succeed !\r\n");
//接收数据执行逻辑判断,根据判断结果设置发送内容
// if(RxBuf[2] == 0xAA && RxBuf[3] == 0xBB) TxBuf[2] = 0x01;
// else if(RxBuf[2] == 0xAA && RxBuf[3] == 0xCC) TxBuf[3] = 0x03;
// else if(RxBuf[2] == 0xAA && RxBuf[3] == 0xDD) TxBuf[4] = 0x05;
// else
TxBuf[0] = 0x1F, TxBuf[1] = 0x40, TxBuf[2] = 0x0F,TxBuf[3] = 0xA0, TxBuf[4] = 0x02,TxBuf[5] = 0xD0,TxBuf[6] = 0xD0;
Tx_Flag = CAN_Send_Msg(TxBuf,8); //发送数据,根据返回值判定发送是否异常
if(Tx_Flag) printf("Send failed ,please check your data !\r\n"); //返回1代表数据发送异常
else printf("Send completed !\r\n");
//
//清空接收、发送数组,保留Rxbuf内容
memset(RxData,0,sizeof(RxData));
memset(TxBuf,0,sizeof(TxBuf));
// HAL_Delay(50);
// Rx_Flag = 0; //标志位置0,等待下一次中断
// }
can.c
/*CAN过滤器初始化*/
void CAN_Filter_Init(void)
{
CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterBank = 0; /* 过滤器组0 */
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; /* 屏蔽位模式 */
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; /* 32位。*/
sFilterConfig.FilterIdHigh = (((uint32_t)CAN_RxExtId<<3)&0xFFFF0000)>>16; /* 要过滤的ID高位 */
sFilterConfig.FilterIdLow = (((uint32_t)CAN_RxExtId<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; /* 要过滤的ID低位 */
sFilterConfig.FilterMaskIdHigh = 0xFFFF; /* 过滤器高16位每位必须匹配 */
sFilterConfig.FilterMaskIdLow = 0xFFFF; /* 过滤器低16位每位必须匹配 */
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; /* 过滤器被关联到FIFO 0 */
sFilterConfig.FilterActivation = ENABLE; /* 使能过滤器 */
sFilterConfig.SlaveStartFilterBank = 14;
if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
{
/* Filter configuration Error */
Error_Handler();
}
if (HAL_CAN_Start(&hcan1) != HAL_OK)
{
/* Start Error */
Error_Handler();
}
/*##-4- Activate CAN RX notification #######################################*/
if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
/* Start Error */
Error_Handler();
}
TxHeader.ExtId=CAN_TxExtId; //扩展标识符(29位)
TxHeader.IDE=CAN_ID_EXT; //使用扩展帧
TxHeader.RTR=CAN_RTR_DATA; //数据帧
TxHeader.DLC=8;
TxHeader.TransmitGlobalTime = DISABLE;
}
/*CAN发送数据,入口参数为要发送的数组指针,数据长度,返回0代表发送数据无异常,返回1代表传输异常*/
uint8_t CAN_Send_Msg(uint8_t* msg,uint8_t len)
{
uint8_t i=0;
uint32_t TxMailbox;
uint8_t message[8];
TxHeader.ExtId=CAN_TxExtId; //扩展标识符(29位)
TxHeader.IDE=CAN_ID_EXT; //使用扩展帧
TxHeader.RTR=CAN_RTR_DATA; //数据帧
TxHeader.DLC=len;
for(i=0;i<len;i++)
{
message[i]=msg[i];
}
if(HAL_CAN_AddTxMessage(&hcan1, &TxHeader, message, &TxMailbox) != HAL_OK)//发送
{
return 1;
}
while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1) != 3) {}
return 0;
}
/*CAN接收中断函数*/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *CanNum)
{
uint32_t i;
Rx_Flag =1; //接收标志位
HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData);
for(i=0;i<RxHeader.DLC;i++) RxBuf[i]=RxData[i]; //用RxBuf转存RxData的数据
}
can.h
#define CAN_RxExtId 0x1800D8D0
#define CAN_TxExtId 0x1800D0D8
void CAN_Filter_Init(void); //过滤器配置函数
uint8_t CAN_Send_Msg(uint8_t* msg,uint8_t len); //数据发送函数
extern CAN_TxHeaderTypeDef TxHeader; //发送
extern CAN_RxHeaderTypeDef RxHeader; //接收
extern uint8_t RxData[8]; //数据接收数组