你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32F303开发】(三) CAN通信之自发自收测试  

[复制链接]
风子 提问时间:2015-5-29 19:02 /
本帖最后由 风子 于 2015-5-29 19:04 编辑

CAN通信是STM32中比较复杂的东西之一,它的原理,协议之类的足以讲几本书,我也没能力把它讲清楚,但是在STM32中已经做好了底层,我们应用的时候只需要调用一些函数就可以,之前有位朋友也发了一个CAN通信的例子,讲得挺详细的,可以看看,本帖只是分享一下自己做自发自收实验的例子。

STM32 CAN通信的初始化主要分为两个部分,一个是CAN的初始化,一个是过滤器的初始化。自发自收只需要一个器件,在nucleo板子上就能完成,CAN的模式选择回环(Loopback)模式,如图,这种模式下发出的数据也会被CAN本身接收回来,我们只需要检查接收到的数据和发送的数据是否一样,就能测试发送是否成功。

QQ截图20150529153317.png


CAN_SJW;CAN_BS1;CAN_BS2;CAN_Prescaler这几个参数将决定波特率,假如PAB1的时钟是36M,这四个参数分别设置为1,9,8,16,则波特率为36M/16/(1+9+8)=125k。过滤器部分,由于只是测试,所以不需要特别的设置,选择屏蔽模式,其他参数写零或者保持默认就好。

代码如下:

  1. void CAN_Config(void)
  2. {
  3.         CAN_InitTypeDef CAN_InitStructure;
  4.         CAN_FilterInitTypeDef CAN_FilterInitStructure;

  5.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
  6.         CAN_DeInit(CAN1);
  7.         CAN_StructInit(&CAN_InitStructure);

  8.           CAN_InitStructure.CAN_TTCM = DISABLE;
  9.           CAN_InitStructure.CAN_ABOM = DISABLE;
  10.           CAN_InitStructure.CAN_AWUM = DISABLE;
  11.           CAN_InitStructure.CAN_NART = DISABLE;
  12.           CAN_InitStructure.CAN_RFLM = DISABLE;
  13.           CAN_InitStructure.CAN_TXFP = DISABLE;
  14.         CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;//回环模式
  15.         CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//1
  16.         CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;//9
  17.         CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;//8
  18.         CAN_InitStructure.CAN_Prescaler=16;//16分频
  19.         CAN_Init(CAN1,&CAN_InitStructure);

  20.         CAN_FilterInitStructure.CAN_FilterNumber=0;
  21.         CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//屏蔽模式
  22.         CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  23.           CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
  24.           CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
  25.           CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  26.           CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;  
  27.           CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0;
  28.           CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  29.           CAN_FilterInit(&CAN_FilterInitStructure);
  30. }
复制代码

然后进行发送和接收:

  1. {
  2.         CanTxMsg TXmessage;
  3.         CanRxMsg RXmessage;
  4.         uint8_t TxMailbox=0;
  5.         uint8_t ret=0;

  6.         CAN_Config();

  7.         TXmessage.StdId=0x123;//ID,标识符
  8.         TXmessage.IDE=CAN_ID_STD;//标准ID
  9.         TXmessage.RTR=CAN_RTR_DATA;//传送的是数据帧
  10.         TXmessage.DLC=3;//数据个数。不能超过8个
  11.         TXmessage.Data[0]=0x01;//传送的数据
  12.         TXmessage.Data[1]=0x10;
  13.         TXmessage.Data[2]=0xFF;
  14.         TxMailbox=CAN_Transmit(CAN1,&TXmessage);//发送,返回的是当前邮箱号

  15.         while(CAN_TransmitStatus(CAN1,TxMailbox) !=CANTXOK);//等待发送完成
  16.         while(CAN_MessagePending(CAN1,CAN_FIFO0)<1);//查询接受状态位,看是否有信息(报文)到达

  17.         RXmessage.StdId=0x00;//初始化接受结构体
  18.         RXmessage.IDE=CAN_ID_STD;
  19.         RXmessage.DLC=0;
  20.         RXmessage.Data[0]=0;
  21.         RXmessage.Data[1]=0;
  22.         RXmessage.Data[2]=0;

  23.         CAN_Receive(CAN1,CAN_FIFO0,&RXmessage);//接收信息(报文)

  24.         ret=1;//设置标志位

  25.         if(RXmessage.StdId !=0x123)//分别比较各项是否正确
  26.                 {
  27.                         ret=0;
  28.                 }
  29.         if(RXmessage.IDE!=CAN_ID_STD)
  30.                 {
  31.                         ret=0;
  32.                 }
  33.         if(RXmessage.DLC!=3)
  34.                 {
  35.                         ret=0;
  36.                 }
  37.         if((RXmessage.Data[0]!=0x01) | (RXmessage.Data[1] !=0x10) |(RXmessage.Data[2] !=0xFF))
  38.                 {
  39.                         ret=0;
  40.                 }
  41.         if(ret !=0)//ret=1说明全都通过检查,发送和接受成功
  42.                 {
  43.                         printf("Transmition PASSED!\n");
  44.                 }
  45.         else//发送接收失败
  46.                 {
  47.                         printf("Transmition FAILED!\n");
  48.                 }
  49. }
复制代码

最后从串口打印信息,查看发送和接收是否成功,也可以从仿真的窗口直接查看变量的值,从而确定是否成功。

这是一个简单的测试程序,用的是CAN测试模式中的回环模式,只有一个节点,自发自收,用来检测和学习,实际应用中会有多个节点,要分别对每个节点进行配置,收发,但是学会了这个,我们就能更容易的将CAN功能应用于实际中,而且学习起来只需要有一块板子就可以,不需要其他资源,使得更加方便。

最后附上代码:

STM32_CAN.rar (1.41 KB, 下载次数: 390)

收藏 6 评论22 发布时间:2015-5-29 19:02

举报

22个回答
风子 回答时间:2015-6-4 16:31:53
无力回天 发表于 2015-6-4 16:22
吓我呢,以为你的板子有can了

哈哈,先学习一下嘛
zhulikai 回答时间:2016-10-27 10:29:01
用的是标准库吗?能不能附上完整的项目程序包
nanhaijiaolong 回答时间:2018-2-26 10:18:21
没有恶工程,一个C文件,添加到工程跑步起来
Paderboy 回答时间:2015-5-29 19:06:17
多谢分享,学习了
Sean 回答时间:2015-5-29 20:52:23
谢谢分享,mark
yigerenday 回答时间:2015-5-29 23:10:33
谢谢分享,mark
小小超 回答时间:2015-5-30 08:42:57
多谢分享。谢谢了。
为什么是EEFOCUS小白 回答时间:2015-5-30 08:54:55
多谢分享
qscvhu 回答时间:2015-6-4 12:40:12
谢谢分享
无力回天 回答时间:2015-6-4 16:22:55
吓我呢,以为你的板子有can了
劳作的金牛 回答时间:2015-6-4 16:28:02
谢谢,楼主分享
无力回天 回答时间:2015-6-4 17:21:01
回去可以试试
fangchangqing 回答时间:2015-6-15 23:45:32
多谢分享
shadow丶 回答时间:2015-6-17 23:35:13
谢谢楼主分享0.0  
yigerenday 回答时间:2015-6-18 08:00:16
学习一下,谢谢分享
青萍之末 回答时间:2016-1-10 21:17:50
谢谢,楼主分享
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版