CAN有接收邮箱和发送邮箱
”发送邮箱“是用于CAN总线数据发送的,总共有3个,并且存在优先级关系。优先级越高表示其里面的数据会被优先发送。数据在发送前都会被送到优先级最高且空闲的发送邮箱,然后依次发送。最后说明一点:“发送邮箱有3个,且每个邮箱只能装一个报文”。
”接收邮箱“是用于CAN总线数据接收用的,在接收数据端会有一个过滤器处于”接收邮箱“的前面,过滤器使用于删选”标识符“的,只有标识符符合的报文才会被放入到”接收邮箱“当中。注意:”接收邮箱不同于发送邮箱,接收邮箱只有2(FIFO0、FIFO1)个,但是每一个有三层,每层都可以存放一个报文,即每一个接收邮箱可以接收三个报文。但读取时只能读到最先收到的报文,等这个读完之后,才能读下一个报文”。
1.can 的pin设置
2.can初始化;
#define tx_mailbox 1 邮箱
#define rx_mailbox 0
#define rx_filter 0 筛选器不过滤
void can_init(void){
CAN_Init(&can_pal1_instance, &can_pal1_Config0);
// 接收结构体配置
can_buff_config_t can_buffrx_config={
.enableBRS =0,
.enableFD=0,
.fdPadding=0,
.idType = CAN_MSG_ID_STD,
.isRemote = 0,
};
//发送结构体配置
can_buff_config_t can_bufftx_config={
.enableBRS =0,
.enableFD=0,
.fdPadding=0,
.idType = CAN_MSG_ID_STD,
.isRemote = 0,
};
CAN_ConfigTxBuff(&can_pal1_instance,tx_mailbox,&can_bufftx_config);
CAN_ConfigRxBuff(&can_pal1_instance,rx_mailbox,&can_buffrx_config,rx_filter);
//设置筛选器接收ID的全局掩码设置
CAN_SetRxFilter(&can_pal1_instance,CAN_MSG_ID_STD,rx_mailbox,rx_filter);
//安装中断回调函数
CAN_InstallEventCallback(&can_pal1_instance,&can_callback,NULL);
}
//配置接收函数
void can_callback(uint32_t instance,can_event_t eventType,uint32_t buffIdx, void *flexcanState)
{
switch(eventType){
case CAN_EVENT_RX_COMPLETE:
break;
case CAN_EVENT_TX_COMPLETE:
break;
default:
break;
}
}
//发送函数
void can_send(uint32_t data,uint32_t id,uint8_t len){
can_message_t can_msg;
can_msg.cs = 0;
can_msg.data[0] =data;
can_msg.id= id;
can_msg.length=len; //字节
CAN_Send(&can_pal1_instance,tx_mailbox,&can_msg);
}
//接收函数
CAN_Receive(&can_pal1_instance,rx_mailbox,&can_msg);