1. 前言
CAN(Controller Area Network)总线,即控制器局域网总线,是一种有效支持分布式控制或实时控制的串行通信网络。由于其高性能、高可靠性、及独特的设计和适宜的价格而广泛应用于工业现场控制、智能楼宇、医疗器械、交通工具以及传感器等领域,并已被公认为几种最有前途的现场总线之一。CAN总线规范已经被国际标准化组织制订为国际标准ISO11898,并得到了众多半导体器件厂商的支持。
本文使用华清远见FS2416平台。FS2416使用Socket网络设备驱动和字符设备驱动两种方式向Linux内核提供MCP2515的驱动,上篇文章介绍了使用Socket方式设计的基于MCP2515的Linux CAN总线驱动程序,这篇文章主要介绍编写一个MCP2515的字符设备驱动。
2. MCP2515 CAN字符设备驱动的实现
2.1 SPI子系统简介
基于子系统去开发驱动程序已经是Linux内核中普遍的做法了。前面介绍使用Socket编写MCP2515 CAN总线的驱动也是基于SPI子系统开发的。在驱动开发前,需要先熟悉下SPI通讯协议中的几个关键的地方,后面在编写驱动时,需要考虑相关因素。
SPI总线由MISO(串行数据输入)、MOSI(串行数据输出)、SCK(串行移位时钟)、CS(使能信号)4个信号线组成。MCP2515与S3C2416的SPI连接如图3所示。SO脚为它的数据输入脚,SI为数据输出脚,SCK为时钟脚。
SPI常用四种数据传输模式,主要差别在于:输出串行同步时钟极性(CPOL)和相位(CPHA)可以进行配置。如果CPOL = 0,串行同步时钟的空闲状态为低电平;如果CPOL = 1,串行同步时钟的空闲状态为高电平。如果CPHA = 0,在串行同步时钟的前沿(上升或下降)数据被采样;如果CPHA = 1,在串行同步时钟的后沿(上升或下降)数据被采样。具体的时序如图4所示。
这四种模式中究竟选择哪种模式取决于设备。如MCP2515芯片手册中说明它可以支持(0,0)(1,1)两种模式,即:CPOL = 0,CPHA = 0和CPOL = 1,CPHA = 1。
2.2 Linux下SPI驱动的开发
首先明确SPI驱动层次,如图2所示: