labview的CAN驱动程序

简介: labview的CAN驱动程序

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?


CAN属于现场工业总线的一个范畴,与LIN、FlexRay并称三大汽车总线。CAN与RS485最大的不同在于采取了数据位仲裁的方式来取代传统的站地址轮询方式,因此,CAN可以支持多主多从的工作方式。在总线中传输的所有报文都有一个唯一的ID,并且理论上挂在CAN总线的设备数量没有上限。正是由于CAN底层的协议栈要比RS232和RS485更加复杂,因此,CAN总线在容错与纠错能力、传输速率、稳定性几方面都要优于前者。越复杂的协议实现起来越困难,但好在目前市面上已经有很多现成的CAN总线收发器芯片供我们选择。最重要的是STM32内部已经集成了CAN协议控制器,极大地方便了用户的使用。


与RS232不同的是,RS485是半双工通信,因此,还需要一根额外的信号线来控制SP3485收发器的通信方向。一般情况下,默认为接收模式,需要发送数据的时候,通过该引脚输出高电平使其进入发送模式。


需要切记的是,RS485工作在主从模式下,当其中一台设备进入数据发送模式时,其余的设备必须设置为接收模式,否则RS485总线上的数据无法成功发送和接收。


CAN与前面介绍的RS232点对点通信方式不同,CAN总线中的每一帧报文都是以广播形式发送出去的,网络中的每个节点都可以正常接收这些报文。当然,在实际应用场合中,每个CAN节点有属于自己的角色,并非所有报文都去接收,它可以通过提前设置一些过滤器来筛选出指定的ID报文。关于CAN总线通信协议的更多介绍可以上网查询一下。


在介绍STM32芯片中的基本CAN(bxCAN)控制器之前,先来简单了解一下CAN数据帧的基本构成,


8141f09d372b4b41aa3304a4e3b213e0.png


数据帧由以下7段组成:帧起始、仲裁段、控制段、数据段、CRC段、ACK段以及帧结束。其中,需要软件编程修改的有以下3段:


·仲裁段,即报文的ID号,ID号越小,该报文的优先级越高。

·控制段,表明该帧是哪种类型,比如,是标准帧还是扩展帧,是数据帧还是远程帧。

·数据段,表示一次需要发送的实际字节数组,最多可以一次发送8个字节。


CAN通信过程中,一般有5种类型帧:数据帧、远程帧、错误帧、过载帧、帧间隔。其中,平时使用最多的是前两种:数据帧和远程帧。下面我们详细介绍一下这两种帧的具体含义。


1)数据帧:顾名思义,就是携带有将要发送数据的报文,其ID号是该报文的唯一标识。该报文通过广播形式发送出去,任何想要接收该帧数据的CAN终端节点只要能够过滤出该报文的ID号,就能正常解析出其中包含的数据。


2)远程帧:一般情况下,CAN网络中的节点有主从之分,有时候,CAN主节点需要指定其中的一个从节点发送一些反馈数据回来。比如,主节点想要获取一个温度传感器上的温度值,这个传感器节点传输数据采用的是CAN总线,即CAN的从节点,那么主节点可以先发送一个从节点能够正常接收到的ID远程帧,从节点收到之后,就可以将温度数据作为一个具有相同ID号的数据帧返回给主节点。大家可以将“远程帧”理解为CAN节点回读命令。远程帧一般只有ID号,不携带数据,即其数据场一般为0,这样可以加快传输速度。


STM32中的CAN控制器又称基本扩展CAN,即bxCAN,大家可以理解成支持基本帧与扩展帧的CAN控制器。这个独立于CPU的硬件CAN可以解析常用的CAN2.0A和CAN2.0B协议。因此,bxCAN可以满足用户的各种应用。


110110a0bfbc4b08999044e239690686.png

上图显示的是STM32内部集成的基本CAN控制器的系统框图,从中可以看出整个CAN收发器的工作流程。


STM32接收外部报文的流程是:当CAN总线上出现一帧报文时,首先由CAN收发器将CAN总线上的差分信号(隐性或显性电平)转换为bxCAN控制能够识别的高低电平,经STM32上的CAN RX引脚输入CAN的硬件过滤器中;将符合预先设定过的ID和帧为了进一步理解bxCAN的工作原理,我们按照从下至上的顺序,分别介绍CAN节点的每个功能模块。一般情况下,完成一帧报文的接收需要经过以下5个环节:


·CAN收发器

·CAN过滤器

·两个3级(共6个)接收邮箱

·两个FIFO缓冲区

·接收缓冲区(1KB)

而发送则相对比较简单,用户将需要发送的数据帧或远程帧直接放到3级发送邮箱中即可。


(1)CAN收发器

收发器相当于CAN控制器和物理总线之间的接口。市面上有很多这样的收发芯片,目前普遍使用的是TJA1050,这是因为TJA1050不仅可以为总线提供不同的发送和接收性能,还有以下5个优点:

·传输速度高(60Kbps~1Mbps)。

·具有带宽输入范围的差动接收器,可抗电磁干扰(EMI)。

·没有上电的节点不会对总线造成干扰。

·输入级与3.3V电平兼容。

·可以连接至少110个节点。


(2)CAN过滤器

前面说过,CAN总线上的每个节点地位都是同等的,没有地址之分。那么其中一个节点如何将数据传给另一个或者多个指定的节点呢?CAN协议很巧妙地解决了这个问题,那就是通过过滤出总线上自己想要的ID号报文。为了避免过多地占用CPU,过滤器一般都由独立硬件负责完成。STM32中的CAN控制器就集成了14个这样的过滤器,它位于CAN控制器的最底层。


14个过滤器分成两组,每组7个,分别与FIFO0和FIFO1相关联。总线上只有那些与过滤器中设定一致的ID报文才能够通过接收,并存放到CAN的接收邮箱中去。当用户同时设置了多个过滤器,一般会按照优先级的顺序逐个筛选,通过的报文将会放到对应的3级邮箱的任意一个中。STM32的互联型产品中,有两个CAN控制器,因此,最多有28个过滤器,而My_ARM系列产品中使用的STM32F103ZET6芯片只有14个。


(3)CAN接收邮箱

当一帧报文通过了过滤器之后,就会进入该过滤器对应的3个邮箱之一并挂号,如果这3个邮箱都满了,就会产生溢出中断。一旦FIFO中的数据被读走,挂起邮箱中的数据就会立刻转移到FIFO中,并产生相应的接收中断,此时用户就可以在中断服务子程序中读取该帧报文。


目录
相关文章
|
6月前
|
Linux
Linux驱动开发(使用I2C总线设备驱动模型编写AT24C02驱动程序)
Linux驱动开发(使用I2C总线设备驱动模型编写AT24C02驱动程序)
99 0
|
2月前
|
Linux 编译器 芯片
Linux 驱动开发基础知识—— 具体单板的 LED 驱动程序(五)
Linux 驱动开发基础知识—— 具体单板的 LED 驱动程序(五)
50 0
Linux 驱动开发基础知识—— 具体单板的 LED 驱动程序(五)
LabVIEW控制Arduino驱动1602液晶显示屏(基础篇—10)
本篇博文将利用LIAT中的LCD显示函数库,驱动1602液晶显示屏。
|
10月前
|
缓存
LabVIEW串口通信
串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。在LabVIEW中串口通信使用范围非常广泛,例如,通过串口使用ModBus协议驱动仪器、串口驱动PLC设备等。
|
芯片 异构计算
labview的RS232驱动程序
labview的RS232驱动程序
102 0
|
传感器 Linux 网络安全
zynq操作系统: Linux驱动开发串口篇
串口( UART)是一种非常常见的外设, 串口在嵌入式开发领域当中一般作为一种调试手段,通过串口将调试信息打印出来,或者通过串口发送指令给主机端进行处理;当然除了作为基本的调试手段之外,还可以通过串口与其他设备或传感器进行通信, 譬如有些 sensor 就使用了串口通信的方式与主机端进行数据交互。
1247 0
zynq操作系统: Linux驱动开发串口篇
|
C语言
Arduino-学习笔记及相关实验例程
Arduino-学习笔记及相关实验例程
66 0
Arduino-学习笔记及相关实验例程
|
异构计算 Windows
VHDL串口通信 在FPGA开发板上测试 并解决没有识别到下载接口USB_Blaster(No Hardware问题)
今天在调试 VHDL 串口通信,当使用 Quartus II 13.0 综合好的文件下载到 FPGA 开发板时发现,没有识别到下载USB_Blaster
472 0
VHDL串口通信 在FPGA开发板上测试 并解决没有识别到下载接口USB_Blaster(No Hardware问题)
红牛开发板模拟器简要说明_V1.0
我们可以扩展官方的模拟器,根据需要我们可以定制和开发板尽可能相同的功能的模拟器(特别是pin脚的定义要统一起来),这样编写的代码就不用专门为了适应模拟器,而作特别处理了。
701 0