CAN-bus接口控制实验

2016-04-12 20:38:41来源: eefocus 关键字:CAN  bus  接口控制
 
分享到
微博
QQ
微信
LinkedIn
一.实验目的

通过调用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<num;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接口控制实验的更多相关文章

  1. BeagleBone Black板第四课:简单LED控制实验

    BBB板第四课:简单LED控制实验 学习BBB板的终于目的是想像单片机一样做控制,但控制思路全然不一样(Linux下控制硬件设备实质就是对相关设备虚拟文件的读写).研究了几天头都大了还是没有进展,网上 ...

  2. 微型计算机系统实验总结(学习性实验:IO地址译码,可编程并行接口8255,交通灯控制实验 + 自主设计实验:汽车信号灯控制系统,电风扇控制器,洗衣机控制系统,霓虹灯,电梯控制系统)

    实验配套软件: https://download.csdn.net/download/qq_39932172/11221584 实验指导用书: 教师版: https://download.csdn.n ...

  3. [芯片] 4、接口技术·实验四·串行接口8251A

    目录 一.实验目的和要求... 2 二.实验原理与背景... 3 三.实验具体的内容... 3 四.实验的代码说明... 4 五.实验结果的分析... 6 附录资料 一.实验目的和要求 学会8251芯 ...

  4. [芯片] 3、接口技术·实验三·可编程并行接口8255A

    目录 一.实验目的和要求 二.实验原理与背景 2-1.8255A简介 2-2.8255A编程 三.实验具体的内容 3-1.8255方式0实验1 3-2.8255方式0实验2 3-3.8255方式1输出 ...

  5. 单片机与控制实验(5)——重量测量并在LCD12864显示

    一.实验目的和要求 掌握点阵式液晶显示屏的原理和控制方法,掌握点阵字符的显示方法.掌握模拟/数字(A/D)转换方式,进一步掌握使用C51语言编写程序的方法,使用C51语言编写实现重量测量的功能. 二. ...

  6. 单片机与控制实验(2)——LED点阵显示屏

    一.实验目的和要求 了解LED点阵显示的基本原理和实现方法.掌握点阵汉字库的编码和从标准字库中提取汉字编码的方法. 二.实验设备 单片机测控实验系统 LED点阵显示器实验模块 Keil开发环境 STC ...

  7. 磁钉导航差速式AGV控制实验

    磁钉导航AGV实验 2016-03 本机器是采用RFID电子地标配合磁钉传感器的定位导航AGV.本AGV已初步实现里程计精确解算,磁钉数据融合,AGV定点精准停车.原地旋转换向.远程无线调度的功能,初 ...

  8. 51单片机 | 模拟PWM调制控制实验

    ———————————————————————————————————————————— PWM(脉冲宽度调制) 对模拟信号电平进行数字编码的方法 - - - - - - - - - - - - - ...

  9. EXIT(外部中断)控制实验

    实验目的 设计使用外接的按键来作为触发源,使得控制器产生中断,并在中断服务函数中实现控制小灯的亮灭. 按键硬件点路 编程要点 初始化用来产生中断的 GPIO: 初始化 EXTI: 配置 NVIC: 编 ...

随机推荐

  1. drupal7创建自定义的panels布局

    很简单,在主题的 *.info文件中添加一句代码: 这一句很简单,但也很重要,没有这一句,就没在panels的配置界面去显示自定义的布局 plugins[panels][layouts] = layo ...

  2. Input type=number 样式清除

    /* 普通IE浏览器 样式清除 */ input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{ -webkit-appear ...

  3. CentOS6.5搭建ldap及pdc的过程

    linux   centos6.5,,配置的是本地yum,采用光盘自带的rpm包进行安装 安装openldap server 以及client yum install openldap-server ...

  4. FineBI表单如何更新

    FineBI表单如何更新 1. 描述Cube单表更新,是指在某个业务包上面设置定时更新,在某个固定的时间点对某个的业务包中的特定表进行数据更新,部分更新分为两种,全量更新和增量更新,因而在更新策略上则 ...

  5. Expo大作战(十九)--expo打包后,发布分用程序到商店的注意事项

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  6. Python Word2Vec使用训练好的模型生成词向量

    # 文本文件必须是utf-8无bom格式 from gensim.models.deprecated.word2vec import Word2Vec model = Word2Vec.load( ' ...

  7. CSS 小结笔记之伸缩布局 (flex)

    CSS flex 是一种伸缩布局,之前块级元素布局在同一行,可以通过display或position或float来实现,而本篇介绍一个新的方法——flex(弹性布局). flex 为和模型布局提供了极 ...

  8. VMWare虚拟机安装Linux系统时安装界面显示不全的解决、Linux分区

    1.只有最下面的按钮不全(可以显示字的一部分):可以用Tab键操控进行下一步 2.只有一半左右的界面:用Alt+鼠标左键移动安装界面 3.关于Linux分区:如果想用Linux进行深入操作,尽量不要选 ...

  9. python函数-匿名函数

    1,匿名函数,故名思意,就是没有名字的函数. def fun(x): return x+x 上述代码的作用就是求x+x的和的函数.如果调用该函数的话,可以使用fun(1)即可.那么lambda函数和上 ...

  10. 插入图片新方式:data:image

    我们在使用<img>标签和给元素添加背景图片时,不一定要使用外部的图片地址,也可以直接把图片数据定义在页面上.对于一些“小”的数据,可以在网页中直接嵌入,而不是从外部文件载入. 如何使用 ...