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

发布者:xrmilk最新更新时间:2012-08-28 来源: 自动化在线关键字: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所示。


    本文主要讨论的是总线驱动部分,而应用层和物理层在测试的时候,也可用两个简单的例子来验证设计结果。
2.1 注册一个新设备号
    首先可为统一接口的总线定义一个新的设备号240,而且以后注册的总线子设备都以此为主设备号。假如现在注册了一个1-Wire和一个I2C总线接口,那么,它们两者的主设备号都为240,而次设备号不同。如果1-Wire的次设备号为0,而I2C的次设备号为1,那么就可将两条总线区分开来了。此时的程序如程序片段一所示。[page]
    程序片段一:


2.2 设备接口层
    为了实现统一的接口,有必要定义一个统一的字符设备接口buses_ops,应用程序访问总线都通过这个接口,这样,所讨论的统一接口问题也就实现了。该接口的主要函数成员如程序片段二所示。
    程序片段二:
   
    
    
    应用程序打开设备的时候,利用子设备号可以找到总线对应的底层适配器,也就是说,子设备号兼具了适配器索引的功能,其具体实现如程序片段三所示。
    程序片段三:

    事实上,buses_dev是设备层和适配器层的桥梁,在open操作里被赋值给文件指针的私有数据域。那么,在读与写函数中,就可以反其道而行,通过文件指针的私有数据域就可获得buses_dev数据结构体。
2.3 适配器接口层
    适配器负责对底层数据的操作,由于不同的总线之间存在共性,所以,一般来说,它们都包含了单字节读、单字节写、多字节读、多字节写以及一些特殊控制。综上所述,该数据结构如程序片段四所示。
    程序片段四:
 

    所谓适配器注册,就是将适配器添加到全局链表buses_list_head中,只有这样,才能在字符设备接口的open操作中通过子设备号索引找到适配器,具体如程序片段五所示。[page]
    程序片段五:


3 实验测试
    这里分别以1-Wire、SPI、I2C总线为例来初始化三条总线适配器,同时实现适配器的单字节写、单字节读、特殊控制等三种基本操作。具体操作如下面的程序所示:
    程序片段六:
    

    完成设备驱动加载之后,就会在/dev目录下生成如图2所示的文件节点。通过打开节点,就可以打开总线的统一接口,从而实现对总线的读、写和控制操作。


    同时,还会在/sys目录下生成关于注册的总线属性目录和文件,主要包含有设备号的属性文件、电源管理属性目录、到类目录的链接、特殊事件属性文件等,具体如图3所示。[page]


    这里分别对I2C接口的E2PROM芯片AT24C02、1-Wire接口的EEPROM芯片DS2433和SPI接口的EEPROM芯片25AA010进行测试。其测试结果如图4所示。


    其测试过程是:通过打开/dev/bus-0、/dev/bus-1、/dev/bus-2节点,调用写操作写一段数据到EEPROM,然后,再调用读操作读出刚才写入的数据,并验证两者是否一致,从而判断本文的接口函数的正确性。

4 结语
    实践证明,使用设备接口层与适配器接口层的这种分层方式,能够让应用程序进一步忽略底层的接口操作,实现接口的统一。而且,该方法具有适应性强,易于系统升级,占用资源少等特点,能有效提高应用程序的开发效率。

 

 

 

 

关键字:Linux系统  串行总线  统一接口 引用地址:基于Linux系统的多种串行总线统一接口的实现

上一篇:基于PROFIBUS总线的涡轮增压器生产线数据采集系统介绍
下一篇:UPS“双总线输出”供电系统用负载自动切换开关

推荐阅读最新更新时间:2024-05-02 22:17

