CAN总线实验

  • 格式:docx
  • 大小:76.08 KB
  • 文档页数:4

实验三 CAN总线实验

一.实验目的

学习基于SJA1000的CAN总线标准帧通信,实现2个CAN通信节点之间的数据通信。

二、验设备及器件

计算机(带串口) 一台

单片机实验仪 一台

三、实验内容

编写一段程序,实现CAN节点的初始化,能够2节点之间的数据收发,用本节点的I/O控制另一个节点的LED灯。

四、实验步骤

图3、SJA1000及82C250接口电路

1、将2块CAN实验板的CAN总线的CANH、CANL同名连接,通过杜邦线从单片机实验板上将电源接给CAN实验板。

2、编写程序分别下载到各自的CAN实验板上,用杜邦线将JP的P2.0接地控制另一块板子的LED灯。

五、实验预习要求

阅读关于CAN和CAN器件SJA1000的基本资料,具备CAN和CAN相关器件的基本知识,学习指导书的参考程序。

//CAN通信参考程序

#include

#define uchar unsigned char

#define uint unsigned int

#define time0 -10000

sfr WDT = 0xE1;

sfr AUX = 0x8E;

#define Raddr 1 //本机地址ID高8位

#define Taddr 2 //目标地址ID高8位

#define CAN_PORT P0 //CAN数据口

//CAN2.0B的BasicCAN模式 (标准帧模式)

#define CAN_CR 0 //控制

#define CAN_CMR 1 //命令

#define CAN_SR 2 //状态

#define CAN_IR 3 //中断

#define CAN_ACR 4 //验收

#define CAN_AMR 5 //屏蔽

#define CAN_BTR0 6 //时序0

#define CAN_BTR1 7 //时序1

#define CAN_OCR 8 //输出

#define CAN_TXB 10 //发送缓冲

#define CAN_RXB 20 //接收缓冲

#define CAN_CDR 31 //分频

uchar pdata CAN[32] _at_(0); //定位CAN寄存器地址

sbit LED2 = P2^5;

sbit LED1 = P2^6;

sbit KEY = P2^0;

bit CANBUS,sta,LED,RUN;

uchar tim;

uchar idata TXB[10],RXB[10];

void delay(uint p)

{

while(p--);

}

void CAN_SEND() /*发送数据部分*/

{

uchar i,p;

p=CAN[CAN_SR];

if (p&0x04) {

p=CAN_TXB; /*p指向发送缓存首址*/

for(i=0;i<10;i++) CAN[p++]=TXB[i];

CAN[CAN_CMR]=0x01; /*请求发送*/

}

}

void CAN_INT() interrupt 0 using 1/*接收中断*/

{

uchar i,p;

p=CAN[CAN_IR];

if(p&0x01)

{

p=CAN_RXB;

for(i=0;i<10;i++)

{

RXB[i]=CAN[p++];

}

CAN[CAN_CMR]=0x04; /*释放接收缓存*/

CANBUS=1;

}

}

void CAN_INI() /*初始化部分*/

{

CAN[CAN_CR]=0x01;

CAN[CAN_ACR]=Raddr;

CAN[CAN_AMR]=Raddr;

CAN[CAN_BTR0]=0x07;

CAN[CAN_BTR1]=0xff;

CAN[CAN_OCR]=0x1A;

CAN[CAN_CR]=0x02;

}

void timer0() interrupt 1 using 3

{

TH0=time0>>8;TL0=time0;

if(tim<250) tim++;

}

void main()

{

AUX=2; WDT=0x34;

IE=0x83; IT0=1; TMOD=0x21; TH0=time0>>8; TL0=time0; TR0=1;

LED1=0;LED2=0;

delay(5000);

LED1=1;LED2=1;KEY=1;

CAN_INI();

CANBUS=0;

while(1)

{

WDT=0x34;

if(tim>10)

{

tim=0;

TXB[0]=Taddr;

TXB[1]=1;

if(!KEY) TXB[2]=0; else TXB[2]=1;

CAN_SEND();

}

if(CANBUS)

{

CANBUS=0;

LED1=!LED1;

if(RXB[2]==0) LED2=0; else LED2=1;

}

}

}