CAN总线通信程序
can通信流程
can通信流程CAN(Controller Area Network)是一种先进的实时通信协议,广泛应用于汽车、工业控制和航空领域等。
下面将详细介绍CAN通信的工作原理和通信流程。
CAN通信是基于多主/多从的总线式通信系统,由控制器、传感器、执行器等节点组成。
每个节点都通过CAN控制器与总线相连接,通过CAN 总线进行信息的传递和交互。
CAN通信的基本流程如下:1.初始化:系统上电后,每个节点的CAN控制器需要进行初始化,包括设置CAN总线的工作模式、波特率以及接收和发送缓冲区等。
2.确定通信参数:各节点需要约定通信的ID、数据格式、信息长度等通信参数,以确保节点之间的信息交互是有效的。
3.发送数据:节点通过CAN控制器将要发送的数据封装成CAN帧,并通过CAN总线发送出去。
CAN帧包括帧起始位、ID、数据、帧检验位等。
4.接收数据:其他节点通过CAN控制器监听总线上的CAN帧,当有CAN帧到达时,进行接收。
每个节点通过识别CAN帧的ID来判断是否是自己所需要的数据,如果是,则进行数据解析,否则将其丢弃。
5.确认发送:发送节点接收到其他节点发送的数据后,会发送一个确认帧,表示自己已经成功接收到该数据。
6.错误处理:CAN总线具有自动差错检测和纠错能力,如果在通信过程中出现了错误,例如数据丢失、位错误等,节点会根据错误类型进行纠正或重新发送。
总的来说,CAN通信的流程是通过CAN控制器进行数据的封装、发送和解析,节点之间通过CAN总线进行数据的传递和交互。
每个节点根据CAN帧的ID来判断是否需要接收数据,并对接收到的数据进行解析和处理。
通过不断的发送、接收和确认,实现节点之间的实时通信。
CAN通信具有高可靠性、高带宽、抗干扰等特点,适用于多节点、多任务的控制系统。
在汽车领域中,CAN通信可以实现车载电子控制单元(ECU)之间的信息交换,提高汽车的安全性和可靠性。
而在工业控制领域,CAN通信可以连接分散的传感器和执行器,实现实时的数据交互和控制。
can总线常用通信协议
竭诚为您提供优质文档/双击可除can总线常用通信协议篇一:史上最全can总线协议规则一、can总线简介can是控制器局域网络(controllerareanetwork,can)的简称,是由研发和生产汽车电子产品著称的德国bosch公司开发了的,并最终成为国际标准(iso11898)。
是国际上应用最广泛的现场总线之一。
在建立之初,can总线就定位于汽车内部的现场总线,具有传输速度快、可靠性高、灵活性强等优点。
上世纪90年代can总线开始在汽车电子行业内逐步推广,目前已成为汽车电子行业首选的通信协议,并且在医疗设备、工业生产、楼宇设施、交通运输等领域中取得了广泛的应用。
二、can总线技术及其规范2.1性能特点(1)数据通信没有主从之分,任意一个节点可以向任何其他(一个或多个)节点发起数据通信,通信方式灵活,且无需站地址等节点信息;(2)can网络上的节点信息分成不停的优先级,可满足不同的实时要求,高优先级节点信息最快可在134μs内得到传输;(3)采用非破坏性总线仲裁技术,当多个节点同时向总线发送信息时,优先级较低的节点会主动退出发送,而高优先级的节点可不受影响的继续发送数据,从而大大节省了总线冲突仲裁时间。
尤其是在网络负载很重的情况下也不会出现网络瘫痪的情况;(3)通信距离最远可达10km(速率低于5kbps)速率可达到1mbps(通信距离小于40m);(4)通信的硬件接口简单,通信线少,传输介质可以是双绞线,同轴电缆或光缆。
can总线适用于大数据量短距离通信或者长距离小数据量,实时性要求比较高,多主多从或者各个节点平等的现场中使用。
(5)采用短帧结构,传输时间短,受干扰概率低,每帧信息都有cRc校验及其他检验措施,数据出错率极低;(6)节点在严重错误的情况下具有自动关闭输出的功能,以使总线上其他节点的操作不受影响。
(7)can总线使用两根信号线上的差分电压传递信号,显性电平可以覆盖隐形电平。
2.2技术规范2.2.1can的分层结构图1can的分层结构逻辑链路控制子层(llc)的功能:为数据传送和远程数据请求提供服务,确认由llc子层接收的报文实际上已被接收,为恢复管理和通知超载提供信息。
STM32的CAN总线接收与发送
过滤器优先级规则: 位宽为 32 位的过滤器,优先级高于位宽为 16 位的过滤器; 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式; 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高。
if(sent == TRUE)
continue;
sent = TRUE;
data ++;
if(data > 'z')
data = '0';
CAN_TxData(data);
}
else
//按键放开
{
GPIO_ResetBits(GPIO_LED, GPIO_LD1);
sent = FALSE;
}
} }
接收邮箱(FIFO) 在接收到一个报文后,软件就可以访问接收 FIFO 的输出邮箱来读取它。一旦软件处理了报文(如把它读出来), 软件就应该对 CAN_RFxR 寄存器的 R中断 bxCAN 占用 4 个专用的中断向量。通过设置 CAN 中断允许寄存器 CAN_IER ,每个中断源都可以单独允许和禁 用。 (1) 发送中断可由下列事件产生: ─ 发送邮箱 0 变为空,CAN_TSR 寄存器的 RQCP0 位被置 1。 ─ 发送邮箱 1 变为空,CAN_TSR 寄存器的 RQCP1 位被置 1。 ─ 发送邮箱 2 变为空,CAN_TSR 寄存器的 RQCP2 位被置 1。 (2) FIFO0 中断可由下列事件产生: ─ FIFO0 接收到一个新报文,CAN_RF0R 寄存器的 FMP0 位不再是‘00’。 ─ FIFO0 变为满的情况,CAN_RF0R 寄存器的 FULL0 位被置 1。 ─ FIFO0 发生溢出的情况,CAN_RF0R 寄存器的 FOVR0 位被置 1。 (3) FIFO1 中断可由下列事件产生: ─ FIFO1 接收到一个新报文,CAN_RF1R 寄存器的 FMP1 位不再是‘00’。 ─ FIFO1 变为满的情况,CAN_RF1R 寄存器的 FULL1 位被置 1。
CAN总线的原理及使用教程
MSCAN08/MSCAN12
24
MSCAN08通信实现
发送和接收函数
//--------------函数声明--------------------------// //发送1帧远程帧 unsigned char CANsnd1RFrm(unsigned int rid); //CAN发送1帧数据帧(数据长度<=8) unsigned char CANsnd1DFrm(unsigned int rid, unsigned char * databuf,unsigned char len); //查找空闲发送缓冲区 unsigned char GetSndBuf(void); //接收1帧
MSCAN08/MSCAN12
6
位速率
位速率(Bit Rate) 指总线的传输速率,下表列出了距离与 位速率的相关数据。这里的最大距离是指 不接中继器的两个单元之间的距离。
MSCAN08/MSCAN12
7
位定位与同步
标称位速率(Nominal Bit Rate):理想的发送 器在没有重新同步的情况下每秒发送的位数量。 标称位时间(Nominal Bit Time):是标称位速 率的倒数。分成几个不重叠的片段:同步段 (SYNC_SEG ) 、 传 播 段 (PROG_SEG) 、 相 位 段 1(PHASE_SEG1)、相位段2(PHASE_SEG2)。
unsigned char CANrcv1Frm(unsigned char * canrcvbuf);
MSCAN08/MSCAN12 25
MSCAN08自环通信测试实例
(1).回环工作方式测试工程文件列表
表 17-8 回环工作方式测试工程文件列表 工程文件名 所在路径 文件类型 文件名 GZ60C.h Includes.h Type.h 头文件 CANInit.h CAN.h Commsubs.h vectors.c C语言 子函数文件 C语言主函数 MCUInit.c CANInit.c CAN.c Main.c CANSelfTest.prj MC08Ex2007\GP32\GP32C\C16_CAN\01_SelfTest 功能简述 芯片头文件 总头文件 数据类型头文件 声明CAN初始化函数 CAN收发子函数头文件 串行通信等通用子函数头 文件 中断向量表 芯片系统初始化函数定义 MSCAN08初始化函数定义 CAN收发子函数定义 主函数 讲解章节 参见工程实例 [08C工程文件组织] 5.3 [08C工程文件组织]5.3 本章 本章 参见工程实例 参见工程实例 参见工程实例 [本章] [本章] [本章]
基于DSPACE的CAN总线通讯程序开发-任务书
六、备注
指导教师签字:
年月日
教研室主任签字:
年月日
用于控制器开发流程的直观的软件产品:dSPACE产品拥有统一的接口界面。不管是开发、编程还是测试电控单元,都是在同一个综合环境下进行。这样可以加快并简化开发流程。
二、设计(论文)内容、技术要求(研究方法)
(一)主要内容
1、熟悉matlab/dspace软件。
2、研究车用CAN总线。
3、设计硬件部分即SAPACE的接口连接。
(3)编制程序及中期检查:第7~8周(4月12日~4月25日)
(4)编程序:第9~10周(4月26日~5月9日)
(5)整理文档并提交图纸和设计说明书初稿:第11~12周(5月10日~5月23日)
(6)毕业论文总结、评阅、审核及修改不足:第15~16周(5月24日~6月6日)
(7)为毕业论文答辩做准备及答辩:第17周(6月7日~6月13日)
毕业设计(论文)任务书
学生姓名
系部
汽车与交通工程学院
专业、班级
指导教师姓名
职称
实验师
从事
专业
车辆工程
是否外聘
□是 否
题目名称
基于DSPACE的CAN总线通讯程序开发
一、设计(论文)目的、意义
CAN总线是德国BOSCH公司80年代为解决现代汽车中众多的控制与测试仪器之间的数据交换而-开发的一种串行数据通信协议,其总线规范已被ISO国际标准组织制定为国际标准。现代汽车越来越多的采用电子控制装置,如发动机的喷油控制、ABS等。由于这些控制装置需检测及交换大量数据,采用连接信号线的方法不但烦琐而且昂贵,采用CAN总线上述问题可以得到很好的解决。世界上一些著名的汽车厂商都已开始采用CAN总线束实现汽车内部控制系统与各检测和执行机构间的数据通讯。
基于单片机的CAN总线通讯实现
基于单片机的CAN总线通讯实现CAN(Controller Area Network)总线是一种现代的串行通信总线,广泛应用于汽车电子系统和工控领域。
它具有高可靠性、抗干扰能力强、高速传输、多节点连接等特点,成为实时控制系统的首选通信方式。
实现基于单片机的CAN总线通讯,需要经过以下几个步骤:1.硬件准备:选择合适的CAN控制器和单片机,常用的CAN控制器有MCP2515、SJA1000等。
接下来需要连接CAN控制器和单片机,包括连接CAN高低线路、配置引脚等。
2.引脚配置:根据所使用的单片机和CAN控制器的规格,配置相应的引脚。
通常需要配置CAN_TX、CAN_RX引脚,同时还需要配置中断引脚。
3. 初始化CAN总线:初始化CAN总线的过程包括设置波特率、模式选择、滤波器设置等。
波特率是通信的重要参数,需要保证发送和接收端的波特率一致,通常使用比较常见的波特率如500kbps。
4.发送数据:CAN总线通信是基于消息的,发送数据需要构建CAN消息帧。
消息帧包括标识符、数据长度、数据内容等。
在发送数据之前,需要准备好发送的数据,并将数据放入CAN消息帧中,最后将消息帧发送到总线上。
5.接收数据:接收数据需要配置CAN总线的工作模式和接收过滤器。
当有数据从总线上接收时,CAN控制器将数据存入接收缓冲器,并产生中断或者置位标志位来提醒主控处理接收到的数据。
6.数据处理:接收到的数据可以根据需要进行处理,包括解析、判断、存储等。
根据数据的标识符和长度等信息,可以将数据分发给不同的处理程序进行处理。
7.错误处理:在CAN总线通信过程中,可能会出现数据错误、通信超时等问题。
需要设置相应的错误处理机制,包括错误标志位的监测、错误计数器的清零等。
8.电源管理:在使用CAN总线通信时,需要合理管理系统的功耗和电源。
对于低功耗应用,可以将CAN控制器和单片机配置为睡眠模式,待接收到唤醒信号后再恢复正常工作。
总结:基于单片机的CAN总线通讯实现需要进行硬件准备、引脚配置、初始化CAN总线、发送数据、接收数据、数据处理、错误处理和电源管理等一系列步骤。
canopen通信流程
canopen通信流程CanOpen是一个开放式通信协议,用于在实时应用中控制和采集数据。
它是属于CAN总线的一种协议。
CanOpen通讯流程涉及到一些基本的概念和过程。
以下是CanOpen通信流程的详细介绍。
CanOpen协议的底层使用了CAN总线作为物理传输层,因此首先需要进行CAN总线的初始化。
CAN总线由两个主要部分组成,即通信周期和数据通信。
通信周期定时发送同步信息,这样所有节点可以以相同的时钟步进同步自己的操作。
数据通信则涉及其他高级的CanOpen对象,如节点状态,SDO(Service Data Object),PDO(Process Data Object)等。
CanOpen通信流程的具体步骤如下:1.初始化CAN总线:首先需要初始化CAN总线,包括设置波特率、过滤器和接收缓冲区等参数。
每个节点都必须进行这个步骤以确保与总线的正常通信。
2. 设置节点ID:每个CanOpen节点都需要有唯一的标识符,用于在总线上进行通信。
节点ID可以是一个独立的32位数值,也可以是一个组合的16位ID和8位的子标识符。
3. 节点状态管理:CanOpen节点有几种不同的状态,包括pre-operational、operational和stopped等。
在通信之前,节点必须进入pre-operational状态,并执行一些配置和初始化任务。
然后,节点可以进入operational状态,开始正常的数据通信。
4. SDO(Service Data Object)通信:SDO是CanOpen协议中用于传输配置和控制信息的对象。
它可以用于读取或写入节点的参数和数据。
SDO通信需要一个主节点和一个从节点。
主节点发送请求(Read或Write),从节点则返回响应。
这样可以方便地配置和控制节点。
5. PDO(Process Data Object)通信:PDO用于实时传输节点的实际过程数据。
PDO通信是基于事件触发的,其中一个节点可以发送对另一个节点的数据更改请求。
can通信原理
can通信原理
CAN是Controller Area Network的缩写,它是一种车辆传输局域网(VAN)技术的专业术语,是一种高速、可靠、低成本的总线。
它的特点是多个微处理器之间通信,同时可以传输标准总线或不同类型的信号,并且它可以在较短的时间内传输较多的信息,因此在某些场景中得到了广泛的应用。
CAN通信原理指的是CAN、CAN FD通信系统中的通信原理,其核心是采用两个线性双绞线,即CAN_H(CAN High)和CAN_L(CAN Low)两个线路上进行通信。
CAN_H线和CAN_L线所组成的双绞线两端分别连接CAN总线组件(如网关、ECU等),整个 CAN 总线就形成了一闭环的结构。
当CAN总线上的某个CAN总线组件(比如ECU等)想要发送数据时,会首先发出一个低电平的同步脉冲,随后,它还会发出一个数据帧,包括标识符、远程帧和数据帧等,以及CRC码。
它还会发出一个低电平的校验帧,以保证数据的准确性。
当接收到的数据帧正确无误时,CAN总线上的另一个CAN总线组件(比如网关)会收到一个低电平的应答脉冲,它标识该帧的接收状态。
如果数据帧不正确,则不会收到回复信号,因此,能够通过CAN总线传输的数据都是可靠的。
CAN是一个异步总线,它不需要中心设备来同步每个CAN组件发送和接收数据,因而使CAN节点可以在任何时候进行数据传输,不受其它CAN 节点的影响,并且CAN通信也不需要实时通信系统的支持。
总的来说,CAN的通信原理是一种可靠的、高效的、低成本的通信技术,它可以在多个CAN网络节点之间进行高速通信,并且在传输大量数据
时保持可靠性,是一种十分受欢迎的通信技术。
can总线的通信硬软件源码
can总线的通信硬软件源码CAN通讯的优点在此就不多说了,10公里,5Kb/s的速度是能保证的。
第一步:硬件环境的建立。
这里采用的是SJA1000作为总线控制器,CTM8251模块作为总线驱动器。
MCU采用的是MEGA16:利用I/O口模拟数据总线,当然也可以使用有总线的MCU:MCS-51,MEGA8515等。
原理图如下:第二步:SJA1000的控制首先阅读下SJA1000的手册,基本了解下SJA1000的结构,主要是寄存器方面的。
还要了解下CA N总线方面的东西:BasicCAN,Peli CAN,远程帧,数据帧等等……SJA1000工作之前需要配置一下,才能正常工作,没有经过配置的SJA1000回拉坏总线的:组成网络的时候,如果其中有的SJA1000没有正确配置,这个设备会干扰总线,使其它设备的数据发送不出去。
怎么才能控制SJA1000呢,请看下面的SJA1000读写的时序图:写的时序根据时序要求,可以利用I/O口模拟总线了://**************************读SJA1000*************************// uint Read_SJA1000(uint address){uchar data;asm("nop");ALE_off;WR_on;RD_on;CAN_cs_on;DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址asm("nop");//delay5us(1);ALE_on;asm("nop");//delay5us(1);//DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址 //再次输出地址,确保一致。
asm("nop");//delay5us(1);ALE_off;//delay5us(1);CAN_cs_off;RD_off;asm("nop");//delay5us(2);asm("nop");DDRA=0x00; //数据口为输入PORTA=0xff; //上拉asm("nop");data=PINA; //获得数据asm("nop");//delay5us(1);RD_on;CAN_cs_on;asm("nop");//delay5us(2);//dog();return data;}//**************************写SJA10000*************************// void Write_SJA1000(uint address,uint data){ asm("nop");//uint temp1,temp2;DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址CAN_cs_on;ALE_off;WR_on;RD_on;asm("nop");//delay5us(1);ALE_on;asm("nop");//delay5us(1);//DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址再次输出地址,确保数据准确asm("nop");//delay5us(1);ALE_off;//delay5us(1);CAN_cs_off;WR_off;asm("nop");//delay5us(1);asm("nop");//DDRA=0xff;PORTA=data; //输出数据asm("nop");//delay5us(2);WR_on;PORTA=data; //再次输出数据,取保一致CAN_cs_on;asm("nop");//delay5us(2);asm("nop");//dog();}现在可以读写SJA1000了。
MSCAN应用
控制局域网CAN (controllerareanetwork)是国际上应用最广泛的现场总线之一,是德国Bosch公司为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种通讯协议,它作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。
比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。
CAN是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。
当信号传输距离达到10Km时,CAN仍可提供高达50 kbit/s的数据传输速率。
它是一种有效支持分布式控制或实时控制的串行通讯网络。
CAN的应用范围遍及从高速网络到低成本的多线路网络。
在自动化电子领域的汽车发动机控制部件、传感器、抗滑系统等应用中,CAN的位速率可高达1 Mbps。
CAN网络具有反映快,可靠度高的特性,应用于要求实时处理的场合,例如汽车刹车防锁死系统安全气囊等。
今天此项通信协议已得到广泛应用,成为现代汽车设计中必须采用的装置,奔驰、宝马、大众、沃尔沃及雷诺汽车都将CAN作为控制器联网的手段。
1 CAN总线的特点及通讯协议1.1 CAN总线的特点CAN总线是一种有效支持分布式控制或实时控制的串行通信网络。
其通讯介质可以是双绞线、同轴电缆或光纤。
在汽车发动机控制部件、传感器等应用中,总线的位速率最大可达1Mbit/s。
CAN总线具有以下主要特性:a. 无破坏性的基于优先权竞争的总线仲裁b. 可借助接收滤波的多地址帧传送c. 具有错误检测与出错帧自动重发功能d. 数据传送方式可分为数据广播式和远程数据请求式1.2 CAN总线帧格式[1]CAN总线通信协议包括CAN2.0A和CAN2.0B两种,它们的帧格式如下:(1)CAN2.0A通信协议规定了4种不同的帧格式:数据帧用于节点间传递数据,是网络信息的主体,其帧格式依次包括:帧起始、仲裁场、控制场、数据场、CRC场、ACK场和帧结束。
基于CAN总线的主从机通信系统设计
课程设计(论文)任务及评语院(系):电气工程学院 教研室:自动化 注:成绩:平时20% 论文质量60% 答辩20% 以百分制计算 学 号070302145 学生姓名 李娜 专业班级 自动化075 课程设计题目 基于CAN 总线的主从机通信系统设计课程设计(论文)任务 课题完成的功能、设计任务及要求、技术参数实现功能以CAN 总线为基础,设计主从机间通信,硬件上完成单片机最小系统、总线控制器、驱动器、串口通信等电路的设计,软件上完成主机、从机和CAN 总线的收发数据。
设计任务及要求1、选择总线控制器、单片机型号,确定设计方案;2、设计单片机最小系统(晶振、电源、复位等);3、设计实现系统功能的单片机外围电路;4、设计CAN 总线电路(包括控制器、驱动器、接口电路);5、软件设计(编写主程序、接收、发送程序及相应的流程图)6、要求认真独立完成所规定的全部内容;所设计的内容要求正确、合理。
7、撰写、打印设计说明书一份;设计说明书应在4000字以上。
技术参数1、符合CAN2.0B 规范;2、CAN 节点参数:晶振频率为24MHz,,总线的速度为20kb/s ,最大的传输距离为3000m ,双滤波接收数据。
进度计划 1、布置任务,熟悉课设题目,查找及收集相关书籍、资料。
(1天)2、确定控制方案、选型。
(2天)3、总线电路硬件设计。
(3天)4、程序实现及流程图。
(2天)5、撰写设计说明书。
(1天)6、验收及答辩。
(1天)指导教师评语及成绩平时: 论文质量: 答辩:总成绩: 指导教师签字:年 月 日摘要现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。
它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。
CAN(Controller Area Network)属于现场总线的范畴,是一种多主方式的串行通讯总线,数据通信实时性强。
与其它现场总线比较而言,CAN总线具有通信速率高、容易实现、可靠性高、性价比高等诸多特点。
CAN总线的双机通信.doc
实验3 CAN总线的双机通信一、实验目的:学习并完成CAN总线的双机通信二、实验设备:EL-8051-III型单片机实验箱三、实验内容:初始化CAN节点,使SJA1000处在准备工作状态。
编写发送和接收程序,一台发送,一台接收,并验证实验程序。
四、实验步骤:1.给试验箱换上CAN控制器;2.编写并编译初始化和发送、接收程序;3.下载程序并调试。
五、实验程序:;本程序适用于带ALE发生器的新板,是两块板的收发程序;将模块1上CS0用跳线帽短接,模块2上CS1用跳线帽短接.;两块模块上的JUMP-4的两个跳线短接在Single侧;用导线分别对应短接两模块上的CANL和CANH.;(也可用带水晶头的专用CAN连接线的两头分别插在两模块的插座中而不用导线连接) ;有且只能有一块模块上的A短接到CANL,B短接到CANH.;接通电源,运行本测试程序,在断点处查看内存单元20H~27H中的值是否与30H~37H 中的值完全对应相等;如果相等表示模块正常,否则用自检程序分别检测收发模块MODE EQU 0DE00H ;模式寄存器CMR EQU 0DE01H ;命令寄存器SR EQU 0DE02H ;状态寄存器IR EQU 0DE03H ;中断寄存器IER EQU 0DE04H ;中断使能寄存器BTR0 EQU 0DE06H ;总线定时寄存器一BTR1 EQU 0DE07H ;总线定时寄存器二OCR EQU 0DE08H ;输出控制寄存器ALC EQU 0DE0BH ;仲裁丢失捕捉寄存器ECC EQU 0DE0CH ;错误代码捕捉寄存器TXERR EQU 0DE0FH ;发送错误计数器ACR0 EQU 0DE10H ;验收代码寄存器0ACR1 EQU 0DE11H ; 1ACR2 EQU 0DE12H ; 2ACR3 EQU 0DE13H ; 3AMR0 EQU 0DE14H ;验收屏蔽寄存器0AMR1 EQU 0DE15H ; 1AMR2 EQU 0DE16H ; 2AMR3 EQU 0DE17H ; 3CANTRXB EQU 0DE10H ;发送/接收帧信息ID1 EQU 0DE11H ;发送/接收缓冲区之标示符一ID2 EQU 0DE12H ;发送/接收缓冲区之标示符二DATA1 EQU 0DE13H ;发送/接收数据首址RBSA EQU 0DE1EH ;接收缓冲器起始地址寄存器CDR EQU 0DE1FH ;时钟分频寄存器ORG4000HJMP CANINIORG4080H;----------------------------------------------------------------;初始化CANINI:MOV DPTR,#MODE ;方式寄存器MOV A,#09H ;进入复位状态MOVX @DPTR,A ;MOV DPTR,#CDR ;时钟分频寄存器MOV A,#88H ;选择PLICAN模式,关闭时钟输出MOVX @DPTR,A ;MOV DPTR,#IER ;中断允许寄存器MOV A,#0DH ;开放发送中断,溢出中断和错误警告中断MOVX @DPTR,A ;MOV DPTR,#AMR0 ;接收屏蔽寄存器MOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#AMR1 ;MOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#AMR2 ;MOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#AMR3 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#ACR0 ;验收代码寄存器MOV A,#11H ;MOVX @DPTR,A ;MOV DPTR,#ACR1 ;MOV A,#22H ;MOVX @DPTR,A ;MOV DPTR,#ACR2 ;MOV A,#33H ;MOVX @DPTR,A ;MOV DPTR,#ACR3 ;MOV A,#43H ;MOVX @DPTR,A ;MOV DPTR,#BTR0 ;总线定时寄存器MOV A,#03H ;MOVX @DPTR,A ;MOV DPTR,#BTR1 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#OCR ;输出控制寄存器MOV A,#0AAH ;MOVX @DPTR,A ;MOV DPTR,#RBSA ;复位时候改成00hMOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#TXERR ;发送错误计数寄存器MOV A,#0 ;MOVX @DPTR,A ;MOV DPTR,#ECC ;错误代码捕捉寄存器????????????MOVX A,@DPTR ;MOV DPTR,#MODE ;MOV A,#08H ;单向验收滤波器(32位长)起作用,成功发送时必须应答信号MOVX @DPTR,A ;NOP;NOP;;*************************************************;发送MOV DPTR,#TRDATA ;把所要发送的数据送入单片机RAM中的20HMOV R2,#00H ;MOV R1,#08H ;MOV R0,#20H ;DD: MOV A,R2 ;MOVC A,@A+DPTRMOV @R0,A ;INC R2 ;INC R0DJNZ R1,DD ;MOV R0,#00H ;MOV R1,#00H ;MOV R2,#00H ;TDAT A:MOV DPTR,#SR ;状态寄存器MOVX A,@DPTR ;从SJA1000读入状态寄存器值JB ACC.4,TDAT A ;判断是否在等待接收,正在接收则等待TS0:MOVX A,@DPTR ;判断上次发送是否完成,为完成则等待JNB ACC.3,TS0TS1:MOVX A,@DPTR ;判断发送缓冲区是否锁定,锁定则等待JNB ACC.2,TS1TS2:MOV DPTR,#CANTRXB ;发送缓冲区首地址MOV A,#88H ;帧信息:扩展格式数据帧,数据长度8字节MOVX @DPTR,AINC DPTRMOV A,#11HMOVX @DPTR,AINC DPTRMOV A,#22HMOVX @DPTR,AINC DPTRMOV A,#33HMOVX @DPTR,AINC DPTRMOV A,#43HMOVX @DPTR,AMOV R0,#20H ;单片机内RAM发送数据首地址,发送的数据为TRDAT A中的数据MTBF: MOV A,@R0INC DPTRMOVX @DPTR,AINC R0CJNE R0,#48H,MTBF ;最后一个数据字节地址的下一个地址MOV DPTR,#CMRMOV A,#01H ;当前报文被发送MOVX @DPTR,ATRDAT A: DB 11H,22H,33H,44H,55H,66H,77H,88H;**************************************************************END;本程序适用于带ALE发生器的新板,是两块板的收发程序;将模块1上CS0用跳线帽短接,模块2上CS1用跳线帽短接.;两块模块上的JUMP-4的两个跳线短接在Single侧;用导线分别对应短接两模块上的CANL和CANH.;(也可用带水晶头的专用CAN连接线的两头分别插在两模块的插座中而不用导线连接);有且只能有一块模块上的A短接到CANL,B短接到CANH.;接通电源,运行本测试程序,在断点处查看内存单元20H~27H中的值是否与30H~37H中的值完全对应相等;如果相等表示模块正常,否则用自检程序分别检测收发模块MODE EQU 0DE00H ;模式寄存器CMR EQU 0DE01H ;命令寄存器SR EQU 0DE02H ;状态寄存器IR EQU 0DE03H ;中断寄存器IER EQU 0DE04H ;中断使能寄存器BTR0 EQU 0DE06H ;总线定时寄存器一BTR1 EQU 0DE07H ;总线定时寄存器二OCR EQU 0DE08H ;输出控制寄存器ALC EQU 0DE0BH ;仲裁丢失捕捉寄存器ECC EQU 0DE0CH ;错误代码捕捉寄存器TXERR EQU 0DE0FH ;发送错误计数器ACR0 EQU 0DE10H ;验收代码寄存器0ACR1 EQU 0DE11H ; 1ACR2 EQU 0DE12H ; 2ACR3 EQU 0DE13H ; 3AMR0 EQU 0DE14H ;验收屏蔽寄存器0AMR1 EQU 0DE15H ; 1AMR2 EQU 0DE16H ; 2AMR3 EQU 0DE17H ; 3CANTRXB EQU 0DE10H ;发送/接收帧信息ID1 EQU 0DE11H ;发送/接收缓冲区之标示符一ID2 EQU 0DE12H ;发送/接收缓冲区之标示符二DATA1 EQU 0DE13H ;发送/接收数据首址RBSA EQU 0DE1EH ;接收缓冲器起始地址寄存器CDR EQU 0DE1FH ;时钟分频寄存器ORG4000HJMP CANINIORG4080H;----------------------------------------------------------------;初始化CANINI:MOV DPTR,#MODE ;方式寄存器MOV A,#09H ;MOVX @DPTR,A ;MOV DPTR,#CDR ;时钟分频寄存器MOV A,#88H ;选择PLICAN模式,关闭时钟输出MOVX @DPTR,A ;MOV DPTR,#IER ;中断允许寄存器MOV A,#0DH ;开放发送中断,溢出中断和错误警告中断MOVX @DPTR,A ;MOV DPTR,#AMR0 ;接收屏蔽寄存器MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#AMR1 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#AMR2 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#AMR3 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#ACR0 ;验收代码寄存器已被屏蔽MOV A,#11H ;MOVX @DPTR,A ;MOV DPTR,#ACR1 ;MOV A,#22H ;MOVX @DPTR,A ;MOV DPTR,#ACR2 ;MOV A,#33H ;MOVX @DPTR,A ;MOV DPTR,#ACR3 ;MOV A,#43H ;MOVX @DPTR,A ;MOV DPTR,#BTR0 ;总线定时寄存器MOV A,#03H ;MOVX @DPTR,A ;MOV DPTR,#BTR1 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#OCR ;输出控制寄存器MOV A,#0AAH ;MOVX @DPTR,A ;MOV DPTR,#RBSA ;复位时候改成00hMOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#TXERR ;发送错误计数寄存器MOV A,#0 ;MOVX @DPTR,A ;MOV DPTR,#ECC ;错误代码捕捉寄存器????????????MOVX A,@DPTR ;MOV DPTR,#MODE ;MOV A,#08H ;单向验收滤波器(32位长)起作用,成功发送时必须应答信号MOVX @DPTR,A ;NOP;NOP;;**************************************************************;接收程序SEARCH:MOV DPTR,#SR ;状态寄存器地址MOVX A,@DPTRANL A,#0C3H ;读取总线关闭位、错误状态位、接收溢出位、有数据等状态位、JNZ PROCJMP SEARCH ;否则的话继续监测PROC:JNB ACC.7,PROCI ;总线不正常BUSERR:MOV DPTR,#IR ;中断寄存器;出现总线关闭MOVX A,@DPTR ;读中断寄存器,清除中断位?????????MOV DPTR,#MODE ;模式寄存器MOV A,#08H ;进入复位模式MOVX @DPTR,A ;将方式寄存器复位请求位清零LCALL ALARM ;调用报警子程序??????????????RETNOPPROCI: MOV DPTR,#IR ;总线正常MOVX A,@DPTR ;读取中断寄存器,清除中断位JNB ACC.3,OTHEROVER:MOV DPTR,#CMR ;数据溢出MOV A,#0CHMOVX @DPTR,A ;在命令寄存器中清除数据溢出和释放接收缓冲区RETNOPOTHER:JB ACC.0,RECE ;IR0=1,接收缓冲区有数据LJMP RECOUT ;否则,退出接收NOPRECE:MOV DPTR,#CANTRXB ;接收缓冲区首地址MOVX A,@DPTR ;读取数据帧信息JNB ACC.6,RDAT A ;RTR=1时为远程请求帧MOV DPTR,#CMRMOV A,#04H ;CMR.2=1,释放接收缓冲区MOVX @DPTR,A ;只有接收了数据才能释放接收缓冲区LCALL TRDAT A ;发送对方请求的数据LJMP RECOUT ;退出接收NOPRDAT A:MOV DPTR,#CANTRXB ;读取并保存接收缓冲区的数据MOV R1,#30H ;数据存储RAM,接收到的数据存储在此MOVX A,@DPTR ;读取数据帧格式字MOV @R1,A ;保存ANL A,#0FH ;截取低四位是数据长度ADD A,#4MOV R6,ARDAT A0: INC DPTRINC R1MOVX A,@DPTRMOV @R1,ADJNZ R6,RDAT A0 ;循环读取与保存MOV DPTR,#CMRMOV A,#04H ;释放接收缓冲区MOVX @DPTR,ARECOUT:MOV DPTR,#ALC ;释放仲裁丢失捕捉寄存器和错误捕捉寄存器MOVX A,@DPTRMOV DPTR,#ECCMOVX A,@DPTRRETALARM:MOV P1,00H ;点灯RET;********************************************************************* END。
can和lin通讯原理
can和lin通讯原理
CAN(Controller Area Network)是一种串行通信协议,用于
在车辆、工业设备等领域中进行分布式通信。
CAN总线通信
的原理主要包括两点:物理层和数据链路层。
1. 物理层:CAN总线采用差分信号线对通信进行传输。
其中,CAN_H和CAN_L是一对相互互补的差分信号线,它们分别
代表CAN总线的高电平和低电平。
CAN节点通过这两根线将差分信号进行传输,并利用差分信号的差值来判断信息的高低电平。
2. 数据链路层:CAN总线采用了CSMA/CA(载波侦听多址/
冲突应对)的协议,实现了多节点间的共享总线通信。
具体通信过程如下:
- 发送节点先侦听总线上是否有节点正在发送信息,如果总线
空闲,则发送节点可以开始发送信息。
- 发送节点将数据和标识符打包成帧,并通过差分信号线发送
到总线上。
- 其他节点收到帧后,会校验标识符和CRC校验码,如果校
验通过,就认为是自己所需的信息,进行后续处理;否则,忽略这帧数据。
- 如果多个节点同时发送数据,会发生冲突。
CAN总线会检测到冲突,并根据优先级算法选择胜出的节点。
- 发送节点在发送完毕后,会等待一段时间,确保其他节点有
足够的时间来发送他们的数据。
总体来说,CAN总线的通信原理是基于差分信号线进行信号
传输,并通过多节点间的冲突检测与处理,实现了高效可靠的数据交换。
这种通信方式在汽车、工业控制等领域得到了广泛应用。
CAN的工作原理及初始化
CAN的工作原理及初始化CAN,全称为“Controller Area Network”,即控制器局域网CAN是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。
当信号传输距离达到10Km时,CAN 仍可提供高达50Kbit/s的数据传输速率。
由于CAN总线具有很高的实时性能,因此,CAN已经在汽车工业、航空工业、工业控制、安全防护等领域中得到了广泛应用。
CAN的结构:数据链路层:包括逻辑链路控制子层(Logical Link Control,LLC )和媒体访问控制子层(Medium Access Control,MAC)。
物理层:包括物理信号子层 (Physical Layer Signal,PLS) 、物理介质连接 (Physical Medium Attachment,PMA)和介质相关接口(Medium Dependent Interface,MDI) 。
1.物理层物理层定义信号是如何进行传输的,各部分的功能如下:(1)物理层信号PLS:实现位定时、位编码/解码、同步等功能。
理想发送器在没有重同步的情况下,每秒发送的位数定义为标称位速率,定义其倒数为标称位时间,它可分为同步段、传播段、相位缓冲段1和相位缓冲段2等几个互补重叠的时间段。
CAN位流根据“不归零”NRZ方式来编码,即在整个位时间里,位电平要么为显性,要么为隐性。
在隐性状态下,VCANH和VCANL被固定于平均电压电平,Vdiff近似为零。
显性状态以大于最小阈值的差分电压表示。
在显位期间,显性状态改变隐性状态并发送。
同步包括硬同步和重同步两种形式。
在一个时间内只允许一种同步。
仅当采样点之前检测到的数值与紧跟边沿之后出现的数值不同时,边沿才用于同步。
(2)物理介质连接PMA:实现总线发送/接收的功能电路,并可提供总线故障检测方法。
CAN2.0规范没有定义该层的驱动器/接收器特性,以便在具体应用中进行优化设计。
STM32F103芯片CAN总线应用程序
/*******************************************************************---------------------Copyright(a)-----------------------------------作者:日期:修改记录:描述:STM32共有14组过滤器,用以对接收到的帧进行过滤。
每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。
对于过滤器组,可以将其配置成屏蔽位模式,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。
过滤器组还可以被配置成标识符列表模式,此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。
例如:CAN_FilterInitStructure.CAN_FilterNumber=0;//设置第一组过滤器CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//屏蔽位模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//32位CAN_FilterInitStructure.CAN_FilterIdHigh=(0x0635<<5);//接收ID为635的消息11位帧ID 标准帧因此左移5CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;//CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//第一组过滤器指向FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);滤波器配置详细如下:1、对扩展数据帧进行过滤:(只接收扩展数据帧)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFF FF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)2、对扩展远程帧过滤:(只接收扩展远程帧)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;3、对标准远程帧过滤:(只接收标准远程帧)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;4、对标准数据帧过滤:(只接收标准数据帧)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;5、对扩展帧进行过滤:(扩展帧不会被过滤掉)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;6、对标准帧进行过滤:(标准帧不会被过滤掉)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;注:slave_id为要过滤的id号。
Linux下基于MCP2515的CAN总线驱动程序设计
Linux下基于MCP2515的CAN总线驱动程序设计随着物联网技术的不断发展,嵌入式系统和传感器网络在各领域得到了广泛应用。
在这些系统中,可以利用CAN总线进行数据通信,实现设备之间的无缝连接和数据交换。
本文将介绍一种基于Linux系统的MCP2515的CAN总线驱动程序设计。
一、MCP2515MCP2515是一种SPI接口的CAN控制器,具有很高的集成度和灵活性。
它包括CAN控制器、CAN收发器和SPI接口。
MCP2515通过SPI接口与主控制器进行通信,可以实现CAN 节点之间的数据通信。
此外,MCP2515还支持各种标准和扩展CAN帧格式。
二、CAN总线驱动程序设计1、编写SPI驱动程序由于MCP2515是通过SPI接口与主控制器进行通信的,所以需要编写SPI驱动程序。
在Linux系统中,可以通过SPI驱动程序来实现与MCP2515的通信。
SPI口的驱动程序可能会因为系统的不同而有所差异。
2、编写CAN驱动程序在Linux中,可以使用SocketCAN实现CAN总线驱动程序。
SocketCAN是Linux内核自带的CAN协议栈,提供了丰富的API和工具,方便开发者开发CAN应用程序。
在编写CAN驱动程序时,需要先对MCP2515进行配置,设置CAN通信参数以及滤波器参数。
通过SocketCAN提供的API函数可以实现CAN帧的发送和接收,从而实现数据通信。
三、示例代码以下是基于Linux系统的MCP2515的CAN总线驱动程序设计的示例代码:1、SPI驱动程序可以通过spidev接口进行使用:```#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <sys/ioctl.h>#include <linux/spi/spidev.h>#define SPI_DEVICE "/dev/spidev0.0"int spi_fd;int spi_open(){if ((spi_fd = open(SPI_DEVICE, O_RDWR)) < 0){printf("Cannot open %s\n", SPI_DEVICE);return -1;}int mode = SPI_MODE_0;int bits_per_word = 8;int speed = 1000000;if (ioctl(spi_fd, SPI_IOC_WR_MODE, &mode) < 0)return -1;if (ioctl(spi_fd, SPI_IOC_WR_BITS_PER_WORD,&bits_per_word) < 0)return -1;if (ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) return -1;return 0;}int spi_close(){close(spi_fd);return 0;}int spi_write_read(char *buf, int len, int speed_hz){int ret;struct spi_ioc_transfer transfer;transfer.tx_buf = (unsigned long)buf;transfer.rx_buf = (unsigned long)buf;transfer.len = len;transfer.speed_hz = speed_hz;transfer.bits_per_word = 8;transfer.delay_usecs = 0;ret = ioctl(spi_fd, SPI_IOC_MESSAGE(1), &transfer); return ret;}```2、CAN驱动程序可以通过SocketCAN提供的API函数实现:```#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <sys/ioctl.h>#include <net/if.h>#include <linux/can.h>#include <linux/can/raw.h>int can_fd;int can_init(const char *ifname){if ((can_fd = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {perror("Socket error\n");return -1;}struct ifreq ifr;strcpy(ifr.ifr_name, ifname);if (ioctl(can_fd, SIOCGIFINDEX, &ifr) < 0){perror("SIOCGIFINDEX error\n");return -1;}struct sockaddr_can addr;memset(&addr, 0, sizeof(addr));addr.can_family = AF_CAN;addr.can_ifindex = ifr.ifr_ifindex;if (bind(can_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0){perror("Bind error\n");return -1;}return 0;}int can_deinit(){close(can_fd);return 0;}int can_send(unsigned int id, unsigned char *data, unsigned char len){struct can_frame frame;memset(&frame, 0, sizeof(struct can_frame));frame.can_id = id;frame.can_dlc = len;memcpy(frame.data, data, len);int ret = write(can_fd, &frame, sizeof(struct can_frame));if (ret != sizeof(struct can_frame)){perror("Write error\n");return -1;}return 0;}int can_recv(unsigned int *id, unsigned char *data, unsigned char *len){struct can_frame frame;int ret = read(can_fd, &frame, sizeof(struct can_frame));if (ret < 0){perror("Read error\n");return -1;}*id = frame.can_id;memcpy(data, frame.data, frame.can_dlc);*len = frame.can_dlc;return 0;}```四、结语在Linux系统中,基于MCP2515的CAN总线驱动程序设计相对较为简单,可以利用SocketCAN实现。
STM32F103芯片CAN总线应用程序
/*******************************************************************---------------------Copyright(a)-----------------------------------作者:日期:修改记录:描述:STM32共有14组过滤器,用以对接收到的帧进行过滤。
每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。
对于过滤器组,可以将其配置成屏蔽位模式,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。
过滤器组还可以被配置成标识符列表模式,此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。
例如:CAN_FilterInitStructure.CAN_FilterNumber=0;//设置第一组过滤器CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//屏蔽位模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//32位CAN_FilterInitStructure.CAN_FilterIdHigh=(0x0635<<5);//接收ID为635的消息11位帧ID 标准帧因此左移5CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;//CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//第一组过滤器指向FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);滤波器配置详细如下:1、对扩展数据帧进行过滤:(只接收扩展数据帧)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFF FF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)2、对扩展远程帧过滤:(只接收扩展远程帧)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;3、对标准远程帧过滤:(只接收标准远程帧)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;4、对标准数据帧过滤:(只接收标准数据帧)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;5、对扩展帧进行过滤:(扩展帧不会被过滤掉)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;6、对标准帧进行过滤:(标准帧不会被过滤掉)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;注:slave_id为要过滤的id号。
CAN总线介绍(最终版)..
OSI参考模型 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层
汽车和工业自 动化领域广泛 应用
2 数据 链路层 1 物理层
LLC MAC PLS PMA MDI
LLC, Logical Link Control MAC, Medium Access Control PLS, Physical Signaling Sublayer PMA, Physical Medium Attachment MDI, Medium Dependent Interface
节点A 节点B 节点C
Data
ID=250
ID=250
Data
ID=1000
ID=1000
ID=1000
Data
总线
ID=75
竞争阶段
Data
ITM
ID=250
竞争阶段
Data
ITM
ID=1000
竞争阶段
Data
t
26
CAN基本原理
CAN的帧格式
数据帧携带从发送节点至接收节点的数据 远程帧向其他节点请求发送具有同一标识 符的数据帧 错误帧节点检测到错误后发送错误帧 超载帧在先行的和后续的数据帧(或远程 帧)之间附加一段延时—通常不用
显性 隐性 显性或隐性
显性
隐性表示1,显性表示0
24
CAN基本原理
CAN的总线访问
“线与”机制
“显性”位可以覆 盖“隐性”位;只 有所有节点都发送 “隐性”位,总线 才处于“隐性”状 态 节点在发送报文时 进行回读 通过ID仲裁,ID数 值越小,报文优先 级越高,占有总线
启动can模块及其发送程序
启动can模块及其发送程序一、CAN总线简介CAN(Controller Area Network)总线是一种串行通信协议,广泛应用于汽车、工业控制等领域。
它具有高速、可靠、抗干扰等优点,因此得到了广泛的应用。
二、CAN总线的启动方式1.硬件启动:通过硬件电路实现,可以自动完成CAN总线的初始化。
2.软件启动:需要通过编程实现CAN总线的初始化。
三、启动CAN模块的流程1.配置GPIO口:将GPIO口配置为CAN模块所需的功能。
2.初始化CAN模块:设置波特率、工作模式等参数,并开启CAN模块。
3.配置中断:根据需要配置中断,以便在接收到数据时能够及时处理。
4.发送数据:将要发送的数据写入发送缓存区,并触发发送操作。
四、启动CAN发送程序的流程1.创建socket:使用socket函数创建一个套接字。
2.绑定地址和端口号:使用bind函数将套接字与本地IP地址和端口号绑定。
3.设置目标地址和端口号:使用connect函数设置远程主机的IP地址和端口号。
4.循环读取输入数据并发送:使用send函数将输入数据发送给远程主机。
五、代码示例以下是一个基于STM32F103C8T6单片机的CAN发送程序示例:```#include "stm32f10x.h"#include "stm32f10x_can.h"void CAN_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;CAN_InitTypeDef CAN_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel =USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);CAN_DeInit(CAN1);CAN_StructInit(&CAN_InitStructure);CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;CAN_InitStructure.CAN_NART=ENABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=ENABLE;CAN_InitStructur e.CAN_Mode=C AN_Mode_Normal ;C AN_InitStructur e.C AN_SJW=C AN_SJW_1tq ;C AN_InitStructur e.C AN_BS1=C AN_BS1_6tq ;C AN_InitStructur e.C AN_BS2=C AN_BS2_7tq ;C AN_InitStructur e.C AN_Prescaler=12 ;CAN_Init(CAN1, &CAN_InitStructure);CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);}void USB_LP_CAN1_RX0_IRQHandler(void){CanRxMsg RxMessage;if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET) {CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //处理接收到的数据CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);}}int main(void){uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};CAN_Configuration();while(1){//向ID为100的节点发送数据CanTxMsg TxMessage;TxMessage.StdId = 100;TxMessage.ExtId = 100;TxMessage.RTR = CAN_RTR_DATA;TxMessage.IDE = CAN_ID_STD;TxMessage.DLC = 8;for(int i=0; i<8; i++)TxMessage.Data[i] = data[i];if(CAN_Transmit(CAN1,&TxMessage)==CAN_NO_MB) break;Delay_ms(100);}}```六、总结启动CAN模块和发送程序需要仔细配置参数,确保通信正常。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Timer_init(); //定时器初始化
Interrupt_init(); //中断
UART_ini();
CAN_init();
Delay(1);
W_WDT();
EA = 1;
//Delay(1);
//UART_Length = 8;
//------------------------------------------------------
// CAN <==> UART的协议转换器
//
// 程序名称:CAN <---> UART协议转换程序<透明方式>
//
// 作者: 王猛
// 创建: 2007-10-09
unsigned char code AMR_ID[4] = {0xff,0xff,0xff,0xff};
unsigned char CAN_TX_ID[4] = {0,0,0,0}; //待发送的目标的ID
unsigned char CAN_RX_ID[4] = {0,0,0,0}; //接收到的信息来自何ID
}
//-----------------------------------------------
//
// 看门狗“喂狗”程序,WDT的一个下降沿触发一次
//
//-----------------------------------------------
void W_WDT(void) //triggle WDT
//
// 说明:
// 1,单片机使用P89C61X2BA
// --晶振11.0592MHZ
// --CAN总线中断使用单片机的中断0,外部有上拉电阻,波特率可以设定
//
// 7,当CAN总线每接收一帧信息后,通过串口发送出去
// -----10.15日,改为可以识别CAN的报文字节长度,即串口只发送CAN报文长度个字节
// 8,看门狗芯片MAX1232CPA,硬件溢出时间1.2S
//
//-------------------------------------------------------
//---------------------------
void System_init(void)
{
CKCON = 0x00; //Fosc devide 12
AUXR = 0x00;//0x02; //EXM enable
LED1 = 0; //LED0-3 off 指示灯,共阴接法,1时亮
//CAN_Transmit(0);
//UART_Transmit();
while (1)
{
W_WDT();
if (CAN_flag == YES)
{
CAN_flag = NOT;
CAN_Transmit(0);
LED1 = !LED1;
unsigned char code CAN_BTR1[10] = {0x7f,0x7f,0x7f,0x7f,0x2f,0x7f,0x4d,0x3e,0x3a,0x23};
// 5K 10K 20K 40K 50K 80K 100K 200K 250K 500K
unsigned char code UART_BTR[4] = {0xe8,0xf4,0xfa};
unsigned char xdata UART_RX_Data[255]; //串口接收到的串行帧
unsigned char xdata CAN_TX_Data[255]; //待发送的数据缓冲区
unsigned char code ACR_ID[4] = {0,0,0,0}; //CAN初始设置验收滤波值
{
}
}
}
//---------------------------------
// 串行口初始化设置
// 方式1,8数据位,一个停止位,无奇偶校验
// 串口中断允许
//------------------------------------
void UART_ini(void)
LED2 = 0;
LED3 = 0;
LED4 = 0;
WDT = 1; //WDT ini
CAN_DataLength = 8;
UART_DataLength = 0;
UART_Length = 0;
CAN_flag = NOT;
CAN_ERROR_flag = NOT;
//LED3 = !LED3;
}
else
{
UART_flag = NOT;
}
*/
if ((CAN_ERROR_flag == YES))
{
CAN_ERROR_flag = NOT;
CAN_init();
}
else
{
{
unsigned char i;
WDT = 1;
for (i=0;i<10;i++)
{
}
WDT = 0;
}
//---------------------------------------------------
//
// 中断初始化
//
// ----外部中断0有效,下降沿触发,用于SJA1000产生CAN事件中断
#include
#include
#include
#include "CANCOM.h"
//unsigned char UART_TX_Data[8] = {0,1,2,3,4,5,6,7};
//unsigned char CAN_TX_Data[8] = {0,1,2,3,4,5,6,7};
{
SCON = 0x50; //方式1,波特率可变,8bits,接受允许
PCON&= 0x7F; //SMOD = 0
TMOD |= 0x20; //timer1 mode 2
// 2,CAN总线发送采用查询方式,接收采用中断方式
// 3,看门狗复位时间1.2S
// 4,SJA1000晶振8MHZ,Peil模式
// 5,串口中断接收,查询发送,波特率可设置
// 6,×××当串口收到数据后,每8个数一组打包,通过CAN总线发送出去
//
// -----10.16日,重新修改程序完成以下功能-----
TL1 = UART_BTR[2]; //| f
//| 波特率=----------------------
TH1 = UART_BTR[2]; //| 32*2^smod*12*(256-TL1)
TCON |= 0x40; //start
}
else
{
CAN_flag = NOT;
}
/*
if (UART_flag == YES)
{
UART_flag = NOT;
//Delay(50);
UART_Transmit();
//Clear_Buffer(CAN_RX_Data,8);
CAN_ERROR_flag = NOT;
}
}
}
//---------------------------
// 功能:系统设置
// --外部数据存储区访问使能
// --LED指示灯关(1=on,0=off)
// --流程控制标志置为无效NOT
// --清空串口,CAN的相关数据缓冲区
// 1.2K,2.4K,4.8K
unsigned char CAN_flag; //CAN发送标志位
unsigned char UART_flag; //
unsigned char CAN_ERROR_flag = NOT; //
unsigned char CAN_DataLength = 8; //CAN信息的报文长度
unsigned char UART_DataLength = 0; //串口接收时的当前指示
unsigned char UART_Length = 0; //串口接收区的长度指示
//sbit AAA = P1^4;
void main(void)
{
EA = 0;
//UART_flag = NOT;
Clear_Buffer(UART_RX_Data,255);
Clear_Buffer(CAN_TX_Data,255);
Clear_Buffer(CAN_TX_ID,4);
Clear_Buffer(CAN_RX_ID,4);
Clear_Buffer(CAN_RX_Data,8);
//-----------------------------
void Delay(unsigned char time)
{
unsigned char i;
unsigned int j;
for (i = 0;i < time;i++)
{
W_WDT();
for (j=0;j<30000;j++)
TI = 0;
/*
CAN_flag = YES;
UART_flag = YES;
*/