微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > CAN-bus接口控制实验

CAN-bus接口控制实验

时间:12-14 来源:互联网 点击:
一.实验目的

通过调用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]);
//设置总线定时器,确定

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top