CAN-bus接口控制实验

发布者:innovation2最新更新时间:2016-04-12 来源: eefocus关键字:CAN  bus  接口控制 手机看文章 扫描二维码
随时随地手机看文章
一.实验目的

通过调用CAN 程序库SJA1000_PELI.LIB 的基本函数,实现实验板上CAN 节点
的初始化以及CAN 节点的自发自收测试。
二. 验设备及器件
IBM PC 机 一台
DP-51PROC 单片机综合仿真实验仪 一台
三. 实验内容
编写一段程序,调用SJA1000_PELI.LIB 中的函数,实现CAN 节点的初始化,
能够进行数据的自发自收,并能在LED 上显示相关的信息。
四. 实验要求
学会对CAN 节点的基本操作,理解实现CAN 通信的基本流程。
五. 实验步骤
1. 将CAN-bus PARK 插在到A6 区中,用导线连接A6 区的P1_IO2 到A2 区的P10,
连A6 区的P1_CS 到和A2 区的A15。
2. 使用导线把A2 区的P16 和P17 分别于D5 区的SCL 和SDA 相连。使用导线把
D5 区的RST_L 与VCC 相连
3. 如果用户采用中断方式,将A6 区的P1_INT 接到A2 区的INT0 或INT1 另外改
相应的程序即可。
4. 利用SJA1000_PELI 库编写CAN 节点的初始化和自发自收程序。
5. 利用ZLG7290,将CAN 节点自发自收数据的成功与否显示出来。
六. 实验预习要求
1. 阅读关于CAN 和CAN 相关器件的基本介绍,具备CAN 和CAN 相关器件的基本知
识。
2. 阅读配套光盘中的《SJA1000_PELI 库说明及其使用》文档,了解在如何在程序中
应用SJA1000_PELI 库。
七. 实验参考程序
#include
#include "VIIC_C51.h" //I2C程序库头文件
#include "Sja1000_peli.h" //CAN程序库头文件
#define uchar unsigned char
#define ZLG7290 0x70
sbit RESET_PIN=P1^0;
uchar Display_Buffer[5]={0x0d,0x15,0x15,0x10}; //显示GOOD

