文档库 最新最全的文档下载
当前位置:文档库 › DZ60的CAN程序

DZ60的CAN程序

DZ60的CAN程序
DZ60的CAN程序

飞思卡尔DZ60 MSCAN

2012-05-09 12:20:15| 分类:单片机 | 标签:飞思卡尔 dz60 mscan |字号订阅

#define EnableCANReInt() (CANRIER |= 0x01)

#define DisableCANReInt() (CANRIER &= ~0x01)

// 2.2 参数宏定义3/4采样

#define SJW 3 // 同步跳转宽度(value between 1 and 4 Tq)

// 位时间长度(通信频率倒数)计算公式:SYSTEM_CLOCK/BRP/(1+TSEG1+TSEG2)

#define BRP 4 // 波特率预分频器(Value between 1 and 64)

#define TSEG1 11 // 位时间时间段1 (value between 1 and 16 Tq)

#define TSEG2 4 // 位时间时间段2 (value between 1 and 8 Tq)

//---------------------------------------------------------------------*

//函数名: CAN_Init *

//功能: 初始化CAN模块 *

//参数: 无*

//返回: 无*

//说明: *

// (1)CAN时钟源使用芯片总线时钟,设置CAN通信频率为250KHz *

// (2)关闭滤波器,接收CAN总线上所有的报文*

//---------------------------------------------------------------------*

void CAN_Init()

{

char sj,p;

char t_seg1, t_seg2;

if(0 == CANCTL1_CANE) // 判断CAN模块是否启动

{

// 未启动系统初始化

CANCTL1_CANE = 1; // 系统初始化后CAN模块默认进入初始化状态}

else

{

CANCTL0_SLPRQ = 1; // CAN模块已经运行还要确保MSCAN没有等待发送的队列

while(0 == CANCTL1_SLPAK); // 将CAN模块置入睡眠模式

CANCTL0_INITRQ = 1;

while(0 == CANCTL1_INITAK); // 将CAN模块置入初始化模式

}

//设置屏蔽

CANIDAC = 0x00; // 0x00 2x32位滤波器

// 0x10 4x16位滤波器

CANIDMR0 = 0x00; // 0x20 8x8 位滤波器

CANIDMR1 = 0x18; // 所有滤波器(掩码位)都是0位有效

CANIDMR2 = 0xff; // 标准格式下后16位可屏蔽掉

CANIDMR3 = 0xff;

CANIDAR0 = 0x24;

CANIDAR1 = 0x20;

CANIDAR2 = 0x00;

CANIDAR3 = 0x00;

CANIDMR4 = 0x00; // 掩码滤波

CANIDMR5 = 0x18;

CANIDMR6 = 0x00;

CANIDMR7 = 0x01;

CANIDAR4 = 0x08; // 接收比较屏蔽

CANIDAR5 = 0x80;

CANIDAR6 = 0x00;

CANIDAR7 = 0x80; // 接受屏蔽ID

sj = (SJW -1) <<6;

p = (BRP -1); // 设置同步及波特率预分频数

CANBTR0 = (sj | p); // 0b10000001 跳转宽度3Tq 预分频2

//CANBTR0 = 0xc0; // 3/4跳转32分频

t_seg1 = (TSEG1-1); // 时段1和时段2 的tq个数

t_seg2 = (TSEG2-1)<<4;

CANBTR1 = (t_seg1 | t_seg2); // 0B00100101 每位采一个样本TSEG2:3Tq时钟周期TSEG1:6Tq

CANCTL1 = 0xc0; // 使能MSCAN模块,设置为一般运行模式,内部总线时钟源250kbps

// 位时间长度(通信频率倒

数)=SYSTEM_CLOCK/BRP/(1+TSEG1+TSEG2)

//CANCTL1_LOOPB=1; // CAN模块设为回环自测模式

CANCTL0 = 0x00; // 返回一般模式运行

while(CANCTL1_INITAK); // 等待回到一般运行模式

while(CANCTL0_SYNCH == 0); // 等待总线时钟同步

CANRIER_RXFIE = 1; // 开接收中断

}

//---------------------------------------------------------------------*

//函数名: CAN_Send_Msg *

//功能: 通过CAN模块发送一个报文 *

//参数: CANMsg *sendMsgBuf 待发送的报文指针 *

//返回: uint8 指示是否成功发送*

//说明: 在发数据前,要定义和初始化一个报文变量,类型为CANMsg *

//---------------------------------------------------------------------*

uint8 CAN_Send_Msg(uint8 *temp_data, uint8 *temp_id)

{

uint8 txEmptyBuf; // 空闲发送缓冲区掩码

uint8 i;

if(dataLen > 8) // 检查数据长度

{

return 0;

}

if(0 == CANCTL0_SYNCH) // 检查总线时钟{

return 0;

}

txEmptyBuf = 0;

do

{ // 寻找空闲的缓冲器

CANTBSEL = CANTFLG;

txEmptyBuf = CANTBSEL;

}

while(!txEmptyBuf); // 写入标识符

//////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////标准ID格式//////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////

if(0 == IDE) // 标准ID格式

{

//CANTIDR0 = idTemp;

CANTIDR0 = temp_id[0];

CANTIDR1 = temp_id[1];

CANTIDR1_SRR = RTR;

CANTIDR1_IDE = 0;

}

//////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////扩展ID格式////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////

else // 扩展格式ID

{

CANTIDR0 = temp_id[0];

CANTIDR1 = temp_id[1];

CANTIDR2 = temp_id[2];

CANTIDR3 = temp_id[3];

CANTIDR1_SRR = RTR; // 扩展格式时RTR置位

CANTIDR1_IDE = 1; // 扩展帧

CANTIDR3_RTR = 0; // 0 数据帧 1 远程帧}

//////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////数据帧格式////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////

if(0 == RTR) // 判断是否为数据帧

{

for(i = 0; i < dataLen; i++) // 写入数据帧

{

*((&CANTDSR0)+i) = temp_data[i];

}

CANTDLR = dataLen; // 写入数据长度

}

//////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////远程帧格式////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////// else

{

CANTDLR = 0; // 远程帧

CANTIDR0 = temp_id[0];

CANTIDR1 = temp_id[1];

CANTIDR2 = temp_id[2];

CANTIDR3 = temp_id[3];

CANTIDR3_RTR = RTR;

CANTIDR1_SRR = 1; // 扩展格式时RTR置位

CANTIDR1_IDE = 1; // 扩展帧

}

CANTTBPR = priority; // 写入优先级

// 清TXx标志,缓冲器准备发送CANTFLG = txEmptyBuf; // 相关位写1清零

return 1;

}

