当前位置:文档之家› CAN总线实验报告

CAN总线实验报告

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的控制寄存器的物理地址=?答:7F00H2、请将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 //输出控制寄存器#define REG_TEST CAN_ADDR+0x09 //测试寄存器#define REG_RESVER1 CAN_ADDR+0x0A //保留1#define REG_ARBITRATE CAN_ADDR+0x0B //仲裁丢失捕捉#define REG_ERRCATCH CAN_ADDR+0x0C //错误代码捕捉#define REG_ERRLIMIT CAN_ADDR+0x0D //错误报警限额#define REG_RXERR CAN_ADDR+0x0E //接收错误计数器#define REG_TXERR CAN_ADDR+0x0F //发送错误计数器#define REG_ACR1 CAN_ADDR+0x10 //验收代码寄存器#define REG_ACR2 CAN_ADDR+0x11 //验收代码寄存器#define REG_ACR3 CAN_ADDR+0x12 //验收代码寄存器#define REG_ACR4 CAN_ADDR+0x13 //验收代码寄存器#define REG_AMR1 CAN_ADDR+0x14 //验收屏蔽寄存器#define REG_AMR2 CAN_ADDR+0x15 //验收屏蔽寄存器#define REG_AMR3 CAN_ADDR+0x16 //验收屏蔽寄存器#define REG_AMR4 CAN_ADDR+0x17 //验收屏蔽寄存器#define REG_TXBuffer1 CAN_ADDR+0x10 //发送缓冲区1#define REG_TXBuffer2 CAN_ADDR+0x11 //发送缓冲区2#define REG_TXBuffer3 CAN_ADDR+0x12 //发送缓冲区3 #define REG_TXBuffer4 CAN_ADDR+0x13 //发送缓冲区4 #define REG_TXBuffer5 CAN_ADDR+0x14 //发送缓冲区5 #define REG_TXBuffer6 CAN_ADDR+0x15 //发送缓冲区6 #define REG_TXBuffer7 CAN_ADDR+0x16 //发送缓冲区7 #define REG_TXBuffer8 CAN_ADDR+0x17 //发送缓冲区8 #define REG_TXBuffer9 CAN_ADDR+0x18 //发送缓冲区9 #define REG_TXBuffer10 CAN_ADDR+0x19 //发送缓冲区10 #define REG_TXBuffer11 CAN_ADDR+0x1A //发送缓冲区11 #define REG_TXBuffer12 CAN_ADDR+0x1B //发送缓冲区12 #define REG_TXBuffer13 CAN_ADDR+0x1C //发送缓冲区13 #define REG_RXBuffer1 CAN_ADDR+0x10 //接收缓冲区1 #define REG_RXBuffer2 CAN_ADDR+0x11 //接收缓冲区2#define REG_RXBuffer3 CAN_ADDR+0x12 //接收缓冲区3#define REG_RXBuffer4 CAN_ADDR+0x13 //接收缓冲区4#define REG_RXBuffer5 CAN_ADDR+0x14 //接收缓冲区5#define REG_RXBuffer6 CAN_ADDR+0x15 //接收缓冲区6#define REG_RXBuffer7 CAN_ADDR+0x16 //接收缓冲区7#define REG_RXBuffer8 CAN_ADDR+0x17 //接收缓冲区8#define REG_RXBuffer9 CAN_ADDR+0x18 //接收缓冲区9#define REG_RXBuffer10 CAN_ADDR+0x19 //接收缓冲区10#define REG_RXBuffer11 CAN_ADDR+0x1A //接收缓冲区11#define REG_RXBuffer12 CAN_ADDR+0x1B //接收缓冲区12#define REG_RXBuffer13 CAN_ADDR+0x1C //接收缓冲区13#define REG_RXCOUNT CAN_ADDR+0x1D //RX报文计数器#define REG_RBSA CAN_ADDR+0x1E //接收缓冲区起始地址#define REG_CDR CAN_ADDR+0x1F //时钟分频寄存器[心得体会]在这次实验中,遇到了一些问题,比如开始软件不对导致程序不能正确下载,以及后面用中断实现所遇到的困难,我们组通过仔细考虑,检查,以及求助学长,最终顺利完成了实验,通过这次的实验,将课本理论与实际相结合,进一步加深了对理论知识的理解,同时,增强了动手操作,加强了团队协作。

相关主题