当前位置: 首页 > news >正文

CAN通信(STM32)

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,  不能对接

 

转载于:https://www.cnblogs.com/Ph-one/p/4113174.html

相关文章:

  • 触摸屏
  • 超频真的不难!G3258超频4.5GHz全攻略
  • 《将博客搬至51CTO》
  • 小K(wifi)插座剖解
  • WIFI模块对比介绍
  • linux学习笔记《一.烧写篇_android》
  • 串口WIF简单I调试
  • CRC32是什么?
  • 指数增长的领域
  • va_start和va_end使用详解
  • STM32组合设备实现USB转双串口
  • ESP8266调试笔记
  • android驱动学习---led实验
  • 什么叫二级域名
  • 电源方案集
  • Android Studio:GIT提交项目到远程仓库
  • CentOS 7 防火墙操作
  • golang 发送GET和POST示例
  • Java 内存分配及垃圾回收机制初探
  • JAVA 学习IO流
  • JavaScript HTML DOM
  • Mysql5.6主从复制
  • node入门
  • oldjun 检测网站的经验
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SSH 免密登录
  • 构建二叉树进行数值数组的去重及优化
  • 检测对象或数组
  • 经典排序算法及其 Java 实现
  • 山寨一个 Promise
  • 树莓派 - 使用须知
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信小程序开发问题汇总
  • 详解移动APP与web APP的区别
  • 异常机制详解
  • 用 Swift 编写面向协议的视图
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • FaaS 的简单实践
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​iOS安全加固方法及实现
  • #传输# #传输数据判断#
  • (1)SpringCloud 整合Python
  • (2)STM32单片机上位机
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (黑马C++)L06 重载与继承
  • (三)elasticsearch 源码之启动流程分析
  • (万字长文)Spring的核心知识尽揽其中
  • (转载)Google Chrome调试JS
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net framework profiles /.net framework 配置
  • .net 中viewstate的原理和使用