首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 CAN通信 滤波器配置总结(4)

STM32 CAN通信 滤波器配置总结(4)

/*CAN 发送函数*/
unsigned char CAN1_SendData(void)
{
    uint16 i;
CanTxMsg TxMessage;

unsigned char TransmitMailbox;
TxMessage.StdId=0x11;
//标准标识符
TxMessage.RTR=CAN_RTR_DATA; //数据帧
TxMessage.IDE=CAN_ID_STD; //标准帧
TxMessage.DLC=2;
//数据长度 2
TxMessage.Data[0]=0xCA;
//发送的数据
TxMessage.Data[1]=0xFE;
TransmitMailbox=CAN_Transmit(CAN1,&TxMessage); //发送数据
    i = 0xFFF;
do
{
    _NOP_(5);
}

while((CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK) && (--i));

if(i <= 0x01)

return 0;

else

return 1;
}
/*中断服务函数*/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

}
三、滤波器配置详细如下:
1、对扩展数据帧进行过滤只接收扩展数据帧)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xFFFF0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;
(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)
2、对扩展远程帧过滤只接收扩展远程帧)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xFFFF0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;3、对标准远程帧过滤只接收标准远程帧)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;
4、对标准数据帧过滤只接收标准数据帧)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;5、对扩展帧进行过滤扩展帧不会被过滤掉)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xFFFF0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC;
6、对标准帧进行过滤标准帧不会被过滤掉)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD)&0xffff;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC;
注:slave_id为要过滤的id号。其中我们可以开启can错误中断,设置响应的标志位,在大循环里面不断的检测是否错误,一旦错误就重新配置can,这样有效地保证了CAN的正常通信。具体操作代码如下:
(u32)slave_id<<3)官方提供的库函数的CAN发送函数在发送过程中左移了3位,然后接受的时候又右移了三位复原。而过滤过程在这两者之间,所以需要左移三位,才能正确过滤。
接受报文的格式就是你发送报文的格式啊。有标准标识符和扩展标识符两种,然后数据最大是八个字节。
/*CAN错误中断服务函数*/
void CAN1_SCE_IRQHandler(void)
{
CANWorkFlag &= ~CAN_RESET_COMPLETE;
}
/*CAN错误处理函数*/
/************************************************************************
*函数名称:  CanErrorProcess
*功能:      CAN故障,错误处理
*参数说明:  无
************************************************************************/
void CanErrorProcess(void)
{
if ((CANWorkFlag & CAN_RESET_COMPLETE) == 0)
{
  CAN1_Configuration();
//  CAN2_Configuration();

CANWorkFlag |= CAN_RESET_COMPLETE;
}

// if((CANWorkFlag & CAN2_RESET_COMPLETE) == 0)
// {
//  CAN1_Configuration();
//  CAN2_Configuration();
//  CANWorkFlag |= CAN2_RESET_COMPLETE;
// }
}
/*错误标志的定义*/
extern uint8 CANWorkFlag;
/************************************************************************
*  CANWorkFlag 标志位掩码定义
************************************************************************/
#define       CAN_INIT_COMPLETE            0x80
//CAN初始化完成标志
//#define       CAN_BUS_ERROR                0x40   //CAN总线错误标志
#define       CAN_RESET_COMPLETE           0x40
//CAN控制器复位完成标志
#define       CAN2_INIT_COMPLETE            0x20   //CAN2初始化完成标志
//#define       CAN_BUS_ERROR                0x40   //CAN总线错误标志
#define       CAN2_RESET_COMPLETE           0x10
//CAN2控制器复位完成标位
继承事业,薪火相传
返回列表