"can.c"
#include "stdio.h"
CAN_TxHeaderTypeDef mycan_tx;
CAN_RxHeaderTypeDef mycan_rx;
void CANFilter_Config(void) //滤波
{
CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterBank = 0; //CAN过滤器编号,范围0-27
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //CAN过滤器模式,掩码模式或列表模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //CAN过滤器尺度,16位或32位
sFilterConfig.FilterIdHigh = 0x000 << 5; //32位下,存储要过滤ID的高16位
sFilterConfig.FilterIdLow = 0x0000; //32位下,存储要过滤ID的低16位
sFilterConfig.FilterMaskIdHigh = 0x0000; //掩码模式下,存储的是掩码
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = 0; //报文通过过滤器的匹配后,存储到哪个FIFO
sFilterConfig.FilterActivation = ENABLE; //激活过滤器
sFilterConfig.SlaveStartFilterBank = 0;
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
{
Error_Handler();
}
}
void CAN_Send(uint8_t *pdata,uint8_t len) //发送
{
uint32_t TxMailbox = 0; //邮箱
mycan_tx.StdId = 0x666; //设置ID
mycan_tx.IDE = CAN_ID_STD; //设置ID类型
mycan_tx.RTR = CAN_RTR_DATA; //设置传送数据帧
mycan_tx.DLC = len; //设置数据长度
mycan_tx.TransmitGlobalTime = DISABLE; //不用时间戳
if(HAL_CAN_AddTxMessage(&hcan,&mycan_tx,pdata,&TxMailbox)!=HAL_OK)
{
printf("can_1_tx_Failed...\r\n");
Error_Handler();
}
printf("can_1_tx_OK!!!\r\n");
}
"main.c"
/*初始化,启动can*/
void can_start(void)
{
MX_CAN_Init();//参数初始化
filter_init();//滤波初始化
HAL_CAN_Start(&hcan);//启动
HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING);//使能中断
}
/*中断回调函数*/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if(hcan->Instance==CAN)
{
HAL_CAN_GetRxMessage(&hcan,CAN_FILTER_FIFO0,&rxheader1,msg);//获取数据
}
}
//开启can中断
if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
/* Notification Error */
Error_Handler();
}