//---------------------------------------------------------------------*

//函数名:VCAN_RX() *

//功能:中断程序处理 *

//参数: 无*

//返回: 无*

//说明: *

// (1)CAN时钟源使用芯片总线时钟,设置CAN通信频率为250KHz *

// (2)关闭滤波器,接收CAN总线上所有的报文*

//---------------------------------------------------------------------*

#pragma CODE_SEG NON_BANKED

interrupt 28 VCAN_RX (void)

{

uint8 i;

CANRIER_RXFIE = 0; // 禁止接收中断

CANCTL0_RXFRM = 1;

//////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////标准ID格式////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////

if(0 == (CANRIDR1&0x08)) // 检测CAN协议报文模式(一般/扩展)标识符读出标识符

{

recID[0] = CANRIDR0; // 收到标准ID格式

recID[1] = CANRIDR1; // 收到标准ID格式

RTR = CANRIDR1_SRR;

IDE = 0;

}

//////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////扩展ID格式////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////// else // 收到扩展格式ID

{

recID[0] = CANRIDR0; // 收到扩展ID格式

recID[1] = CANRIDR1; // 收到扩展ID格式

recID[2] = CANRIDR2; // 收到扩展ID格式

recID[3] = CANRIDR3; // 收到扩展ID格式

RTR = CANRIDR3_RTR;

IDE = 1;

}

//////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////数据帧格式////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////

if(0 == RTR) // 判断是否为数据帧

{

dataLen = CANRDLR_DLC; // 读取数据帧长度

for(i = 0; i < dataLen &&i<8; i++)

{

Rxdata[i] = *((&CANRDSR0)+i); // 读取数据

}

}

//////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////远程帧格式////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////

else // 远程帧

{

dataLen = CANRDLR_DLC;

sendID[0] = CANRIDR0;

sendID[1] = CANRIDR1;

sendID[2] = CANRIDR2;

sendID[3] = CANRIDR3;

CANRIDR3_RTR = RTR;

CANTIDR1_SRR = RTR; // 扩展格式时RTR置位

CANTIDR1_IDE = 1; // 扩展帧

}

CANRFLG = 1;

CANRIER_RXFIE = 1; // 接收缓冲器已满报文成功接收}

CAN总线通信接口及程序设计毕业设计

机电工程学院 毕业设计说明书设计题目: CAN总线通信接口及程序设计 2012 年 5 月21 日

目次

1 CAN总线介绍 1.1 CAN总线的发展背景 随着汽车产业的发展,需要一种更利于信息数据传输交换的通信协议。汽车中的各种电子控制系统需要较高的技术支持,而随着汽车的发展,汽车是否安全、是否便利、成本是否低、是否舒适都已成为人们首要考虑的事情。但是传统的汽车控制技术已不足以满足人们越来越高的要求,也已不适以汽车的发展方向。20世纪80年代,德国Bosch公司着手研究用于汽车产业的新的通信协议及控制方法,并首先提出了CAN总线控制系统。这一崭新的网络协议使得汽车产业得到了飞速的发展。 CAN总线最明显的特点是最大程度地减少了汽车控制系统中的线束的数量及长度,另外还大大提高了系统控制的可靠性和稳定性。在没有CAN总线协议之前,一辆汽车中用于各种控制通信的线束的总长度达3公里之长,严重影响了汽车的通信速度和通信精度。并且还使汽车的整体结构繁冗复杂,可靠性低,成本高,难以维护。因此CAN总线的出现无疑具有重大的意义和作用。作为一种新的网络通信协议,CAN总线不仅减少了汽车中线束的长度,还提高了汽车的整体性能,极大的促进了汽车产业的发展。 CAN总线刚被提出的时候,仅仅应用于汽车产业上,但CAN总线通信协议的性能和可靠性经过多年的检验,已被应用于越来越多的产业,比如航空、船舶、机床等产业设备方面。仅仅二十多年的发展,CAN总线便已成为自动化领域技术的潮流。 CAN总线是串行通信网络。传统运用的是基于R线构建分布式控制系统,这种传统的控制系统是基于通信节点的地址编码的,因此其结构复杂,直接导致系统的通信效率不高,并且控制的可靠性能低。CAN总线通过每个网络节点进行数据通信,每个节点可以互相收发数据,CAN总线协议对通信数据编码,不对节点地址编码,使各个节点可以同时接收到相同的数据,大大增强了数据通信的实时控制及传输性能。另一方面CAN总线使用起来非常方便。CAN总线的结构十分简单,仅有2根线(CANH和CANL)和外部设备相连,但CAN总线的内部却有非常复杂和智能的通信模块,可以方便快捷准确无误的进行数据

CAN总线通信系统上位机通信软件设计

目次 1 绪论 (1) 1.1 研究背景 (1) 1.2 研究目的和意义 (1) 1.3 国内外发展现状 (2) 1.4 论文结构安排 (2) 2 CAN总线协议分析 (3) 2.1 CAN-bus 规范V2.0 版本 (3) 2.2 CAN控制器SJA1000 (6) 2.3 本章小结 (6) 3 开发环境介绍 (6) 3.1 开发环境 (6) 3.2 CANUSB—Ⅰ/Ⅱ智能CAN接口卡 (7) 3.3 本章小结 (8) 4 CAN通信软件设计 (8) 4.1 驱动程序安装 (8) 4.2 CAN接口卡函数库说明 (8) 4.3 界面设计 (11) 4.4 软件功能实现 (16) 4.5 本章小结 (22) 5 测试及发布 (23) 5.1 软件功能测试 (23) 5.2 程序发布 (24) 5.3 本章小结 (27) 结论 (28) 致谢 (29) 参考文献 (30)

1绪论 现场总线,就是应用于工业现场,采用总线方式连接多个设备,用于传输工业现场各种数据的一类通信系统[1]。CAN(Controller Area Network)总线是现场总线的一个分支,因其具有很高的可靠性和性能价格比,已经成为国际标准,在工业过程监控设备的互连方面得到广泛应用,受到工业界的广泛重视,并已被公认为几种最有前途的现场总线之一。 1.1 研究背景 随着计算机硬件、软件技术及集成电路技术的迅速发展,工业控制系统已成为计算机技术应用领域中最具活力的一个分支,并取得了巨大进步。由于对系统可靠性和灵活性的高要求,工业控制系统的发展主要表现为:控制多元化,系统面向分散化,即负载分散、功能分散、危险分散和地域分散。分散式工业控制系统就是为适应这种需要而发展起来的。这类系统是以微型机为核心,将5C技术——Computer(计算机技术)、Control(自动控制技术)、Communication(通信技术)、CRT(显示技术)和Change(转换技术)紧密结合的产物。它在适应范围、可扩展性、可维护性以及抗故障能力等方面,较之分散型仪表控制系统和集中型计算机控制系统都具有明显的优越性。典型的分散式控制系统有现场设备、接口与计算设备以及通信设备组成,现场总线(Field bus)就是在这种背景下产生的[2]。 1.2 研究目的和意义 从19世纪发明汽车以来,人们就一直在乘坐的舒适性、安全性和操控性方面不停地对其进行改革和创新,车上的电子设备也越来越多。这些电子设备大多是需要协同工作的,这就要求各部件之间能互相通信[1]。 为了解决汽车通信问题,CAN—bus应运而生,凭借可靠、实时、经济和灵活的特点,CAN总线很快在其他行业得到广泛应用,特别是在工业控制领域更是如鱼得水。现在CAN—bus总线已经成为全球范围内最重要的现场总线之一,甚至引领着现场总线的发展。 工业控制系统涉及众多软、硬件模块,给程序的设计和调试带来一定难度。尤其作为上、下位机间联系纽带的CAN总线通信部分,一旦在整个系统运行期间发生问题,若没有良好的人机界面和测试手段,将很难及时准确地找到并排除故障。同样,在控制系统的研制过程中,为了尽可能地减少故障和缩小故障范围,也应设计相应的测试

基于STC89C51的CAN总线点对点通信模块设计

基于STC89C51的CAN总线点对点通信模块设计 [导读]随着人们对总线对总线各方面要求的不断提高,总线上的系统数量越来越多,继而出现电路的复杂性提高、可靠性下降、成本增加等问题。为解决上述问题,文中阐述了基于SJAl000的CAN总线通信模块的实现方法,该方法以PCA82C250作为通信模块的总线收发器,以SITA-l000作为网络控制器。并以STCSTC89C5l单片机来完成基于STC89C5l的CAN通信硬件设计。文章还就平台的初始化、模块的发送和接收进行了设计和分析。通过测试分析证明,该系统可以达到CAN的通信要求,整个系统具有较高的实用性。 0 引言 现场总线是应用在生产最底层的一种总线型拓扑网络,是可用做现场控制系统直接与所有受控设备节点串行相连的通信网络。在工业自动化方面,其控制的现场范围可以从一台家电设备到一个车间、一个工厂。一般情况下,受控设备和网络所处的环境可能很特殊,对信号的干扰往往也是多方面的。但要求控制则必须实时性很强,这就决定了现场总线有别于一般的网络特点。此外,由于现场总线的设备通常是标准化和功能模块化,因而还具有设计简单、易于重构等特点。 1 CAN总线概述 CAN (Controller Area Network)即控制器局域网络,最初是由德国Bosch公司为汽车检测和控制系统而设计的。与一般的通信总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性。其良好的性能及独特的设计,使CAN总线越来越受到人们的重视。由于CAN总线本身的特点,其应用范围目前已不再局限于汽车行业,而向自动控制、航空航天、航海、过程工业、机械工业、纺织机械、农用机械、机器人、数控机床、医疗器械及传感器等领域发展。目前,CAN已经形成国际标准,并已被公认为几种最有前途的现场总线之一。它的直线通信距离最大可以达到l Mbps/30m.其它的节点数目取决于总线驱动电路,目前可以达到110个。 2 CAN系统硬件设计 图1所示是基于CAN2.0B协议的CAN系统硬件框图,该系统包括电源模块、MCU部分、CAN控制器、光电耦合器、CAN收发器和RS232接口。硬件系统MCU采用STC89C5l,CAN控制器采用SJAl000,CAN收发器采用PCA82C250,光耦隔离采用6N137。

CAN总线学习心得--重要

CAN总线学习心得--重要 SJ A1 0 0 0 的常用标准波特率设置,为什么基本上都是单次采样?即使是低速的时候也是这样的,既然T SEG1 的设置周期都很大,比如都大于1 0 了,为什么不让他采样三次呢?答:是不好理解,但那是Ci A 推荐的值。用5 1 系列芯片和两个SJ A1 0 0 0 接口还要外扩一个RAM,请问5 1 的AL E 能否同时与三个芯片的AL E 管脚相连( 地址不同) 有哪位高手做过双SJ A1 0 0 0 冗余的请指教!答:能同时连接。请问CAN 总线在想传输1 0 0 0 m 的情况下, 最快的速度能到多少呢?答: 5 0 k b p s = 1 3 0 0 m。如果一个网络中只有 2 个节点, 其中一个处于监听模式,另一个节点发送报文会使处于监听模式的节点进入中断吗?答:能进入接收中断,你自己的试验也可以证明。想组建一个简单的CAN 网络, 已经有两个节点, 我想问CAN 总线如何组建, 终端电阻安装在哪里?小弟还没有入门, 大虾们指点一下。答1 :直接将节点CANH 和CANL 连到总线上,终端电阻接在总线两端,大约1 2 0 欧。答2 :推荐北航出版《现场总线CAN 原理与应用技术》,研读一下。请问各位老师:我是一名c a n 总线的新手,我正在做c a n 总线的开发,控制器用s j a 1 0 0 0 t ( 我自己两个控制板互通) , 但我在发送数据后将出现总线关闭,我看到发送错误计数器在不断增加,直到0 x f f 最后恢复到0 x 7 f , 谢谢各位老师帮我解答这个问题。或者对我给与启发答1 ;首先调通单个节点。答2 :这是单节点发送没有成功( 或者由于网络中其他节点没有收到帧并在响应场响应) 建议参考网站CAN 应用方案。我想请教各位c a n 远程贞有何作用?如何应用?在什么情况下才需要用到远程贞?谢谢了!答:远程帧的用与不用完全取决你自己的协议,c a n 有远程帧的功能,是可用可不用的!用网站提供的计算波特率的工具算出的数,1 2 k 以上的都正确,无论是自接收还是两个节点通讯都没有任何问题。但是1 2 k 以下的数据一个都不能用,两个节点通讯没有成功的,自接收有1 0 k 的几个数据成功。我们的项目要求必须在1 0 k 以下,最好是5 k ,但是不成功,自己计算的数据也没有成功的。(我们至少试验了3 0 多个,所有情况都考虑了。)我现在怀疑s j a 1 0 0 0 的波特率根本达不到5 k 和相对应的传输1 0 k m。或者可以谁能提供个经过实践检验的正确的总线定时器0 和1 的设置呢?要求低于1 0 k 。答:PCA8 2 C2 5 0 / 2 5 1 可以保证5 KBPS 的速率;比如Z L GCAN 系列接口卡。答:t j a 1 0 5 0 在低速时好像有问题。我用1 0 5 0 进行5 k 的时候不行,用8 2 c 2 5 0 很好,你可以试一试。我本想双机调试,一边收,一边发,但跑程序后,发送方会不断进入复位模式,所以现在进行自测试模式,我先进入复位模式,设置进入PEL I CAN 模式,对寄存器初始化后,设置接收,发送中断使能,最后设置进入自接收,单滤波模式,这样初始化就结束了,我的ACR0 ~ ACR3 为0 x 5 5 , 0 x 5 5 , 0 x 5 5 0 x 5 0 , AMR0 ~ AMR3 为0 x f f , 之后,我就往BUF F ER 里填数,0 x 8 8 , 0 x 5 5 , 0 x 5 5 , 0 x 5 5 , 0 x 5 0 , 0 x 3 0 , 0 x 3 1 , .0 x 3 7 , 之后,启动自接收请求命令,但是程序只进入了中断一次,是发送空中断,接收中断没有产生,我读发送错误寄存器,发现有错误产生,我读接收计数寄存器,为0 ,说明我没有收到数,但我读接收BUF F ER 时,值为0 x 5 5 , 0 x 5 5 , 0 x 5 5 , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 , 0 , 0 , 0 , 0 , 以上测试时,我在CANH 和CANL 之间加入了两个1 2 0 欧的匹配电阻并联在一起的,请各位高手指点呀,谢谢了答:在总线上加个CAN 接口卡会方便许多,或者加个捕获功能的示波器也可以检测波形。仿真环境:k e i l u v 2 编译器:k e i l c 5 1 7 . 0 仿真器:t k s - 5 9 1 s c p u : p 8 7 c 5 9 1 程序大小:8 K 左右兄弟在一片CPU 中烧写了一个,运行一个CAN 总线,I I C 总线测试程序能够正常运行。这个基础上加上应用程序后在仿真机中运行正常,但是烧写到c p u 后插入c p u 程序不能运行,请问是什么原因?另外一个问题:在另外一个项目中条件相同,程序只有4 K, 程序正常跑着,CAN 接口可以检测到输出波形但是却不能正确传输数据,在一块旧板子上就可以,比较两者之后发现电路完全相同测量也正常,只是布局不同,请教原因。答:程序已运行了吧?可能是HEX 文件有错;编制程序时注意P8 7 C5 9 1 的ERAM 设置、6 CL K 设置。位流数据采样自发送节点的8 2 c 2 5 0 的T x 管脚。测试条件:p e l i c a n ,扩展,双滤波模式,对方I D:0 x 8 8 , 0 x 1 1 , 0 x 5 5 , 0 x 1 0 ,发送的对方I D 为:0 x 8 8 , 0 x 1 1 , 0 x 0 0 , 0 x 0 0 ,发送2 字节数据为:0 x 0 5 , 0 x 0 6 采集的位流数据如下:0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 请教位流数据的含义?答:自行计算时要区分位,还需要进行“位填充”的逆运行;简单的方法是将此信号连接

CAN单节点的自通信程序

/****************************************************************************** ******** 项目:基于CAN总线的自收发通信 说明:主程序部分 功能:外部按键每按下一次,计数值加一,同时计数值在数码管1、2上显示。 在计数值加一后,会使CAN总线上重新发送数据,此时接收端的计数值也同步更新显示 在数码管3、4上(为便于观察,接收显示的值比发送值大3)。 // CAN主要参数: PeliCAN模式,扩展帧EFF模式 // 29位标示码结构: // 发送数据结构:计数结果,0x02,0x03,0x04,0x05,0x06,0x07,0x08 // 接收数据结构: 待显示数据+其它7个字节的数据 // 本节点的接收代码寄存器值: 0x11,0x22,0x33,0x44 // 本节点的屏蔽代码寄存器值:0x00,0x00,0x00,0x00;可以接收本节点的数据 // 目的节点地址:0x11,0x22,0x33,0x44;可以被本节点接收 模块:can_self.c 作者:PIAE GROUP 注释修改者:特权 修改时间:08.6.17. ******************************************************************************* *******/ /***感谢PIAE工作组提供的源码,这里特权根据自己的编程习惯做了一些修改并添加详细注释***/ #include #include #include "define.h" /////////////////////////////////////////////// //函数:inter0_key (外部中断INT0) //说明:INT0按键为计数按键 // 每按下一次键,计数值加一 //入口:按键中断 //返回:按键加一 /////////////////////////////////////////////// void inter0_key(void) interrupt 0 { EA = 0; //关闭中断 Txd_data++; //计数结果增1,即待发送的数据增1 TXD_flag = 1; //发送数据标志位置位,即重新发送数据以更新数码管的显示数值 EA = 1; //重新开启中断 } ///////////////////////////////////////////////

CAN总线应用

设计(论文)题目:基于CAN总线的楼宇温度检测系统 前言 基于单片机实现传统温度检测技术的特点,提出了基于CAN总线的楼宇温度检测系统方案。该系统方案的硬件平台主要包括温度检测模块和主控平台,并详细介绍了其硬件实现、软件设计思想及流程。实验表明:该系统可实现对楼宇温度的实时检测,并由数码管显示检测结果,对异常情况进行处理,从而实现对楼宇房间温度的有效检测。 在传统的检测技术中,温度检测基本采用单片机系统为主,且大多数都针对工业需要,日常生活中的应用并不多;而通信多基于落后的485总线,不能进行远距离的实时数据传输,更不能与因特网相连,可靠性也不高。因此,本文提出一种基于CAN总线的温度测控技术,该技术适合远距离控制与传输,具有非常高的可靠性。 控制器局域网(Controller Area Network,CAN)是国际上应用最广泛的现场总线之一。CAN总线最早出现在20世纪80年代末的汽车工业中,由德国BOSCH公司最先提出,其主要特性为低成本,且总线利用率高。CAN采用串行通信方式工作,所提供的最高数据传输速率为1Mbit/s,最大通信距离为10km。CAN还具有可靠的错误处理和检错机制,极强的错误检测能力,发送信息遭到破坏后可自动重发;可在高噪声的干扰环境中只用,能够检测出产生的任何错误,当数据的传输距离达到10km时,CAN仍能提供5kbit/s的数据传输速率。 正是基于CAN总线的上述优点,目前CAN总线在众多领域被广泛应用,其应用范围不再局限于原先的汽车行业,而向过程工业、机械工业、纺织工业、数控机床、医疗器械及传感器等领域发展,CAN总线已经形成国际标准,并已被公认为是几种最有前途的现场总线之一。 考虑到CAN总线的高可靠性和远距离传输优点,结合目前温度检测技术的技术瓶颈,即距离短和实时性差的特点,本系统CAN总线应用于传统的温度检测中,也是一种新的尝试。

CAN 总线通信原理分析

CAN总线通信原理分析 CAN(Controller Area Network)总线,即控制器局域网总线,在工业控制、医疗电子、家用电器及传感器领域都得到了广泛的应用。目前国内外文献中针对CAN总线协议分析的文章主要是针对CAN协议的帧结构以或位时序特性进行分析,如文献鲜有从通信的角度对CAN总线协议进行分析,鲜有从工程应用的角度出发,对CAN总线的通信机制进行深入分 析的文章。 1 CAN应用特性及结构构成 CAN总线协议具有两个国际标准,分别是ISO11898和ISO11519。其中,IS011898是通信速率为125 kbps~1Mbps的高速CAN通信标准,属于闭环总线,总线最大长度为40 m/1Mbps。ISO11519定义了通信速率为10~125kbps的低速CAN通信标准,属于开环总线,最大长度为1 km/40kbps。由于电气特性限制,即总线分布电容和分布电阻对总线波形的影响,CAN总线上最大节点数目为110个。对于应用工程师,只需正确配置收发端 的波特率和位参数即可实现收发节点的数据同步。通过CAN控制器硬件对报文的标示符滤波即可实现点对点、一点对多点及全局广播等几种方式传送接收数据。同时,由于CAN报文采用短帧结构,并且每帧均包含CRC校验部分,保证了数据出错率极低。CAN总线在工 程应用中结构构成如图1所示。 系统实现中的CAN应用层、操作系统(在无操作系统的应用中以后台程序实现)及驱动程序共同实现了ISO参考模型中的应用层功能。其中,CAN应用层定义ID分组、发送数据装包、接收数据处理以及应用层总线安全监测;操作系统/后台程序用于在CAN中断到达后调度CAN驱动程序对数据进行处理;驱动程序包括初始化(控制器工作状态设置、波特率设置、验收滤波器配置)、收发驱动及异常处理程序。 对于传输介质层,需要根据环境干扰噪声、总线长度等来确定。在强干扰噪声的情况下必须采用屏蔽线;由于分布电容造成的总线波形失真及分布电阻造成的总线电平的衰减,总线长度需要考虑采用的传输介质的分布电阻和分布电容特性;同时,若采用高速总线还需通过实验确定总线的匹配电阻值。 对于CAN驱动层和应用层,驱动程序包括CAN初始化(包括硬件使能、波特率设置、控制器工作模式设置及验收滤波器ID表配置)、收/发驱动并向上层提供接口函数,其中需要说明的是验收滤波器的ID表配置需要根据应用层对系统ID的分组来进行;CAN应用层 根据总线上各节点之间的数据收发关系进行数据包的ID分组、发送数据装包、接收数据处

CAN总线学习笔记二:CAN自收发程序解读

CAN总线学习笔记二:CAN自收发程序解读 花了一整个下午的时间,彻头彻尾的把 PIAE小组提供的CAN自收发源程序解读了一遍。解读别人的程序是一件挺费时费力的一件事,但是在 对某项技术或者说某个芯片的入门阶段参考别人的程序又是一项必不可少的任务。 对于这个程序,头一个任务当然是把头文件先浏览一遍,能弄明白 的还是先弄明白,对后面程序的解读有好处。C文件里给出了三个头文 件: #include #include #include 第一个reg52.h我就不废话了,下一个intrins.h我在上一篇日志里也详细的作了说明,这里也不提了。can_selfdef.h是程序员自己定义的一个头文件,在这个头文件里除了一些宏定义和管脚的一些 说明外,最重要的就是要弄明白“CAN总线SJA1000寄存器地址定义”。这个我开始也没弄明白,后来反复琢磨,才发现作者在这个 程序里吧SJA1000的寄存器作为单片机的外 部扩展RAM寻址了,从而省去了编写一些底层的驱动程序,这就让大家连SJA1000的datasheet的时序图都不用看了 (不过下一步我想用驱动程序来控制SJA1000)。 看完头文件,可不能从第一个程序依次往下看。应该直接找到主程 序main()解读: void main(void) {

//MCU初始化(主要是各中断寄存器的初始化) SJA_RST = 1; //CAN总线复位管脚复位无效 SJA_CS = 0; //CAN总线片选有效 EX1 = 1; //开MCU外部中断INT1 IT1 = 0;//MCU外部中断INT1为电平触发,也是CAN总线接收中断口 IT0 = 1;//MCU外部中断INT0为下降沿触发 EX0 = 1; //开MCU外部中断INT0 EA = 1; //开MCU总中断 SJA_CS = 1; //CAN总线片选无效,使得对数据总线的操作不会影响SJA1000。 //SJA1000初始化 CAN_init(); //对SJA1000寄存器的读写是采用外部寄存器寻址方式, //所以不需要程序单独控制 片选有效无效 _nop_(); _nop_(); //主循环

can总线通信程序

CAN总线通信程序 // CAN <==> UART的协议转换器 // 说明: // 1,单片机使用P89C61X2BA // --晶振11.0592MH Z // --CAN总线中断使用单片机的中断0,外部有上拉电阻,波特率可以设定 // 2,CAN总线发送采用查询方式,接收采用中断方式 // 3,看门狗复位时间1.2S // 4,SJA1000晶振8MHZ,Peil模式 // 5,串口中断接收,查询发送,波特率可设置 // 6,×××当串口收到数据后,每8个数一组打包,通过CAN总线发送出去 // // -----10.16日,重新修改程序完成以下功能----- // ----此功能已经改为,每收到一帧数据,启动一次CAN传输,传输字节数等于串口收到的数据 // ----串行帧的帧间界定通过当前波特率下传输5个字节为时间间隔,具体为当顺序接收到的任意两个数据,它们之间的时间间隔大于5个字节传送时间,认为这两个数据分属于两个不同的帧 // 7,当CAN总线每接收一帧信息后,通过串口发送出去 // 改为可以识别CAN的报文字节长度,即串口只发送CAN报文长度个字节 // 8,看门狗芯片MAX1232CPA,硬件溢出时间1.2S // //------------------------------------------------------- #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};

CAN总线通信系统上位机通信软件的设计说明

. .. .

目次 1 绪论 (1) 1.1 研究背景 (1) 1.2 研究目的和意义 (1) 1.3 国外发展现状 (2) 1.4 论文结构安排 (2) 2 CAN总线协议分析 (3) 2.1 CAN-bus 规V2.0 版本 (3) 2.2 CAN控制器SJA1000 (6) 2.3 本章小结 (6) 3 开发环境介绍 (6) 3.1 开发环境 (6) 3.2 CANUSB—Ⅰ/Ⅱ智能CAN接口卡 (7) 3.3 本章小结 (8) 4 CAN通信软件设计 (8) 4.1 驱动程序安装 (8) 4.2 CAN接口卡函数库说明 (8) 4.3 界面设计 (11) 4.4 软件功能实现 (16) 4.5 本章小结 (22) 5 测试及发布 (23) 5.1 软件功能测试 (23) 5.2 程序发布 (24) 5.3 本章小结 (27) 结论 (28) 致29 参考文献 (30)

1绪论 现场总线,就是应用于工业现场,采用总线方式连接多个设备,用于传输工业现场各种数据的一类通信系统[1]。CAN(Controller Area Network)总线是现场总线的一个分支,因其具有很高的可靠性和性能价格比,已经成为国际标准,在工业过程监控设备的互连方面得到广泛应用,受到工业界的广泛重视,并已被公认为几种最有前途的现场总线之一。 1.1研究背景 随着计算机硬件、软件技术及集成电路技术的迅速发展,工业控制系统已成为计算机技术应用领域中最具活力的一个分支,并取得了巨大进步。由于对系统可靠性和灵活性的高要求,工业控制系统的发展主要表现为:控制多元化,系统面向分散化,即负载分散、功能分散、危险分散和地域分散。分散式工业控制系统就是为适应这种需要而发展起来的。这类系统是以微型机为核心,将5C技术——Computer(计算机技术)、Control(自动控制技术)、Communication(通信技术)、CRT(显示技术)和Change(转换技术)紧密结合的产物。它在适应围、可扩展性、可维护性以及抗故障能力等方面,较之分散型仪表控制系统和集中型计算机控制系统都具有明显的优越性。典型的分散式控制系统有现场设备、接口与计算设备以及通信设备组成,现场总线(Field bus)就是在这种背景下产生的[2]。 1.2研究目的和意义 从19世纪发明汽车以来,人们就一直在乘坐的舒适性、安全性和操控性方面不停地对其进行改革和创新,车上的电子设备也越来越多。这些电子设备大多是需要协同工作的,这就要求各部件之间能互相通信[1]。 为了解决汽车通信问题,CAN—bus应运而生,凭借可靠、实时、经济和灵活的特点,CAN总线很快在其他行业得到广泛应用,特别是在工业控制领域更是如鱼得水。现在CAN—bus总线已经成为全球围最重要的现场总线之一,甚至引领着现场总线的发展。 工业控制系统涉及众多软、硬件模块,给程序的设计和调试带来一定难度。尤其作为上、下位机间联系纽带的CAN总线通信部分,一旦在整个系统运行期间发生问题,若没有良好的人机界面和测试手段,将很难及时准确地找到并排除故障。同样,在控制系统的研制过程中,为了尽可能地减少故障和缩小故障围,也应设计相应的测试软

mcp2510的can总线收发器程序

mcp2510的can总线收发器程序 pcbomb 发表于 2008-6-30 14:47:00 阅读全文(769) | 回复(1) | 引用通告(0) | 编辑 #i nclude #i nclude "mcp2510.h" void mcp_reset(void) { SPI_init_hw(); //设置成SPI方式 init_can_io(); // SPI_mcp_reset(); // } void mcp_read( unsigned char MCPaddr, unsigned char* readdata, unsigned char length ) { unsigned char loopCnt; SPI_mcp_select(); // Select the MCP device at the SPI bus // Start reading and set first address SPI_mcp_RD_address(MCPaddr); for (loopCnt=0; loopCnt < length; loopCnt++) { // Get a byte and store at pointer *readdata = SPI_putch(MCPaddr); // Increment the pointers to next location // Test++; MCPaddr++; readdata++; } SPI_mcp_unselect(); } void mcp_write( unsigned char MCPaddr, unsigned char* writedata, unsigned char length ) { unsigned char loopCnt; SPI_mcp_select(); // Start write and set first address SPI_mcp_WR_address( MCPaddr ); for (loopCnt=0; loopCnt < length; loopCnt++) { // Write a byte SPI_putch( *writedata ); // Increment the pointer to next location writedata++; }

28335CAN通信程序

详细说明:DSP28335 Can总线通信程序,通过Can总线进行多机通信 文件列表: CAN ...\CAN.CS_ ...\.......\FILE.CDX ...\.......\FILE.DBF ...\.......\FILE.FPT ...\.......\SYMBOL.CDX ...\.......\SYMBOL.DBF ...\.......\SYMBOL.FPT ...\CAN.paf2 ...\CAN.pjt ...\CAN.sbl ...\cc_build_Debug.log ...\CMD ...\...\28335_RAM_lnk.cmd ...\...\DSP2833x_Headers_nonBIOS.cmd ...\Debug ...\Debug.lkf ...\INCLUDE ...\.......\DSP2833x_Adc.h ...\.......\DSP2833x_CpuTimers.h ...\.......\DSP2833x_DefaultIsr.h ...\.......\DSP2833x_DevEmu.h ...\.......\DSP2833x_Device.h ...\.......\DSP2833x_DMA.h ...\.......\DSP2833x_Dma_defines.h ...\.......\DSP2833x_ECan.h ...\.......\DSP2833x_ECap.h ...\.......\DSP2833x_EPwm.h ...\.......\DSP2833x_EPwm_defines.h ...\.......\DSP2833x_EQep.h ...\.......\DSP2833x_Examples.h ...\.......\DSP2833x_GlobalPrototypes.h ...\.......\DSP2833x_Gpio.h ...\.......\DSP2833x_I2c.h ...\.......\DSP2833x_I2c_defines.h ...\.......\DSP2833x_Mcbsp.h ...\.......\DSP2833x_PieCtrl.h ...\.......\DSP2833x_PieVect.h ...\.......\DSP2833x_Project.h ...\.......\DSP2833x_Sci.h ...\.......\DSP2833x_Spi.h ...\.......\DSP2833x_SWPrioritizedIsrLevels.h

CAN总线解析

一、概述 CAN(Controller Area Network)即控制器局域网,是一种能够实现分布式实时控制的串行通信网络。 想到CAN就要想到德国的Bosch公司,因为CAN就是这个公司开发的(和Intel)CAN 有很多优秀的特点,使得它能够被广泛的应用。比如:传输速度最高到1Mbps,通信距离最远到10KM,无损位仲裁机制,多主结构。 近些年来,CAN控制器价格越来越低,很多MCU也集成了CAN控制器。现在每一辆汽车上都装有CAN总线。 一个典型的CAN应用场景: 二、CAN总线标准 CAN总线标准只规定了物理层和数据链路层,需要用户来自定义应用层。不同的CAN标准仅物理层不同。

CAN收发器负责逻辑电平和物理信号之间的转换,将逻辑信号转换成物理信号(差分电平)或者将物理信号转换成逻辑电平。 CAN标准有两个,即IOS11898和IOS11519,两者差分电平特性不同。(有信号时,CANH 3.5V,CANL 1.5V,即显性;没有信号时,CANH 2.5V,CANL 2.5V,即隐性) IOS11898高速CAN电平中,高低电平的幅度低,对应的传输速度快。 双绞线共模消除干扰,是因为电平同时变化,电压差不变。 2.1物理层 CAN有三种接口器件

多个节点连接,只要有一个为低电平,总线就为低电平,只有所有的节点都输出高电平时,才为高电平。所谓“线与”。 CAN总线有5个连续性相同的位后,就会插入一个相反位,产生跳变沿,用于同步。从而消除累计误差。 和485、232一样,CAN的传输速度与距离成反比。 CAN总线终端电阻的接法:

特点:低速CAN在CANH和CANL上串入2.2kΩ的电阻;高速CAN在CANH和CANL 之间并入120Ω电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。(因为大多数双绞线电缆特性阻抗大约在100~120Ω。) 120欧姆只是为了保证阻抗完整性,消除回波反射,提升通信可靠性的,因此,其只需要在总线最远的两端接上120欧姆电阻即可,而中间节点并不需要接(接了反而有可能会引起问题)。因此各位在使用CAN Omega做CAN总线侦听的时候,大多数情况下是不需要这个120欧姆电阻的,当然,即使当前网络中并没有终端匹配电阻,只要传输线长度不长(比如SysCan360比赛环境中,传输线只有1-2米)CAN节点数量不多的情况下,不要这个120欧姆电阻也完全可以工作,甚至,你接任意电阻都是不会有影响的。因为此时传输线长度和波长还相差甚远,节点不多的情况下,反射波的叠加信号强度也不会很强,因此传输线效应完全可以忽略。 而哪些情况需要呢,主要就是,当使用2个CAN Omega对发或者当前网络中仅有2个CAN设备的时候,此时两个端点最好都加上终端匹配电阻,当然,前面也说过了,传输线长度不长的时候,也可以不需要2端120欧姆电阻,但为了信号完整性考虑,加上这两个电阻才是严谨的。 2个120欧姆电阻的意义在于,使用USB CAN调试某些不带终端电阻的中间节点设备时,有时候CAN总线上没有2个120欧姆电阻通信可能会异常,此时可以接入2个120欧姆电阻作为2个终端电阻来作阻抗匹配,这时候其他端点不应接入任何终端电阻!并且,这2个120欧姆电阻不可用1个60欧姆电阻代替!

基于Labview的CAN总线通信仿真

基于虚拟仪器的CAN总线通信仿真 控制器局部网(CAN —CONTROLLERAREANETWORK )是BOSCH公司为现代汽车监测和控制领先推出的一种多主机局部网,由于其卓越性能现已广泛应用于工业自动化、多种控制设备、交通工具、医疗仪器以及建筑、环境控制等众多部门。CAN 是一种多主方式的串行通讯总线。一个由CAN 总线构成的单一网络中.理论上可以挂接无数个节点。实际应用中,节点数目受网络硬件的电气特性所限制。CAN 可提供高达1Mbit/s 的数据传输速率.这使实时控制变得非常容易。另外。硬件的错误检定特性也增强了CAN 的抗电磁干扰能力。 CAN 总线有以下特点: 1) CAN 可以是对等结构,即多主机工作方式,网络上任意一个节点可以在任意时刻主 动地向网络上其它节点发送信息,不分主从,通讯方式灵活。 2) CAN 网络上的节点可以分为不同的优先级,满足不同的实时需要。 3) CAN 采用非破坏性仲裁技术,当两个节点同时向网络上传送信息时,优先级低的节 点自动停止发送,在网络负载很重的情况下不会出现网络瘫痪。 4) CAN 可以点对点、点对多点、点对网络的方式发送和接收数据,通讯距离最远 10km(5kb/s),节点数目可达110个。 5) CAN采用的是短帧结构,每一帧的有效字节数为8个,具有CR(校验和其它检测措 施,数据出错几率极小。CAN 节点在错误严重的情况下,具有自动关闭功能,不会影 响总线上其它节点操作。 6) 通讯介质采用廉价的双绞线,无特殊要求,用户接口简单,容易构成用户系统。 1 CAN总线工作机理 1.1 位仲裁要对数据进行实时处理。就必须将数据快速传送,这就要求数据的物理传输通路有较高的速度。在几个站同时需要发送数据时.要求快速地进行总线分配。实时处理通过网络交换的紧急数据有较大的不同。一个快速变化的物理量。如汽车引擎负载,将比类似汽车引擎温度这样相对变化较慢的物理量更频繁地传送数据并要求更短的延时。 CAN 总线以报文为单位进行数据传送.报文的优先级结合在11 位标识符中.具有最低二进制数的标识符有最高的优先级。这种优先级一旦在系统设计时被确立后就不能再被更改。总线读取中的冲突可通过位仲裁解决。 1.2 报文格式 如图所示,在总线中传送的报文,每帧由7 部分组成。CAN 协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11位.扩展格式为29位。在标准格式中,报文的起始位称为帧起始(SOF).然后是由11位标识符和远程发送请求位(RTR)组成的仲裁场。RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。 控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。它还包括一个保留位(ro),为将来扩展使用。它的最后四个字节用来指明数据场中数据的长度(DLC)。数据

