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

查看: 3116|回复: 13

STM32的CAN通信实现

[复制链接]

3

主题

29

回帖

0

蝴蝶豆

中级会员

最后登录
2020-9-10
发表于 2015-2-28 23:59:43 | 显示全部楼层 |阅读模式
本帖最后由 叶落风过 于 2015-3-1 00:01 编辑

1.CAN是控制器局域网络(Controller Area Network, CAN)的简称
2.芯片选用:TJA1050

差分信号输入,
这里的显性电平CANH和CANL压差是2V左右,逻辑上表示“0”
两线之间没有压差CANH和CANL都是2.5V左右,表示逻辑“1”
实现代码
1、
  • /* 配置CAN模块*/
  • CAN_Config();

  • void CAN_Config(void)
  • {
  • ①CAN_GPIO_Config();   //此处用PB8/PB9
  • CAN_NVIC_Config();
  • CAN_Mode_Config();
  • CAN_Filter_Config();
  • }
②对于CAN_NVIC_Config();
看下CAN 的中断分类
  • static void CAN_NVIC_Config(void)
  • {
  •     NVIC_InitTypeDef NVIC_InitStructure;
  •         /* Configure one bit for preemption priority */
  •     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  •         /*中断设置*/
  •     NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;     //CAN1 RX0中断
  •         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;          //抢占优先级0
  •         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;             //子优先级0
  •         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  •         NVIC_Init(&NVIC_InitStructure);
  • }
③CAN_Mode_Config();   //CAN不像I2C那样有片选,他背身有许多协议,也要进行选择,所以对应代码的结构体也多(集体可看CAN手册)
④CAN_Filter_Config(); 过滤器程序
看下CAN的主要框图(M3里面的CAN)
M3里面有三个发送邮箱,把要发送的数据打包成报文,然后把它发送到CAN网络总线上;
接收器 先经过滤器,M3里面有14个过滤器,过滤的时候是根据报文的ID来过滤的,ID相同的话,才能过去(相当于一个闸门)
接收到数据后(这里有两个FIFO ,0、1 ),我们的实验用的是 放到FIFO 的Mailbox 0;
代码写法根基三部分:
1.Tx Mailboxes 2.Acceptance Filters 3.Receive FIFO

STM32 的 ID 过滤方式有两种,一种为标识符列表模式,它把要接收报文
的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接
收,可以理解为白名单管理。(说白了就是有一个标志位相同,然后就联通了)
另一种称为标识符屏蔽模式,它把可接收报文 ID 的某几位作为列表,这几
位被称为屏蔽位,可以把它理解成关键字搜索,只要屏蔽位(关键字)相同,就
符合要求。即这种模式只要求报文 ID 的屏蔽位与列表中标识符相应屏蔽位相
同 ,报文就被保存到接收 FIFO。(标志位的某几位检验,相同的话就通过了)
2.什么叫做报文(就是帧)
在原始数据段的前面加上传输起始标签、片选(识别)标签、控制标签,在
数据的尾段加上 CRC 校验标签、应答标签和传输结束标签。把这些内容按特定
的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同
SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其
它设备时,只要这些设备按格式去解读,就能还原出原始数据。类似这样的数
据包就被称为 CAN的数据帧。

看下数据帧
扩展与标准 仲裁段不一样,扩展11+18 = 29位
仲裁段:告诉是发还是收(几个同时通信的时候,那那根的信号,拉低了就是谁的了)如:
总电平接收了节点2的^_^(can的神奇之处)
CRC:发送与接收的对应
IDE:用于区分标准帧与扩展帧
r0、r1 都是显性位
3.CAN通信报文内容设置
void CAN_SetMsg(void)
4.发送消息,“ABCD”
CAN_Transmit(CAN1, &TxMessage);
总体流程图(例程对应):

while( flag == 0xff ); //flag =0 ,success ,此时产生一个中断(CAN中断)
对于从机的CAN_Config(); 是一模一样
不一样的是从机先上电
中断函数时一样的


CAN线接的时候 CANH接CANH, CANL接CANL,  不能对接

回复

使用道具 举报

4

主题

118

回帖

0

蝴蝶豆

中级会员

最后登录
2016-3-14
发表于 2015-3-1 00:07:25 | 显示全部楼层
好帖,值得学习
回复 支持 反对

使用道具 举报

16

主题

242

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-5-18
发表于 2015-3-1 01:02:05 | 显示全部楼层
赞一下
回复 支持 反对

使用道具 举报

93

主题

2449

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-6-28
发表于 2015-3-1 11:14:04 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

12

主题

1347

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-9-2
发表于 2015-3-1 11:25:07 | 显示全部楼层
学修一下
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
发表于 2015-3-1 18:00:40 | 显示全部楼层
多谢分享!!!
回复 支持 反对

使用道具 举报

12

主题

1347

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-9-2
发表于 2015-3-2 08:04:04 | 显示全部楼层
ddddd.png
回复 支持 反对

使用道具 举报

76

主题

5715

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-10-15
发表于 2015-3-2 09:18:08 | 显示全部楼层
多谢分享!!! blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png
回复 支持 反对

使用道具 举报

35

主题

1405

回帖

22

蝴蝶豆

金牌会员

最后登录
2020-12-3
发表于 2015-3-2 09:57:20 | 显示全部楼层
好。谢谢。
回复 支持 反对

使用道具 举报

5

主题

132

回帖

0

蝴蝶豆

中级会员

最后登录
2015-12-23
发表于 2015-3-2 10:26:47 | 显示全部楼层
楼主要做什么开发,汽车应用吗?
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版