1 引言
网络化控制系统是控制系统的发展趋势和研究热点,现场总线控制系统作为网络化系统的重要组成部分,近年来在实际的控制系统中得到了广泛的应用。can(con- troller area network)总线作为一种容错性强、可靠性高、布线简单且成本低廉的现场总线倍受用户钦睐,在国内can总线已经得到了广泛应用。目前国内广泛应用的独立can控制器sja1000因存在如地址、数据总线的分时复用常导致接口效率低下;接收、发送缓冲区的个数太少,导致数据吞吐率不高;帧屏蔽和过滤器的设置不够灵活,不能满足同时需要更多屏蔽和过滤条件的要求等。
arm芯片s3c2410是一种高集成度,高性价比的嵌入式处理芯片,已成功用于工控设备上。然而其美中不足的是没有集成can控制器,使其在工控产品中的应用中受到了一定的阻碍。为了解决这一问题,同时考虑到尽可能降低硬件电路的复杂性,保证can总线通讯的稳定性和效率,采用带spi接口的独立can控制器mcp2515来给s3c2410扩展can接口。下面以自行开发的人机界面(hmi,human machine interface)中can总线通讯接口设计为例进行说明。
2 can总线接口硬件设计
下面先简要介绍相关控制器芯片,后对can接口硬件设计作详细说明。
2.1 arm芯片s3c2410和can控制器mcp2515简介
s3c2410是三星公司设计的32位risc嵌入式处理器。该芯片基于arm920t内核,采用五级流水线和哈佛结构,提供1.1mips/mhz的性能。为了减少应用系统设计的成本,s3c2410集成了众多的常用资源,如:lcd控制器、sdram控制器、一个触摸屏接口、两个spi接口等,内核最高工作频率可达266mhz。
独立can控制器 mcp2515灵活的中断能力、接收帧屏蔽和过滤、帧优先级设定等特性使其能够很好的对信息进行管理,减轻了处理器的负担和软件设计的复杂度。其独特功能如下:
(1) 有标准帧和扩展帧两种数据帧可供选择,每个帧的数据字段长度可为0-8字节,标准帧数据段的前两个字节可单独过滤;
(2) 内含3个发送缓冲器和2个接收缓冲器,并且其优先级可编程设定;
(3) 内含6个29字节的接收过滤器和2个29字节的接收屏蔽器;
(4) 具有loop-back(自环检测)模式;支持更高层的协议,如devicenet、saej1939;
2.2 硬件接口设计
s3c2410的spi接口兼容spi v2.11协议,可支持查询、中断和dma三种数据传送模式。mcp2515连接到s3c2410的spi0口,其相互连接关系如图1所示。
(1) 本接口设计不使用txnrts、rxnbf等5个引脚,使用了总中断引脚int,因此在软件设计的时候不使能发送请求和接收完毕中断对应功能引脚,且在本设计中该引脚也不作其它用途,处理器在响应总中断后,通过spi接口访问mcp2515内部相应寄存器来确定具体的中断事件,并对其作出处理。
(2) 为了隔离总线上的干扰信号,提高系统的可靠性,can控制器与can收发器之间采用了光隔。光隔的两边应该采用独立的供电电源,不可与系统的其他部分直接共地。
(3) 在canh和canl之间使用了两个等值电阻(r410、r411)和旁路电容(c408)来提高eme(electro magnatic emission)性能,减少该部分对系统其他部分的干扰。
(4) mcp2515在初始上电、复位以及从休眠模式唤醒后最初的128 osc时钟周期内,ost(振荡启动定时器)保持复位状态。应注意在ost超时前不应对spi进行操作。
(5) rx是为减少emi(electro magnatic interference)而设计的。canh、canl的转换率与rx上流经的电流成正比。

图1 profibus 网络特性
3 can总线接口软件设计
can总线软件接口为应用层访问can控制器—mcp2515提供了一个便捷的“通道”,该“通道”屏蔽了can控制器工作的实现细节,使得应用层面向通信是透明的。该接口通过 spi接口通信来实现对can控制器的操作。它们之间的相互关系如图2所示。

