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

查看: 3156|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版