OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2806|回复: 3

关于STM32 CAN通信的几点疑问

[复制链接]

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
发表于 2018-2-28 19:03:05 | 显示全部楼层 |阅读模式
10金钱
这两天在看战舰的CAN实验,有几点疑问请教下大家,谢谢。
1.我在原子哥的例程上做了点修改,原子哥的例程上设置滤波器屏蔽都是0,也就是不屏蔽:         

          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
然后我想尝试下滤波功能,因为回环模式的时候是标准格式,ID设置为0x12,程序如下:[mw_shl_code=c,true]//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)
//len:数据长度(最大为8)                                     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//                 其他,失败;
u8 Can_Send_Msg(u8* msg,u8 len)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12;                                         // 标准标识符为0
  TxMessage.ExtId=0x12;                                 // 设置扩展标示符(29位)
  TxMessage.IDE=0;                         // 使用扩展标识符
  TxMessage.RTR=0;                 // 消息类型为数据帧,一帧8位
  TxMessage.DLC=len;                                                         // 发送两帧信息
  for(i=0;i<len;i++)
  TxMessage.Data=msg;                                 // 第一帧信息         
  mbox= CAN_Transmit(CAN1, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //等待发送结束
  if(i>=0XFFF)return 1;
  return 0;               

}[/mw_shl_code]那么我在接收的时候只接收ID为0x12的,修改如下:
[mw_shl_code=applescript,true]         CAN_FilterInitStructure.CAN_FilterNumber=0;          //过滤器0
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
          CAN_FilterInitStructure.CAN_FilterIdHigh=(0x1200>>2);////32位ID---------------只接收ID为0x12的
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffc0;//32位MASK
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0[/mw_shl_code]
实际实验的时候,发现回环模式下接收不到数据,请教这个是什么原因,谢谢。


2.关于波特率计算,教程上写到:
//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1);
//则波特率为:36M/((1+8+7)*5)=450Kbps


          CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
          CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~        CAN_BS2_8tq
          CAN_InitStructure.CAN_Prescaler=brp;            //分频系数(Fdiv)为brp+1        //


        CAN_Init实际操作的时候是    /* Set the bit timing register */
    CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | \
                ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | \
                ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | \
                ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | \
               ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1);
这边BS1和BS2是直接赋值给寄存器,而Prescaler是减去了1,即三者分别写入寄存器为8,7,4。在计算时候是不是应该都要加1,即36M/((1+9+8)*5)?




1122.png

最佳答案

查看完整内容[请看2#楼]

你值得拥有! http://www.openedv.com/forum.php?mod=viewthread&tid=10328
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

409

帖子

0

精华

高级会员

Rank: 4

积分
854
金钱
854
注册时间
2017-2-25
在线时间
145 小时
发表于 2018-2-28 19:03:06 | 显示全部楼层
善良的二哥 发表于 2018-2-28 19:08
不好意思,刚刚才发现第一个问题时我搞错了,CAN_FilterInitStructure.CAN_FilterIdHigh=(0x1200>>2);这边 ...

你值得拥有!
http://www.openedv.com/forum.php?mod=viewthread&tid=10328
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2018-2-28 19:08:06 | 显示全部楼层
不好意思,刚刚才发现第一个问题时我搞错了,CAN_FilterInitStructure.CAN_FilterIdHigh=(0x1200>>2);这边应该改成CAN_FilterInitStructure.CAN_FilterIdHigh=(0x1200>>3);。
另外想请教下,采用这种滤波方式,是不是硬件上就完成了阻挡,软件我们就不用做任何处理了?
回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-3-1 06:47:05 | 显示全部楼层
楼上正解!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 17:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表