基于S3C2410的CAN总线通信设计与开发
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 PROFIBUS 网络特性
(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上流经的电流成正比。
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; // 写数据到发送缓冲区
- 一种S3C2410路由器的整体结构及工作原理(03-03)
- GPRS远程安防监控系统的电路设计(10-23)
- 嵌入式无线监测仪系统电路设计详解(06-21)
- CAN总线镍氢电池管理解决方案(04-23)
- CAN总线在机车监控系统中的应用(04-04)
- 基于can总线技术的电子控制系统单元在汽车网络系统中的应用(07-16)