您的位置 首页 培训

CAN-bus接口操控试验

一.实验目的通过调用CAN程序库SJA1000_PELILIB的基本函数,实现实验板上CAN节点的初始化以及CAN节点的自发自收测试。二.验设

一.试验意图

经过调用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 总线数据的接纳程序。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/234221.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部