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

查看: 9307|回复: 22

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

  [复制链接]

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-5-29 19:02:44 | 显示全部楼层 |阅读模式
本帖最后由 风子 于 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, 下载次数: 350)

<
回复

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2015-5-29 19:06:17 | 显示全部楼层
多谢分享,学习了
回复 支持 反对

使用道具 举报

0

主题

16

回帖

0

蝴蝶豆

初级会员

最后登录
2018-10-25
发表于 2015-5-29 20:52:23 | 显示全部楼层
谢谢分享,mark
回复 支持 反对

使用道具 举报

3

主题

238

回帖

0

蝴蝶豆

中级会员

最后登录
2017-4-25
发表于 2015-5-29 23:10:33 | 显示全部楼层
谢谢分享,mark
回复 支持 反对

使用道具 举报

27

主题

1709

回帖

42

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2015-5-30 08:42:57 | 显示全部楼层
多谢分享。谢谢了。
回复 支持 反对

使用道具 举报

26

主题

492

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-11-11
发表于 2015-5-30 08:54:55 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

11

主题

248

回帖

0

蝴蝶豆

高级会员

最后登录
2018-8-7
发表于 2015-6-4 12:40:12 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

60

回帖

0

蝴蝶豆

初级会员

最后登录
2016-1-2
发表于 2015-6-4 16:22:55 | 显示全部楼层
吓我呢,以为你的板子有can了
回复 支持 反对

使用道具 举报

3

主题

55

回帖

0

蝴蝶豆

中级会员

最后登录
2016-9-18
发表于 2015-6-4 16:28:02 | 显示全部楼层
谢谢,楼主分享
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-6-4 16:31:53 | 显示全部楼层
无力回天 发表于 2015-6-4 16:22
吓我呢,以为你的板子有can了

哈哈,先学习一下嘛
回复 支持 反对

使用道具 举报

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