I2C串行总线在单片机8031应用系统中的设计与实现
1 I2C总线概述   I2C (inter IC bus)总线是由Philips公司提出的串行通信接口规范,常见的中文译名有“集成电路间总线”或“内部集成电路总线”。它使用两条线:串行数据线(SDA)和串行时钟线(SCL),使连接到该总线上可访问的器件之间传送信息,属于多主控制总线。总线上的每个器件均可设置唯一的地址,从而可实现器件的有效访问。自Philips公司推出I2C总线后,Philips公司及其他公司纷纷相继推出了许多I2C总线产品,如各种微处理器、存储器(PCF8571/8570,128/256 字节)、A/D(PCF8591)、D/A(TDA8442/8444)转换器、E2PROM及各种I2C总线接口电路(PCF8
[单片机]
I2C<font color='red'>串行总线</font>在单片机8031应用系统中的设计与实现
在基于ADSP BF533的嵌入式Linux系统上的移植
1 引言 Boot Loader(内核引导程序)是在操作系统内核运行之前运行的一段自举程序,用于初始化硬件设备、改变处理器运行模式、重组中断向量和建立内存空间映射图,从而将系统的软硬件带到一个合适的状态或者用户定制的特定状态,以便为最终加载操作系统内核准备好正确的环境 。 嵌入式Linux系统常用的Boot Loader有arm-boot、redboot、U-Boot等。U-Boot (全称Universal Boot Loader)是当前比较流行的遵循GPL条件的开放源码项目。U-Boot具有源码公开的特点,开发人员可根据自身需要进行裁减;支持多种处理器和嵌入式操作系统内核;具有多种设备驱动源码:支持种引导方式;具有功能
[单片机]
在基于ADSP BF533的嵌入式<font color='red'>Linux系统</font>上的移植
S3C2440-IIC
[单片机]
基于Linux系统和ZigBee的智能家居系统
0 引言 随着网络技术和通信技术的不断发展以及人们对生活要求的不断提高,实现家庭智能的远程监控已经成为必然的趋势。国家建设部住宅产业化促进中心提出住宅小区要实现六项智能化要求,其中包括实行安全防范自动化监控管理:对住宅的火灾、有害气体的泄漏实行自动报警;防盗报警系统应安装红外或微波等各种类型报警探测器;系统应能与计算机安全综合管理系统联网;计算机系统能对防盗报警系统进行集中管理和控制。随着GPRS远程通信技术和短距离无线网络通信技术的不断发展和成熟,智能家居的监控技术也逐步成熟,GPRS网络通信业务是通信公司推出的一项数据传输通信业务,在GPRS网络覆盖区域内,传输距离不受限制,通信费用相对低廉,传输速率较快。ZigBee短距离无
[单片机]
基于<font color='red'>Linux系统</font>和ZigBee的智能家居系统
华为笔记本电脑开始使用LINUX系统
对华为而言,此举不失为一个明智的抉择。在手机操作系统领域,目前已被苹果的IOS系统和谷歌的安卓系统垄断。而IOS系统是封闭式,只为苹果手机使用;安卓是开放性,当谷歌与华为停止合作后。华为手机将无法使用安卓系统。 对于华为而言,无路可走,那么自己开辟道路。 为此,华为自主研发了鸿蒙操作系统,鸿蒙不仅可以供华为手机使用,还可以供华为其他物联网智能终端产品服务。而这条路,华为最艰巨的是生态系统的建设,这个除了技术实力、企业实力之外,还需要时间。 为此,华为现在先从已有的、开放性的LINUS操作系统入手,先借助LINUX的生态,让华为的智能终端产品先运行起来。等鸿蒙操作系统成熟后,再考虑以自身的系统为主力。 对于LINUX而言,有了华为这
[手机便携]
串行总线的触发和分析
  随着嵌入式技术的发展,串行总线技术也被越来越多的应用于各个领域。比如CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,现在在欧洲已是汽车网络的
[嵌入式]
通用串行总线接口USB
  由于多媒体技术的发展对外设与主机之间的数据传输率有了更高的需求,因此,USB总线技术应运而生。USB(Universal Serial Bus),翻译为中文就是通用串行总线,是由Conpaq,DEC,IBM,Inter,Microsoft,NEC和Northen Telecom等公司为简化PC与外设之间的互连而共同研究开发的一种免费的标准化连接器,它支持各种PC与外设之间的连接,还可实现数字多媒体集成。    USB接口的主要特点是:即插即用,可热插拔。USB连接器将各种各样的外设I/O端口合而为一,使之可热插拔,具有自动配置能力,用户只要简单地将外设插入到PC以外的总线中,PC就能自动识别和配置USB设备。而且带宽更大,增加
[嵌入式]
基于Linux系统的软PLC设计
引言 可编程控制器(PLC,Programmable LogicController)经过几十年的发展,现在已经成为了最重要、最可靠、应用场合最广泛的工业控制微型计算机。然而,人们在使用过程中也逐渐发现了传统PLC的缺点:兼容性差,由于生产厂家众多,各种机型互不兼容,没有统一的标准,难以构造统一的硬件结构;封闭、扩展能力差:产品能力的功能实现依赖硬件;对使用者的要求高:现行的PLC 产品,其编程方式要求使用者对PLC的硬件结构、电器原理、编程指令都要有相当的了解;可维护性差:PLC 出现故障时需要专业人员用专业工具进行检测和维修;成本较高,传统PLC 被几家厂商所垄断,性价比增长缓慢。这些问题都制约着传统PLC 的发展。近年来,
[应用]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved