微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于Linux系统的多种串行总线统一接口的实现

基于Linux系统的多种串行总线统一接口的实现

时间:08-10 来源:互联网 点击:

摘要:基于Linux字符设备操作接口和各类串行总线的共性,按照分层的思想,抽象出各种总线的统一接口。统一接口的应用层API与底层的具体总线操作形式无关,而且便于应用系统的升级和移植。文中给出了一种多种串行总线统一接口的实现方法,并以ARM9为平台,以I2C、1-Wire、SPI为例,验证了新方法的可行性。
关键词:统一接口;嵌入式系统:Linux;设备驱动;串行总线

0 引言
在Linux内核中单独实现TTY、I2C、SPI、ISA、USB等多种总线驱动时,每一种总线的实现都有各自的特点,如参数设置不同,实现的结构不同等。以TTY、I2C为例,TTY采用的是基于线路规程的三层结构,而I2C则是基于用户句柄和适配器的三层结构。当然,这些驱动都是功能齐全而强大的,但对于并不复杂的应用而言,这样的控制是比较繁琐的,而且,对于移植也是不利的。例如,某个应用系统原先使用一款I2C接口的时钟芯片,但后来系统升级换成了一款SPI接口的时钟芯片,这时就不得不对程序做较大的改动了。本文给出了一种多种串行总线统一接口的实现方法,并以ARM9为平台,以I2C、1-Wire、SPI为例验证了方法的可行性。

1 总线协议及其工作过程
多数的串行总线都基于主从结构,如果总线中包含了时钟信号线,那么,该时钟信号就由主机提供,而如果还包含了片选信号,通常也由主机来控制。也就是说,主机发起通信,从机处于被动状态,所以,对于总线时序的分析,只需讨论主控制器端的时序,而从设备的时序就是它的逆向过程。
1.1 SPI协议及其工作过程
SPI总线是摩托罗拉公司提出的一种串行总线协议,该总线由4根基本的信号线组成,分别是CS、SI、SO、SCK。其中SCK是串行总线时钟,由主设备提供;而SI、SO分别对应于数据输入和数据输出信号。在一主多从的系统中,片选信号决定当前有效的从设备。
SPI总线的工作过程是:首先,主机发起通信,通过片选信号激活从设备;然后,主机在串行时钟SCK信号的同步下,将地址、命令、数据信息从串行数据输出信号(相对主机而言)SI送出;而从设备则在SCK信号的同步下接收主机发送来的数据,并作出相应反应,最后将结果从数据输入信号(相对主机而言)SO送出。
S3C2440中对SPI总线的控制,就是集中于对rSPCONn、rSPSTAn、rSPPINn、rSPPREn、rSPTDATn和rSPRDATn的控制。其中rSPCONn用于DMA设置、工作模式选择、时钟相位选择,rSPSTAn用于控制器状态查询,rSPPINn用于多主机下出错检测和片选释放,rSPPREn用于控制预分频状态寄存器,rSPTDATn是数据发送寄存器,rSPRDATn是数据接收寄存器。
1.2 I2C协议及其工作过程
I2C总线是由飞利浦公司提出的一种接口标准,该总线由SDA、SCL两根信号线组成。其中SCL为时钟信号,由主机提供,最大传输速率为400kb/s;而SDA为数据信号。连接到总线上的每一个设备都有一个唯一的地址,通过这个地址使得主机能够找到目标从机并与之进行通信。
以主机发送为例,I2C总线的工作过程是:首先,主机控制时钟信号SCL为高电平时,数据信号SDA产生一个下降沿,作为起始条件。然后,主机发出7位的从设备地址和1位R/W标志,并激活将要与之通信的从设备,而从设备则会产生一个应答信号。对于写数据,主机紧接着就将一个字符或一串数据写入到从设备;而对于读数据,则紧接着读取从设备输出的数据。
I2C总线中的S3C2440对I2C的控制主要集中于对rIICCON、rIICSTAT、rIICADD和rIICDS的控制。其中rIICCON用于时钟源选择、中断控制和I2C控制器使能,rIICSTAT用于工作模式选择、控制器状态查询,rIICADD是从设备地址(当S3C2440设置为从设备模式时使用),rIICDS是发送接收移位寄存器。
1.3 1-Wire协议及其工作过程
1-Wire总线是Maxim全资子公司Dallas提出的一种总线接口。1-Wire总线与其他的串行总线有比较大的区别:普通的串行总线通常由两根或两根以上的信号线组成;而1-Wire总线仅有一根信号线,同时用于时钟、数据、命令的传输,具有资源利用率高、结构简单、成本低廉、易于总线扩展等优点。
1-Wire总线工作过程:1-Wire总线包含复位、读、写三种基本时序。在复位状态下,主机将总线拉低480~960 μs后释放总线,由于上拉电阻的作用,此时的电平为高,等待15~60 μs之后,从设备将总线拉低表示复位成功。写操作时,若写入数据位为0,则主机将总线拉低60μs后释放;若写入数据位为1,则主机将总线拉低1~15 μs后释放。由于很少有控制器集成了1-Wire总线控制器,所以,一般使用GPIO模拟的方式,这时,对于时序的控制就要求得比较精确。

2 Linux下的统一驱动
这些总线有一些共性,也就是驱动要实现的内容,主要包括单字节数据收发、数据流收发以及工作模式控制等。在这些共性的基础上,一般都需要向上层提供一个统一的接口,以使得对使用这些API的应用程序而言(下层总线无论是RS-232、SPI、I2C,还是1-Wire)都不需要做任何改变。同时,还要对下层也提供一个通用接口,使得不同的总线都能与上层统一接口协调通信。该驱动的结构框架如图1所示。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top