图2 滤池就地控制单元硬件结构图
3.1 can接口软件实现
s3c2410的spi可以工作在四种模式,但是mcp2515的spi接口只支持其中的两种。因此应该将s3c2410的spi接口配置为mcp2515支持的模式工作。从图1中可以看出 s3c2410的spi应该配置为正常模式的中断方式,具体配置操作请见参考文献[2]。
s3c2410-spi的单个字节读、写函数实现如下:
unsigned char readspi( void )
{
sprdat0 = 0x00; // 初始化spi总线
while ( !redy );
// 判断接收数据是否完成
return ( sprdat0 );
// 获取接收到的数据
}
unsigned char writespi( unsigned char data )
{
sprdat0 = data; // 写数据到发送缓冲区
if ( dcol ) return ( -1 );
// 判断是否发生冲突,发生冲突则返回错误标准
else while( !redy );
// 否则等待数据发送完成
return ( 0 ); // 返回发送成功标准
}
对 mcp2515的读写函数原型如下:
void mcp_read( unsigned char addr, unsigned char *readdata, unsigned char length );
void mcp_write( unsigned char addr, unsigned char *writedata, unsigned char length );
addr:要读写区域的首地址;
readdata/writedata:读取数据存放区、写出数据缓冲区首地址;
length:要读、写数据的字节数。
其它对mcp2515的操作在此不一一列举,请见参考文献[3]。
3.2 can总线数据收发软件设计
本设计采用外部中断1响应mcp2515的总中断,并且配置控制器始终处于唤醒模式,发送器工作在正常模式,使能接收、发送、错误中断。中断方式处理can总线数据收发的流程如图3,分别从发送处理、接收处理、错误处理三个部分加以说明。

图3 中断方式实现can总线数据收发流程图
(1) 发送处理
在两种情况会下被执行,其一发送中断响应中,如果当前有发送任务,通过发送缓冲区记录标志确定空的发生缓冲区并向其中填发送帧,然后启动发送;其二在接收中断响应中,在接收处理完后如果有发送任务且有发送缓冲区空,会处理发送任务。在两处处理发送主要是考虑有多个发送、接收缓冲区可用,可以提高通信效率。
(2) 接收处理
需要根据iCOD的值来确定当前是那个接收缓冲区的数据准备好,可以读取。接收帧处理过程中首先读取帧的id值,确定当前帧的数据是那个节点发送来的,并据此把帧中数据字段的数据存放相应的位置。
(3) 错误处理
引起错误处理的原因很多,并且都产生错误中断,需要访问错误标志寄存器来确定具体错误类型,并据此作相应的处理。
此外,图3中更新发送缓冲区使用记录是为了在发送和接收中断响应中可以据此清楚发送缓冲区的使用情况,确定当前是否可以做发送处理。
4 测试与应用
将以上设计方案应用到自主开发的 hmi(结构框图如图4,虚线框中为扩展的can总线接口框图)实验板上,同时与黄石市科威自控有限公司开发的混合型PLC(easy-m0808r- a44nb)、通用型plc(easy-m2416r)、运动控制器(easy-kp3-m0506r)进行通信测试,其中hmi作主站,其他设备作从站。测试环境中有电机频繁启停和不间断继电器开闭干扰,其他测试条件和参数见如附表:
附表 can接口测试记录表

通讯速率(kbps) 测试时间(h) 通讯距离(m) 误码率(ppm)
500 10 20 3121
200 15 500 804
50 20 2000 20
在测试记录程序中记录了通讯速率为500kbps,运行到6时 31分42秒时出现了一次通信“死机”,随后系统调用自恢复程序重新配置软硬件参数,6时31分43秒重启通信,通信恢复正常。其他测试条件下没有出现 “死机”的情况。该测试结果说明采用这种方法设计的can接口完全能够满足工业现场网络通讯的要求。

图4 hmi系统结构图
5 结束语
采用arm芯片s3c2410集成的spi 接口扩展的can总线接口,在不改变can总线自身的特点的前提下,使得pcb布线简单,增强了系统的可靠性;为扩展接口找到了一个便捷的方法。在自主开发的hmi中采用该设计方案实现can总线接口的扩展,并且在实际应用和测试中证明了该方案的正确性和可靠性。




