本实验通信网络通过CAN总线传输数据,设计的CAN-RS-232通信适配卡,可挂接在通信网络的任一节点位置,对于通过RS-232总线连入CAN网络的PC,可用WINDOWS自带的超级终端或者我们用VC编写的串口操作程序来接收和发送数据,可以实现点对点,及一点对多点的通信,实现CAN协议里的数据帧和远程请求帧的传送所谓远程请求帧就是接收端通过发送远程帧启动其资源节点传送它们各自的数据,板卡还可实现10位精度的A/D转换并将得到的数据通过CAN总线上传给上位机CAN总线系统结构如图1所示:
1、系统硬件设计
板卡电路主要由四部分组成:PIC16F877A单片机、独立CAN通信控制器SJA1000T、CAN总线驱动器TJA1050和RS-232总线驱动器MAX232。主要实现基于CAN总线的数据传输,同时通过RS-232把Pc作为终端接人CAN总线以及采集模拟信号并通过CAN总线上传给上位机。SJA1000T是集成的独立CAN控制器(与PHILIPS早期的CAN控制器PCA82C200完全兼容),它负责完成CAN总线通信协议的物理层和数据链路层的功能。对于微处理器来说,它相当于一个存储器I/O 映象设备。由于CAN控制器和微控制器内部都有自己的时钟产生电路,为了让两者之间协调,外加了10M 晶振在微控制器上作为整个系统的时钟,并将微控制器的时钟输出作为CAN控制器的时钟输入;SJA1000T的中断输出信号/INT接到单片机的INT中断,但也可通过查询方式实现单片机与CAN控制器的通信;为了使CAN控制器和微控制器能同时可靠的复位,外加了手动复位电路。
PIC16F877A单片机是目前使用非常广泛的中端单片机,在本系统中,它主要是用于控制CAN控制器SJA1000T,对SJA1000T进行初始化和读/写操作以及将从CAN总线或从RS-232总线传来的数据进行打包处 后再转传到RS-232总线或CAN总线上,即对两个总线上的数据流按照协议进行处理和传送。下位机的单片机主要是采集模拟信号并实现A/D转换,并通过CAN总线上传给上位机。
1.1 CAN通信模块
SJA1000T的AD0~AD7是地址、数据复合总线,与PIC16F877A的PORTD端口相连,即单片机通过SJA1000T的这个并口来传递数据和地址;需要注意的是51系列的单片机有专门的读、写和地址锁存的引脚,而PIC16F877A并没有,所以我们只能用其他端口来模拟控制,在本系统中SJA1000T的ALE、CS、RD 、WR分别与单片机的RC0-RC3引脚相连,即用RC0-RC3来控制SJA1000T的地址锁存、片选和读/写操作。
TJA1050是CAN 协议控制器和物理总线之间的接口,主要应用在波特率范围从60kbps到1Mbps。TJA1050可以为总线提供差动的发送功能,为CAN控制器提供差动的接收功能,而且完全符合ISO11898标准。CAN控制器SJA1000T通过一条串行数据输出线TxD 和一条串行数据输人线RxD 连接到CAN总线驱动器TJA1050,而TJA1050则通过两个有差动接收和发送能力的总线终端连接到CAN总线。总线终端为120欧的电阻,其作用为匹配总线阻抗,提高数据通信的抗干扰性及可靠性。CAN通信模块的原理图见图2。
1.2 RS-232模块
RS-232标准是美国EIA电子工业联合会制定的一种串行物理接口标准,广泛用于汁算机与终端或外设之间的近端连接 完整的RS-232接口有25根线,一般在计算机串口采用简化的9芯插头座:工作时,应保证电平在±(5-15)V之问。因此为了能够同计算机或控制器的TTL器件连接,必须在RS-232与TTL电路之问进行电平和逻辑关系的变换。常用的转换芯片是MAX232。MAX232内部有电压倍增电路和转换电路,只需5V电源便可实现TTL电平与RS-232电平转换。RS-232模块的原理图见图3。
1.3 A/D转换模块
PIC16F877A单片机自带有8路模拟通道,转换精度为10位。本适配卡选择RA0为模拟通道。板卡将A/D转换后的数据通过CAN总线上传给上位机。 1.4 数据流
CAN-RS-232的数据流图见图4。
2、系统软件设计
软件设计分为两大块:板卡底层软件设计和PC机上串口操作软件设计。板卡底层软件设计主要是对PIC16F877A编程,用于把从PC机通过串口输人给单片机的数据按照CAN协议帧结构进行打包处理,并操作CAN控制器把数据发送到CAN总线;把从CAN总线上输入的数据转换成串行数据输出给PC机:PC机上串口操作软件设计主要是对串口的操作和通过串口收发数据。
2.1单片机编程
开发工具使用的是MPLAB集成开发环境(IDE),它是综合的编辑器、项目管理器和设计平台,适用于使用MicroChip的PICmicro系列单片机进行嵌入式设计的应用开发;编程语言用的是C语言,将HITECH 公司的PICC编译器直接挂接在MPLAB-IDE集成开发平台下,实现一体化的编译连接和原代码调试。
CAN控制器SJA1000T片内有模式寄存器MOD、命令寄存器CMR、状态寄存器SR、中断寄存器IR、中断使能寄存器IER、接收缓冲器RXB、发送缓冲器TXB、仲裁丢失捕捉寄存器ALC、错误代码捕捉寄存器ECC、错误报警限额寄存器EWLR、错误计数寄存器ERR、验收代码寄存器ACR、验收屏蔽寄存器AMR、总线时序寄存器BTR、输出控制寄存器OCR和时钟分频寄存器CDR等,单片机就是通过读写这些寄存器来实现对SJA1000T的控制,从而实现CAN报文的接收和发送。文后给出CAN控制器SJA1000T初始化和接收子程序的流程图。下面给出CAN初始化程序,其中WRCAN是自定义的一段对SJAIO00T写数据的子程序。
void CANINI()
{
WRCAN(MODE,0x09); //进入复位模式,选择单向滤波方式,对SJA1000T进行初始化
WRCAN(CDR,0x88); //选择PeliCAN模式,关闭CLKOUT
WRCAN(IER,0x0D); //中断允许寄存器
//以下根据需要对屏蔽寄存器赋初值,将位设为1表示DON'T CARE,设为0表示CARE
WRCAN(AMR0,0x00);
WRCAN(AMR1,0x00);
WRCAN(AMR2,0xFF);
WRCAN(AMR3.0xFF); //因为AMR3的最低两位是不用的,必须置“1”
//以下根据情况为验收代码寄存器赋初值
WRCAN(ACR0,0x00);
WRCAN(ACR1,0x00);
WRCAN(ACR2,0xFF);
WRCAN(ACR3,0xFF); //ACR,AMR各位设为1,是为了允许任何数据通过滤波器的验收
WRCAN(BTR0,0x03); //总线定时寄存器
WRCAN(BTR1,0xFF); //设置波特率为50kbps
B=fXT/[2*BRP*(1+Tseg1+Tseg2)]
WRCAN(OCR,0xAA); //输出控制寄存器
WRCAN(RBSA,0x00); //接收缓存寄存器FIFO的起始地址为0
WRCAN(TXERR,0x00); //清除发送错误寄存器
RDCAN(ECC); //清除ECC,因为ECC是只读不能写的,当被读出时,其相应位即被清除
WRCAN(MODE,0x08); //设为单滤波方式,并返回工作状态
return;
}
void WRCAN(address,data) //向SJA1000T的寄存器写入数据
unsigned char address;
unsigned char data;
{
PORTC=0x0D; //RC3=1;RC2=1;Rc1=0;RC0=1;即ALE置1,则锁存地址,其余端口参考时序图
PORTD=address;
PORTC=0x04; //RC0=0;RC1=0;RC2=1;RC3=0;即ALE置0,则传输据.进入写方式,其余端口参考时序图
PORTD=data; //将数据写入端口D
PORTC=0x0E; //RC3=1;RC2=1;RC1=1;RC0=0;各端口还原