基于CAN总线的多点分布式数据交换系统节点的设计
[摘要]文章主要介绍分析对P87C591控制器的应用,主要包括与上位机的数据通信程序、 CAN总线通信、外部数据的采集、I2C串行通信等。
[关键词]P87C591;CAN总线;SIO0;SIO1;I2C;串行通信
[作者简介]蒙丽华,广西机电工程学校实验师,研究方向:电气控制,广西南宁,530000
[中图分类号] TP336 [文献标识码] A [文章编号] 1007-7723(2011)04-0043-0005
一、前言
随着通讯技术、计算机技术、集成电路技术的飞速发展,传统的现场控制技术以及现场监控设备正在发生着一场新的革命。这就是以数字式现场总线(Field bus)为代表的现场控制仪表与设备的规范互联,在全世界范围内兴起。
控制器局部网(CAN-Controller Area Network)属于现场总线的范畴,它是一种有效支持分布式控制或者实时控制的串行通信网络。CAN的应用范围遍及从低成本的多线路网络到高速网络。在自动化电子领域的汽车传感器、发动机控制部件、防滑系统等应用中,CAN的位速率可达1Mbps。同时,它可以廉价地用于交通运载工具电路系统中,如:电气窗口、灯光聚束等以替代所需要的硬件连接。由于CAN有卓越的特性及极高的可靠性,特别适合工业过程监控设备的互连,因此越来越受到工业界的重视,并已经被公认为是几种最有前途的现场总线之一,成为一种国际标准(ISO11898)。
本文主要依据CAN的应用特点实现了一种多点分布式数据交换系统中一个节点的设计,侧重芯片的编程控制。
二、系统概述
(一)硬件系统概述
如图1所示,本系统以带CAN控制器的单片机P87C591为核心,外接4路A/D转换电路,对外部数据进行采集。同时,系统设计有外部数据存储器24LC256,可将采集数据进行保存。P87C591利用其串行口TxD,RxD通过RS232总线和电平转换芯片MAX232与上位机进行通信。同时通过CAN收发器TJA1050与CAN总线进行通信。
对于CAN总线的数据采集通过收发器TJA1050实现。P87C591的TxDC和RxDC分别与TJA1050的TxD脚和RxD相连,通过TJA1050的引脚CANH和CANL连接到CAN总线上去。
上位机通过发送命令使P87C591转到相应的工作状态。P87C591与上位机的通信通过读接收寄存器,来判断上位机的命令并执行,同时通过写发送寄存器返回一个应答字节给上位机。P87C591与上位机之间通信利用全双工串行接口SIO0进行。P87C591的TxD与上位机的RxD连接,P87C591的RxD与上位机的TxD连接。接口电路通过RS232转换电路实现。
P87C591自带可选择快速8位ADC。通过引脚P1.2-P1.5外接4路A/D对外部采集的模拟数据进行A/D转换。
P87C591具有I2C串行接口SIO1。通过P1.6/SCL和P1.7/SDA同外部数据存储器24LC256传送数据,将采集到的数据保存到24LC256中。(二)软件系统概述
本系统的软件设计分为两部分:
1.上位机软件部分
2.对P87C591控制器进行编程的软件部分
本论文主要介绍对P87C591控制器进行编程的软件部分,软件编程使用的语言是C51语言。C51是一种与C语言十分类似的高级语言,可读性好,易于修改,具有较高的效率。
根据系统设计,对P87C591控制器进行编程的软件编程主要包括系统监控主程序和各个模块子程序。
其中系统监控主程序是控制芯片P87C591依照上位机的命令而相应运行的程序,通过读取上位机命令调用相应的功能模块,完成预定的任务。系统中共有8个功能模块,分别是:单通A/D转换、循环A/D转换、发送数据到RAM、读取RAM数据、CAN初始化、发送数据到CAN总线、接受CAN总线数据、出错处理。
三、软件设计
(一)监控主程序
在监控程序中,P87C591根据上位机发送的报文,调用相应的功能模块。监控程序流程图如图2所示。
(二)报文的接收与发送
当一个字节接收完毕,接收中断标志位RI由硬件置位,在RI为1时,可以从接收寄存器S0BUF中读数据。采用查询中断方法,一旦检测到RI为1,就从S0BUF中读数据。接收同时对数据累加,以便在接收完报文后进行校验。接收报文程序如下:
向上位机发送报文时,只需将数据写入发送寄存器,当TI置位时表示一个字节发送完毕,将TI清零后可以发送下一个字节,直至报文发送完毕。报文的发送比较简单,在此不详细说明。
(三)CAN总线通信
CAN总线部分的软件设计由初始化、接收、发送三部分组成。
1.初始化
CAN控制器在上电或硬件复位后必须进行设定以实现CAN通信初始化。初始化的处理应该包括下面几项:
(1)操作模式初始化;(2)验收滤波器初始化;(3)总线定时器初始化;(4)TXDC输出管脚配置;(5)中断初始化。
在成功地初始化CAN控制器后,系统就可以应用它来传输报文了。
(二)接收
在接收程序中,通过读CAN控制器的状态寄存器来判断是否接收到信息。若接收缓冲区状态标志(RBS)1,则表示已接收一个或多个信息,此时对接收到的信息进行处理,然后置位命令寄存器中的释放接收缓冲区标志。
程序利用返回值反映接收的状态:返回值为0表示无数据接收或有错误,为1表示正确接收到数据,为2表示接收到数据但校验有错误。
由于接收缓冲器的数据区最多只能容纳8个字节,所以,当接收的数据多于8个字节时,只能接收前8个字节,流程图如图3:
(三)发送
信息的发送由CAN控制器自动完成,CPU将发送的信息传送到发送缓冲区并置位命令寄存器中的TR,发送处理可通过查询状态标志或者中断请求来进行控制。
发送程序中,通过读状态寄存器来判断是否可以访问发送缓冲区。若发送缓冲区标志(TBS)为1,则可将新信息写入发送缓冲区,并置位TR启动发送,当发送完成状态位置位时,标志CAN 信息已经发送成功。发送缓冲器一次最多发送8字节,当要发送数据长度大于8时,只发送前8个数据字节,并返回错误信号给上位机,由上位机将剩余的数据以8个字节为一组分开发送。
(四)数据采集
数据采集用P87C591的A/D转换器来完成。选择快速8位ADC,要通过置位ADC8(AUXR1.7)配置成快速转换的8位模式。对于8位精度,转换需要24个机器周期。
A/D转换由ADC控制寄存器ADCON来控制。控制位ADCON.0(AADR0),ADCON.1(AADR1)和ADCON.2(AADR2)用于选择模拟输入通道。当控制位ADCON.5(ADEX)=0时,选择软件启动模式, 通过置位控制位ADCON.3(ADCS)启动转换,转换在置位ADCS指令的下一个机器周期启动。转换完成时,ADCON.4(ADCI)置位,而ADCS状态标志被复位。此时A/D转换结果可读出,转换的结果保存在寄存器ADCH中。只有当ADCS和ADCI均为0时才能启动一次转换,数据采集的流程图如所示图4。
(五)I2C通信
P97C591片内I2C的逻辑提供了符合I2C总线规范的串行接口。I2C逻辑自动对数据传输进行处理,并对串行传输跟踪,状态寄存器(SISTA)反映了SIO1和I2C总线的状态。CPU和I2C逻辑通过4个特殊功能寄存器接口:
S1CON:SIO1控制寄存器
S1STA:SIO1状态寄存器
S1DAT:SIO1数据寄存器
S1ADR: SIO1地址寄存器
SIO1逻辑与外部I2C总线通过2个I/O管脚接口:P1.6/SCL(串行时钟线)P1.7/SDA(串行数据线)。
在本项目中,SIO1作为主机,与24LC256进行数据传输,对P87C591的编程包括主发送器模式和主接收器模式这两种操作模式。下面就具体介绍这两种模式的编程。
1.主发送器模式
在主发送器模式中,SIO1将数据字节发送到24LC256中。数据通过SDA串行输出,串行时钟通过SCL输出。
在进入主发送器模式之前,S1CON必须按照表1进行初始化。
CRO、CR1和CR2 定义串行位速率。ENS1必须置位以使能SIO1。如果AA复位,则SIO1不能进入从模式。STA,STO和SI必须复位。
主发送器模式初始化之后,可置位STA进入主发送器模式。SIO1逻辑对I2C总线进行测试,并在总线空闲后立即产生一个起始条件。当发送起始条件时,串行中断标志SI置位,状态寄存器(S1STA)中的状态代码为08H。该状态代码用于指向一个中断服务程序。该中断程序将从地址和方向位(SLA+W)装入S1DAT。串行中断标志SI必须在串行传输可以继续进行之前复位。
当从地址和方向位已发送且接收到应答位之后,串行中断标志SI再次置位并且可以使用S1STA中的一些状态代码。本项目状态码如表2:
程序中,根据状态码判断I2C总线及SI01硬件的状态,对S1CON进行写操作,确定SIO1硬件执行的下一个动作。
2.主接收器模式
主接收器模式中,从 24LC256中接收数据。串行数据通过SDA输出,串行时钟通过SCL输出。
该模式的传输初始化在主发送器模式时完成。在主发送器模式初始化之后,置位STA进入主发送器模式。SIO1逻辑对I2C总线跟踪测试,在总线空闲后立即产生一个起始条件。发送起始条件时,串行中断标志SI置位,状态寄存器(S1STA)中的状态代码为08H。该状态代码用于指向一个中断服务程序,中断服务程序将发送的第一个字节SLA+R装入S1DAT。与主发送器模式中类似,SI位在串行传输可以继续进行之前清零。在SLA+R已发送且接收到应答位之后,SI再次置位并且可以使用S1STA中的一些状态代码。
3.从地址SLA
从地址SLA即24LC256的地址。24LC256是一个32K×8(256字节)串行电擦除PROM,该器件地址由7位组成,它和一位数据方向位构成了主模式中发送的第一个字节SLA+W/R,该字节各位如下表3:
器件地址(DA3-DA0)是24LC256外围接口器件,它的地址编码为固定,器件出厂时已定为1010。引脚(A2-A0)是器件的外围地址端口,在电路中接电源或接地的不同,形成的地址数据不同。本项目中此三个引脚均接地,A2-A0的值为0。
数据方向(W/R)规定了总线上的数据传输方向, R为逻辑1,表示接收;W为逻辑0,表示发送。因此,0xA0表示P87C591为主发送器模式状态,向24LC256发送数据,0xA0表示P87C591为主接收器模式状态,从24LC256中接收数据。
四、硬件设计
系统硬件连接图如图5:
[参考文献]
[1]邬宽明.CAN总线原理和应用系统设计[M].北京:北京航空航天大学出版社,1996.
[2]张培仁,等.基于C语言编程MCS-51单片机原理与应用[M].北京:清华大学出版社,2003.
上一篇:常用现场总线技术比较