CAN总线实验报告

  • 格式:doc
  • 大小:2.74 MB
  • 文档页数:9

下载文档原格式

  / 9
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CAN总线数据通讯

[实验项目]

CAN总线数据通讯

[实验目的]

基于SJA1000 CAN总线控制器和单片机系统完成CAN总线数据收发实验、掌握CAN总线波特率设置、消息ID和接收滤波器配置,完成两个以上节点的数据通讯。

[实验仪器设备]

SJA1000 CAN接口模块单片机最小系统板

串行下载线(USB转TTL电平串口线)USB转DC5.5mm供电线

杜邦线

[实验原理]

1、CAN通信板原理图复位电路

TJA1050T外围电路振荡电路

2、单片机板原理图

单片机最小系统主要包括3部分:电源,晶振和复位电路。晶振采用11.0592MHz,复位采用RC电路。由于单片机P0口开漏输出,需要外接10K的上拉电阻。3、原理简述

SJA1000通过并行总线与MCU连接,包括地址/数据线、读/写控制信号、片选、

中断等十多根信号线。通过对单片机进行编程,来控制CAN节点的初始化、帧的发送和接受等。

初始化流程:

数据发送流程:

中断接收流程:

查询接收流程:

[实验内容]

(1)硬件连接

1、单片机和SJA1000的连接

使用杜邦把CAN模块的P0口连接到单片机开发板的P0扩展口上;把ALE,WR,RD,INT0,CS,KEY分别对应连接到单片机的ALE,P3.6,P3.7,P3.2,P2.0和P2.5上;把5V和GND分别对应接到单片机的电源接口上。

2、SJA1000节点间的连接

将两个SJA1000节点的CAN_H,CAN_L对应连接,即高接高,低接低,即可完成通信线路的连接。

3、单片机与下载器的连接

按如下图所示的接线方式连接下载器(即USB转TTL电平串口)和51单片机系统板。其中5V、3.3V电源线不接,只连接GND并交叉连接RX和TX,即TX接单片机的P3.0,RX接单片机的P3.1。可三根采用杜邦线将下载器的三个引脚接至51系统板的排插相应引脚上。

(2)软件编程

1、在KeilC开发环境下编写STC89C52程序,测试程序的下载和运行。

2、编写STC89C52串行通讯程序,能够通过串口向PC机发送字符,显示程序运行状态。

3、编写SJA1000芯片CAN数据发送程序和查询方式的数据接收程序,完成CAN 数据帧的发送和接收。

4、编写SJA1000芯片CAN数据发送程序和中断方式的数据接收程序。

[实验数据记录及处理]

1、查询收发数据

每次按下CAN实验板上的按键KEY,则该CAN节点发送数据帧,单片机通过串口与PC通讯,显示"SEND MSG n,(0xc) ",其中n表示第n次发送。

一个CAN节点发送数据帧后,另一个CAN节点通过查询方式接收数据,同样利用串口显示"RECV MSG n:data",其中n表示第n次接收,data表示接收的数据。

实验结果如下图所示:

2、中断收发数据

发送数据同上,一个CAN节点发送数据帧后,另一个CAN节点进入中断,接收数据帧,利用串口显示"RECV MSG by INT0 n:data",其中n表示第n次接收,data表示接收的数据。

实验结果如下图所示:

[实验出现的问题及解决办法]

问题1:程序无法下载到单片机

解决办法:更新下载软件STC_ISP,成功下载程序。

问题2:CAN节点只能发送一次

分析原因:由于发送后没有节点接受应答,故不能进行下一次发送。

解决办法:通过把两个CAN节点相连,成功实现了数据的收发。

问题3:利用中断接收数据

解决办法:编写中断服务程序,进入中断后,调用CAN_RecvMsg()函数,进行数据的接收。

[实验结论]

通过对单片机进行编程,利用SJA1000 CAN总线控制器构成CAN总线数据收发系统,通过修改寄存器的值可以进行CAN总线初始化,可以进行CAN总线波特率设置、消息ID和接收滤波器配置等操作。

CAN总线控制器的基地址与连接方式有关,本次实验用线选法,把CS与单片机的P2.0相连,故基地址为0XFE00。接收方式可以分为查询法和中断法。通过这次实验,实现了两个节点的数据通讯,每个节点都可以发送和接收数据,顺利地完成了本次实验。

[回答思考题]

1、若已知CAN接口板的基地址=7F00H,请问PeliCAN模式下,SJA1000的控制寄存器的物理地址=?

答:7F00H

2、请将BasicCAN下地址分配表中的32个单元地址,用C语言宏常量定义方法,定义成SJA1000.h文本文件,并在Keil工程文件中调用。

#define CAN_ADDR 0XFE00 //P2.0为初始地址

#define REG_CONTROL CAN_ADDR+0x00 //内部控制寄存器

#define REG_COMMAND CAN_ADDR+0x01 //命令寄存器

#define REG_STATUS CAN_ADDR+0x02 //状态寄存器

#define REG_INTERRUPT CAN_ADDR+0x03 //中断寄存器

#define REG_INTENABLE CAN_ADDR+0x04 //中断使能寄存器

#define REG_BTR0 CAN_ADDR+0x06 //总线定时寄存器0

#define REG_BTR1 CAN_ADDR+0x07 //总线定时寄存器1

#define REG_OCR CAN_ADDR+0x08 //输出控制寄存器