uchar CAN_Baudrate_Filter_Buffer[9]={14,0,0,0,0,0xff,0xff,0xff,0xff};
//存放设置波特率和滤波器的数据
uchar Send_CAN_Info_ID[5]={0x88,0x00,0x00,0x00,0x00};
//存放信息帧的数据,符合CAN2.0B
uchar Send_Data_For_Self[8]={ 0x01,0x02,0x03,0x04,
0x05,0x06,0x07,0x08};
//存放数据帧的数据
uchar ScanNum[1];
/*------------------------------------------------------------------------------------
** 函数原型: void Delay_ms(uchar j)
** 功能描述: 该函数用于不精确的延时。在12M,6CLK下,大约延时j*1ms
** 参数说明: 0-255
** 返回值: 无
/*----------------------------------------------------------------------------------*/
void Delay_ms(uchar j)
{
uchar k,l;
for(l=0;l<=j;l++)
{
for(k=0;k<=250;k++)
{
;
}
}
}
/*------------------------------------------------------------------------------------
** 函数原型: unsigned char ZLG7290_SendCmd( unsigned char Data1,
unsigned char Data2)
** 功能描述: 发送命令(对子地址7、8)
** 参数说明: DATA1: 命令1
** DATA2: 命令2
** 返回值: 0 失败
** 1 成功
/*----------------------------------------------------------------------------------*/
unsigned char ZLG7290_SendCmd( unsigned char Data1,
unsigned char Data2)
{
unsigned char Data[2];
Data[0]=Data1;
Data[1]=Data2;
ISendStr(ZLG7290,0x07,Data,2);
Delay_ms(10);
return 1;
}
/*------------------------------------------------------------------------------------
** 函数原型: void ZLG7290_SendDisBuf( unsigned char *disp_buf,
unsigned char num)
** 功能描述: 向显示缓冲区发送数据
** 参数说明: *disp_buf 要发送数据的起始地址
** num 发送个数

** 返回值: 无
/*----------------------------------------------------------------------------------*/
void ZLG7290_SendDisBuf(unsigned char *disp_buf,unsigned char num)
{
unsigned char i;
for(i=0;i {
ZLG7290_SendCmd(0x60+i,*disp_buf);
disp_buf++;
}
}
/*------------------------------------------------------------------------------------
** 函数原型: void SJA1000_Config_Self(void)
** 功能描述: 对SJA1000的在自发自收模式下的初始化配置
** 参数说明: 无
** 返回值: 无
/*----------------------------------------------------------------------------------*/
void SJA1000_Config_Self(void)
{
SJAEntryResetMode(); //进入复位模式
WriteSJAReg(REG_CAN_CDR,0xc8); //选择PeliCAN模式
SetBitMask(REG_CAN_MOD,AFM_BIT); //选择单滤波模式
SetBitMask(REG_CAN_MOD,STM_BIT); //选择自检测模式
WriteSJARegBlock(16,&CAN_Baudrate_Filter_Buffer[1],8);
//设置验收代码/屏蔽寄存器
WriteSJAReg(REG_CAN_OCR,0x1a); //设置输出管脚
SJASetBaudrateStandard(CAN_Baudrate_Filter_Buffer[0]);
//设置总线定时器,确定波特率
SJAQuitResetMode(); //退出复位模式
}
/*------------------------------------------------------------------------------------
** 函数原型: unsigned char Send_Sja1000_Self(void)
** 功能描述: 把数据传送到SJA1000的接收缓冲区,并进行自发自收的测试
** 参数说明: 无
** 返回值: 0 失败
** 1 成功
/*----------------------------------------------------------------------------------*/
unsigned char Send_Sja1000_Self(void)
{
uchar i;
SJA1000_Config_Self();
WriteSJAReg(REG_CAN_IER,0x03); //使能接收发送中断标志位
Delay_ms(100);
for(i=0;i<2;i++)
{
if((ReadSJAReg(REG_CAN_SR)&0x0c)==0x0c)//判断是否可以发送
{
WriteSJARegBlock(16,Send_CAN_Info_ID,5);
//扩展帧,向发送缓冲区写入5个数据
WriteSJARegBlock(21,Send_Data_For_Self,8);
//扩展帧,向发送缓冲区写入8个数据

SetBitMask(REG_CAN_CMR,SRR_BIT); //使能自发送请求标志位
return(1); //返回发送成功标志
}
else
{
Delay_ms(200); //延时200ms
}
return(0); //返回发送失败标志
}
}
/*------------------------------------------------------------------------------------
** 函数原型: void main(void)
** 功能描述: 主函数
** 参数说明: 无
** 返回值: 无
/*----------------------------------------------------------------------------------*/
void main()
{
RESET_PIN=0;
//将SJA1000的复位线与P1.0相连接
Delay_ms(1);
RESET_PIN=1;
//控制P1.0来实现SJA1000的复位
SJA_CS_Point=&CAN_SJA_BaseAdr; //确定SJA1000的基址
ScanNum[0]=0; //不显示
Display_Buffer[0]=0x1f;
ZLG7290_SendDisBuf(Display_Buffer,0);
ISendStr(ZLG7290,0x0d,ScanNum,1);
Delay_ms(100);
if(Send_Sja1000_Self())
{
Delay_ms(200);
if((ReadSJAReg(REG_CAN_IR)==0x03)) //查询接收/发送中断位
{
WriteSJAReg(REG_CAN_CMR,4); //释放接收缓冲区
ScanNum[0]=3; //扫描4位
Display_Buffer[0]=0x0d; //显示Good
Display_Buffer[1]=0x15;
Display_Buffer[2]=0x15;
Display_Buffer[3]=0x10;
ISendStr(ZLG7290,0x0d,ScanNum,1);
ZLG7290_SendDisBuf(Display_Buffer,4);
}
else
{
ScanNum[0]=4; //扫描5位
Display_Buffer[0]=0x18; //显示Error
Display_Buffer[1]=0x15;
Display_Buffer[2]=0x18;
Display_Buffer[3]=0x18;
Display_Buffer[4]=0x0e;
ISendStr(ZLG7290,0x0d,ScanNum,1);

}
else
{
ScanNum[0]=4; //扫描5位
Display_Buffer[0]=0x18; //显示Error
Display_Buffer[1]=0x15;
Display_Buffer[2]=0x18;
Display_Buffer[3]=0x18;
Display_Buffer[4]=0x0e;
ISendStr(ZLG7290,0x0d,ScanNum,1);
ZLG7290_SendDisBuf(Display_Buffer,5);
}
while(1)
{
; //死循环
}
}
在本示范程序中,采用了查询中断标志位的方式来判断自发自收数据是否成功。用户也
可以将SJA1000的INT管脚连接到MCU的外部中断管脚上,并使能相应的中断位,在程序
中编写中断服务程序来实现同样的功能。采用中断的方式,可以提高系统的实时性。特别是
在接收数据的时候,采用中断方式可以在效率和实时性上比采用查询方式得到很大的提高。
接收数据采用中断方式的程序流程图如下所示。

图3.42 CAN 节点自发自收基本流程图
九. 实验思考题
(1) 请用户思考一下,如何编写CAN 总线数据的正常发送程序。
(2) 请用户再思考一下,如何编写CAN 总线数据的接收程序。

关键字:CAN  bus  接口控制 引用地址:CAN-bus接口控制实验

上一篇:如何一步一步建立CAN通讯
下一篇:SJA1000 CAN驱动程序演示实验

推荐阅读最新更新时间:2024-05-03 00:18

STM32的CAN总线过滤器的配置
stm32的can总线的配置如下: CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式 CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失) CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure
[单片机]
基于DSP的高低速CAN总线汽车控制系统设计
    随着现代汽车性能的不断提升,新的控制功能不断增加,如中央门锁、灯光控制、玻璃升降、后视镜调节、天窗控制、座椅调节和点火延时控制等。     传统的控制系统多采用继电器和独立模式控制,使得车内线束过多且布线复杂,从而造成了严重的电磁干扰,导致系统的可靠性下降。目前,很多汽车采用CAN总线将整个汽车控制系统联系起来统一管理,实现数据共享和相互之间协同工作,使车内线束布线方便可靠,提高了汽车整体的安全性和性价比,增强了自身的竞争力。而各个控制单元对系统的响应时间要求不一样,如防抱死制动系统(ABS)、驱动防滑系统(ASR)、电控行驶平稳系统(ESP)、安全气囊(SRS)等对系统实时性要求较高;照明控制、空调控制等对系统的响应时
[嵌入式]
STM32 CAN 控制
CAN简介 CAN是ControllerAreaNetwork的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986年德国电气商博世公司开发出面向汽车的CAN通信协议。此后,CAN通过ISO11898及ISO11519进行了标准化,现在在欧洲已是汽车网络的标准协议。 CAN控制器根据两根线上的电位差来判断总线电平。总线电平
[单片机]
基于CAN总线的阀门远程控制系统
0 引言     普通电动阀门是一种通用的执行单元,它作为一种重要的执行器件广泛地用于工业流程控制领域,具有不可替代的作用。阀门电动装置是以电机为动力,带动机械减速装置将动力传给阀门,实现阀门开启和关闭的最终部件,它是电动阀门中的核心部分。近年来,国内生产电动阀门的厂商通过对国际先进技术的引进和吸收,以及与Limitorque、Rotork等国际著名企业的合作,已经逐步掌握了机械传动、制造等一些核心技术,加之价格方面的优势,取得了国内市场的主导地位。随着工业自动化水平的提高,尤其是现场总线技术的出现,仅有现场操作以及简单的点对点控制功能的电动阀门越来越难以满足市场需要,国外各大公司纷纷推出现场总线电动阀门产品,但价格高昂。因
[嵌入式]
CAN总线在波动仿生推进器中的应用
0 引言   作为一种面向水下航行器的新型仿生推进装置,波动仿生推进器主要模拟依靠身体波动式推进的鱼类的游动方式,以单柔性长鳍的波动推进为基础,利用多背鳍之间的协同控制来产生推力、升力、偏航和俯仰力矩。在机构设计上,一个单柔性长鳍由若干根鳍条组成,通过对这若干根鳍条进行不同的配置,可以实现单柔性长鳍不同的波形。而波形参数(波长、波幅、波频、波传播方向等)的不同将直接影响到单柔性长鳍所产生推力的大小。在研究初期,需要对单柔性长鳍进行灵活控制,以便确定推进效率最优的波形参数。为此,我们设计了一种多电机独立控制方案,即由一个电机控制一根鳍条,通过电机之间的协调来实现对单柔性长鳍的波动控制。   CAN(Controller Ar
[嵌入式]
基于SJA1000的CAN总线控制系统的设计与实现
0 引言 CAN-bus(Controller Area Network)即控制器局域网是国际上应用最广泛的现场总线之一。最初CAN-bus被设计作为汽车环境中的微控制器通讯工具,用于在车载各电子控制装置ECU之间交换信息,从而形成汽车电子控制网络。如今,CAN-bus作为一种技术先进、可靠性高、功能完善、成本合理的远程网络通讯控制方式,已被广泛应用到各个自动化控制系统中。而且CAN-bus总线在通信能力、可靠性、实时性、灵活性、易用性、传输距离等方面较RS-485总线有着明显的优势。因而用CAN总线取代RS-485总线将是大势所趋。 1 CAN总线的主要特性 CAN总线与其它通信网的不同之处有二:一是报文传送中不包含目标地址
[工业控制]
基于SJA1000的<font color='red'>CAN</font>总线<font color='red'>控制</font>系统的设计与实现
基于ARM的CAN总线电缆沟道监测系统的设计
  1 引言        城市高低压输电电缆人地率已成为城市管理水平的标志之一。城市输配电电缆近年正逐渐从架空线改为电力电缆,电缆沟道作为电缆线路的通道,其建设速度逐年加快,建设里程逐年递增,以后更会大规模展开。 研制一套电缆沟道检测系统,采用现代化的设备和手段对电缆沟道环境和电缆运行状态进行实时传输,全程监测,状态显示,临界报警,预测提示,事件分析统计等,通过此设备使电缆沟道的管理由人工周期巡检,事后补救式转变为全程实时监测、人工周期维护和事件应急反应处理相结合的管理模式。将事故隐患消除在萌芽状态,防患于未然,降低事故发生率和人员成本,提高供电质量,增加经济效益。这里基于 LPC2292 控制器和CAN现场总线
[嵌入式]
找到CAN总线(故障)节点的三种办法
CAN总线的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持,在带来便利的同时,也为工程师们故障排查增加了难度,所以本文主要给大家介绍了找到CAN总线(故障)节点的三种办法。 1、 将所有节点都拔掉,依次往上接。 当CAN总线出现故障后将所有节点都拔掉,之后一个一个节点往上接,接到系统出错时,即找到最后一个插入节点为故障节点。如下这种情况,图1为新能源车控制总线,车辆启动后仪表显示滞后,显示错误。导致司机判断延迟与错误,影响交通安全。将所有节点拔掉之后,采用此方法挨个节点往上接,直到电机控制器接到总线上出现了通信故障,初步判断为电动机运行产生的强干扰,串扰到CAN总线上,导致帧错误增加,重发频繁,正
[嵌入式]
找到<font color='red'>CAN</font>总线(故障)节点的三种办法
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved