CAN总线实验报告
- 格式:doc
- 大小:2.74 MB
- 文档页数:9
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 //输出控制寄存器