CAN总线数据通讯[实验项目]CAN总线数据通讯[实验目的]基于SJA1000CAN总线控制器和单片机系统完成CAN总线数据收发实验、掌握CAN总线波特率设置、消息ID和接收滤波器配置,完成两个以上节点的数据通讯。[实验仪器设备]SJA1000CAN接口模块单片机最小系统板串行下载线(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通讯,显示SENDMSGn,(0xc),其中n表示第n次发送。一个CAN节点发送数据帧后,另一个CAN节点通过查询方式接收数据,同样利用串口显示RECVMSGn:data,其中n表示第n次接收,data表示接收的数据。实验结果如下图所示:2、中断收发数据发送数据同上,一个CAN节点发送数据帧后,另一个CAN节点进入中断,接收数据帧,利用串口显示RECVMSGbyINT0n:data,其中n表示第n次接收,data表示接收的数据。实验结果如下图所示:[实验出现的问题及解决办法]问题1:程序无法下载到单片机解决办法:更新下载软件STC_ISP,成功下载程序。问题2:CAN节点只能发送一次分析原因:由于发送后没有节点接受应答,故不能进行下一次发送。解决办法:通过把两个CAN节点相连,成功实现了数据的收发。问题3:利用中断接收数据解决办法:编写中断服务程序,进入中断后,调用CAN_RecvMsg()函数,进行数据的接收。[实验结论]通过对单片机进行编程,利用SJA1000CAN总线控制器构成CAN总线数据收发系统,通过修改寄存器的值可以进行CAN总线初始化,可以进行CAN总线波特率设置、消息ID和接收滤波器配置等操作。CAN总线控制器的基地址与连接方式有关,本次实验用线选法,把CS与单片机的P2.0相连,故基地址为0XFE00。接收方式可以分为查询法和中断法。通过这次实验,实现了两个节点的数据通讯,每个节点都可以发送和接收数据,顺利地完成了本次实验。[回答思考题]1、若已知CAN接口板的基地址=7F00H,请问PeliCAN模式下,SJA1000的控制寄存器的物理地址=?答:7F00H2、请将BasicCAN下地址分配表中的32个单元地址,用C语言宏常量定义方法,定义成SJA1000.h文本文件,并在Keil工程文件中调用。#defineCAN_ADDR0XFE00//P2.0为初始地址#defineREG_CONTROLCAN_ADDR+0x00//内部控制寄存器#defineREG_COMMANDCAN_ADDR+0x01//命令寄存器#defineREG_STATUSCAN_ADDR+0x02//状态寄存器#defineREG_INTERRUPTCAN_ADDR+0x03//中断寄存器#defineREG_INTENABLECAN_ADDR+0x04//中断使能寄存器#defineREG_BTR0CAN_ADDR+0x06//总线定时寄存器0#defineREG_BTR1CAN_ADDR+0x07//总线定时寄存器1#defineREG_OCRCAN_ADDR+0x08//输出控制寄存器#defineREG_TESTCAN_ADDR+0x09//测试寄存器#defineREG_RESVER1CAN_ADDR+0x0A//保留1#defineREG_ARBITRATECAN_ADDR+0x0B//仲裁丢失捕捉#defineREG_ERRCATCHCAN_ADDR+0x0C//错误代码捕捉#defineREG_ERRLIMITCAN_ADDR+0x0D//错误报警限额#defineREG_RXERRCAN_ADDR+0x0E//接收错误计数器#defineREG_TXERRCAN_ADDR+0x0F//发送错误计数器#defineREG_ACR1CAN_ADDR+0x10//验收代码寄存器#defineREG_ACR2CAN_ADDR+0x11//验收代码寄存器#defineREG_ACR3CAN_ADDR+0x12//验收代码寄存器#defineREG_ACR4CAN_ADDR+0x13//验收代码寄存器#defineREG_AMR1CAN_ADDR+0x14//验收屏蔽寄存器#defineREG_AMR2CAN_ADDR+0x15//验收屏蔽寄存器#defineREG_AMR3CAN_ADDR+0x16//验收屏蔽寄存器#defineREG_AMR4CAN_ADDR+0x17//验收屏蔽寄存器#defineREG_TXBuffer1CAN_ADDR+0x10//发送缓冲区1#defineREG_TXBuffer2CAN_ADDR+0x11//发送缓冲区2#defineREG_TXBuffer3CAN_ADDR+0x12//发送缓冲区3#defineREG_TXBuffer4CAN_ADDR+0x13//发送缓冲区4#defineREG_TXBuffer5CAN_ADDR+0x14//发送缓冲区5#defineREG_TXBuffer6CAN_ADDR+0x15//发送缓冲区6#defineREG_TXBuffer7CAN_ADDR+0x16//发送缓冲区7#defineREG_TXBuffer8CAN_ADDR+0x17//发送缓冲区8#defineREG_TXBuffer9CAN_ADDR+0x18//发送缓冲区9#defineREG_TXBuffer10CAN_ADDR+0x19//发送缓冲区10#defineREG_TXBuffer11CAN_ADDR+0x1A//发送缓冲区11#defineREG_TXBuffer12CAN_ADDR+0x1B//发送缓冲区12#defineREG_TXBuffer13CAN_ADDR+0x1C//发送缓冲区13#defineREG_RXBuffer1CAN_ADDR+0x10//接收缓冲区1#defineREG_RXBuffer2CAN_ADDR+0x11//接收缓冲区2#defineREG_RXBuffer3CAN_ADDR+0x12//接收缓冲区3#defineREG_RXBuffer4CAN_ADDR+0x13//接收缓冲区4#defineREG_RXBuffer5CAN_ADDR+0x14//接收缓冲区5#defineREG_RXBuffer6CAN_ADDR+0x15//接收缓冲区6#defineREG_RXBuffer7CAN_ADDR+0x16//接收缓冲区7#defineREG_RXBuffer8CAN_ADDR+0x17//接收缓冲区8#defineREG_RXBuffer9CAN_ADDR+0x18//接收缓冲区9#defineREG_RXBuffer10CAN_ADDR+0x19//接收缓冲区10#defineREG_RXBuffer11CAN_ADDR+0x1A//接收缓冲区11#defineREG_RXBuffer12CAN_ADDR+0x1B//接收缓冲区12#defineREG_RXBuffer13CAN_ADDR+0x1C//接收缓冲区13#defineREG_RXCOUNTCAN_ADDR+0x1D//RX报文计数器#defineREG_RBSACAN_ADDR+0x1E//接收缓冲区起始地址#defineREG_CDRCAN_ADDR+0x1F//时钟分频寄存器[心得体会]在这次实验中,遇到了一些问题,比如开始软件不对导致程序不能正确下载,以及后面用中断实现所遇到的困难,我们组通过仔细考虑,检查,以及求助学长,最终顺利完成了实验,通过这次的实验,将课本理论与实际相结合,进一步加深了对理论知识的理解,同时,增强了动手操作,加强了团队协作。