CAN总线控制器 SJA1000源程序(c语言)

CAN总线控制器sja1000源程序 SJA1000 是一种独立控制器用于移动目标和一般工业环境中的区域网络控制CAN 它是PHILIPS 半导体PCA82C200 CAN 控制器BasicCAN 的替代产品而且它增加了一种新的工作模式PeliCAN , 这种模式支持具有很多新特性的CAN 2.0B 协议。 1 特性 和PCA82C200 独立CAN 控制器引脚兼容 和PCA82C200 独立CAN 控制器电气兼容 PCA82C200 模式即默认的BasicCAN 模式 扩展的接收缓冲器64 字节先进先出FIFO 和CAN2.0B 协议兼容PCA82C200 兼容模式中的无源扩展帧 同时支持11 位和29 位识别码 位速率可达1Mbits/s PeliCAN 模式扩展功能 --可读/写访问的错误计数器 --可编程的错误报警限制 --最近一次错误代码寄存器 --对每一个CAN 总线错误的中断 --具体控制位控制的仲裁丢失中断 --单次发送无重发 --只听模式无确认无活动的出错标 志 --支持热插拔软件位速率检测 --验收滤波器扩展4 字节代码4 字节屏蔽 --自身信息接收自接收请求 24MHz 时钟频率 对不同微处理器的接口 可编程的CAN 输出驱动器配置 增强的温度适应-40-+125 #include #include #include //-----------------------沿袭引脚和变量---------------------------------------------- #define uchar unsigned char //宏定义 #define uint unsigned int //宏定义 void MCU_init(void); /*P2口的管脚定义*/ sbit LED1 = P2^6; sbit LED2 = P2^5; sbit SJA_CS = P2^7; //SJA1000片选管脚,低电平有效 //sbit SJA_RST = P1^2; /*P3口的管脚定义*/

AVR单片机Can总线通信控制程序

//================================================== ================================= // 工程名称:汽车041项目目标板3-6程序 // 功能描述:CAN通信,继电器控制,AD采集 // IDE环境: ICCAVR // Init2515: 2515初始化程序 //================================================== ================================= #include "iom16v.h" #include "bit.h" #include "macros.h" #include "stdio.h" //标准输入输出头文件 #include "2515.h" #include "SPI_Ctrl.h" #include "Function.h" #include "CAN0.h" #include "MAX518.h" #include "AD.h" #pragma interrupt_handler Extint0:2 #pragma interrupt_handler timer1_isr:9 #define uint unsigned int #define uchar unsigned char /******************外部中断常量******************/ #define GLOBAL 7 //全局中断位宏定义 #define EXTINT0 6 //外部中断0位宏定义 #define H_SRCLK PORTD|=(1<<6) //上升沿移位

相关文档
相关文档 最新文档