单片机信息网:深圳市今科电子有限公司
网站地图 RSS订阅
高级搜索 收藏本站
会员中心 欢迎投稿
首页 | 业界动态 | 解决方案 | 技术文献 | 下载中心 | 单片机学习 | 单片机原理 | 单片机编程 | 单片机设计 | 单片机开发 | 技术专题 | 单片机论坛 |单片机博客| 联系我们
单片机新闻 | 单片机学习 | 单片机编程 | 单片机设计 | 单片机开发 | 单片机原理 | 单片机解密 | 芯片解密 | IC解密 | 单片机方案 | 51单片机 | AVR单片机 | PIC单片机
单片机程序实例大全 | 潜入式系统 | PCB设计 | 单片机资料下载 | 工具/软件下载 | 技术经验分享 | 单片机技术人生 | IC资料下载 | 数字电路 | 模拟电路 | 单片机空间
当前位置:主页>嵌入式系统>文章内容
嵌入式Linux系统中I2C总线设备的驱动设计
来源:单片机信息网 作者: 发布时间:2007-10-21 阅读次数: 【大 中 小】【收藏本文】 【打印

嵌入式Linux系统中I2C总线设备的驱动设计


引言

  I2C总线是PHILIPS公司推出的两线式串行总线,用于连接微控制器及其外围设备,具有简单、高效等特点。由于其接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片引脚的数量,降低了互联成本,特别适用于嵌入式产品。

  而Linux系统具有开源、免费、网上资源丰富等优点,目前已成为嵌入式系统的主流选择。因此如何在嵌入式Linux系统中实现I2C功能成为实际开发中的问题。

  I2C总线

  I2C 总线通过串行数据SDA 和串行时钟SCL线在连接到总线的器件间传递信息,每个器件都有一个唯一的地址识别。根据数据传输时的功能不同,把器件分为主机和从机。主机是初始化总线 的数据传输并产生允许传输的时钟信号的器件,通常是微控制器。此时,任何被寻址的器件都被认为是从机,例如LCD驱动器、E2PROM等。

  I2C总线协议规定,各主机进行通信时都要有起始、结束、发送数据和应答信号。这些信号都是通信过程中的基本单元。起始信号就是在SCL线为高时SDA线从高变化到低;停止信号就是在SCL线为高时SDA线从低变化到高;应答信号是在SCL为高时SD
A为低;非应答信号相反,是在SCL为高时SDA为高。

  总线传送的每1帧数据均是1个字节。协议规定,在启动总线后的第1个字节的高7位是对从机的寻址地址,第8位为方向位(“0”表示主机对从机的 写操作;“1”表示主机对从机的读操作),其余的字节为操作数据。数据传送过程是:在I2C总线发送起始信号后,发送从机的7位寻址地址和1位表示这次操 作性质的读写位,在有应答信号后开始传送数据,直到发送停止信号。主机每发送1个字节就要检测SDA线上有没有收到应答信号,有则继续发送,否则将停止发 送数据。

  Linux中I2C总线驱动结构

  Linux系统对I2C总线具有很好的支持。与硬件物理连接相对应的,Linux的I2C框架中各个部分的关系如图1所示。

 

图1 Linux内核I2C总线驱动程序构架

  内核中I2C相关代码可以分为三个层次:

  1. I2C core框架:提供了核心数据结构的定义和相关接口函数,用来实现I2C适配器驱动和设备驱动的注册、注销管理,以及I2C通信方法上层的、与具体适配器无关的代码,为系统中每个I2C总线增加相应的读写方法。

  2. I2C总线适配器驱动:定义描述具体I2C总线适配器的i2c_adapter数据结构、实现在具体I2C适配器上的I2C总线通信方法,并由i2c_algorithm数据结构进行描述。

  3. I2C 设备驱动:定义描述具体设备的i2c_client和可能的私有数据结构、借助I2C core提供的函数接口完成设备在内核的注册,并实现具体的功能,包括read, write以及ioctl等对用户层操作的接口。

  总体而言,Linux中I2C总线的驱动分为两个部分:总线驱动(BUS)和设备驱动(DEVICE)。I2C core与I2C总线适配器驱动完成了硬件上的主机总线驱动(BUS),而I2C driver则实现了从机设备驱动。在设计中,I2C core提供的接口是统一的,不需要修改,我们只需要实现特定I2C总线适配器驱动和I2C设备驱动,这样大大提高了系统的可移植性。

  笔者在某个产品中曾用AT91RM9200和X1227构成嵌入式系统的时钟模块。在该设计中,AT91RM9200作为I2C的主机部分,X1227作为从机。下面以此为例,具体介绍这两部分驱动的实现。

  AT91RM9200 I2C总线驱动实现

  AT91RM9200是ARM920T处理器,它提供标准的两线接口TWI,即I2C接口,主机工作模式。通过TWI 控制寄存器TWI_CR设置I2C工作模式和状态。时钟由寄存器TWI_CWGR中编程值产生。该寄存器定义了TWCK 信号,使接口适应宽范围时钟。

  具体在linux中AT91RM9200 I2C总线适配器驱动的实现,首先初始化AT91RM9200 I2C的工作模式,然后装载I2C总线驱动,这需要两个结构模块来描述:struct i2c_adapter和struct i2c_algorithm


 

  初始化i2c_adapter结构成员如下:

  static struct i2c_adapter at91rm9200_adapter = {
name:           "AT91RM9200",  
id:           I2C_ALGO_SMBUS,  
algo:           &at91_algorithm,  
algo_data:      NULL,  
inc_use:        at91_inc,  
dec_use:        at91_dec,  
... ...
};

  这个模块并未提供读写函数,具体的读写方法由第二个模块struct i2c_algorithm提供。

  static struct i2c_algorithm at91_algorithm = {
 name:  "at91 i2c" ,
 id:  I2C_ALGO_SMBUS,
 smbus_xfer: at91_smbus_xfer,
 master_xfer: at91_xfer,
 functionality: at91_func,
};

  通过调用I2C core中的接口函数i2c_add_adapter将这两个模块注册到操作系统里,总线驱动就算装上了。由此可见,i2c_algorithm实现了 i2c通信具体方法。针对本文at91rm9200 I2C适配器, at91_xfer最为关键。分析内核可知,I2C core框架中提供给主机使用的数据传输接口:i2c_master_send,i2c_master_recv,i2c_transfer最终都是通过 调用at91_xfer实现。

  数据传输处理如下:数据发送主机初始化Start状态后,向主机模式寄存器TWI_MMR中DADR发送一个7位从机地址,以通知从机器件。从 机地址后的位表示传输方向(写或读)。该位为0,说明是写操作(发送操作);若该位为1,说明为数据读请求( 接收操作)。TWI 传输要求从机每收到一个字节后均要给出应答。在应答时钟脉冲中,主机释放数据线(HIGH),将从机拉低以产生应答。主机在该时钟脉冲中轮询数据线,可使 用轮询或中断方式来检验状态位。若从机未应答该字节,将置位状态寄存器TWI_SR的NAK 位。

  写操作则发送数据至保持寄存器TWI_THR,设置TWI_CR的START 位以启动传输。数据在内部移位寄存器中移位,当检测到应答,TXRDY位置位,直到TWI_THR中有新数据写入,才清除该位。主机产生STOP 状态来结束传输。设置START 后开始读序列。当状态寄存器中RXRDY 位置位时,接收保持寄存器(TWI_RHR)以收到一个字符。当读TWI_RHR 时RXRDY 位复位。

  TWI接口可执行多种传输格式:7位从机地址和10位从机地址。通过主机模式寄存器TWI_MMR配置三个内部地址字节。若从机仅支持7 位地址,IADRSZ 必须置为0。若从机地址大于7 位,用户必须配置地址大小IADRSZ 并在内部地址寄存器TWI_IADR中设置其他从机地址位。

  X1227的设备驱动实现

  X1227 是一个带有时钟、日历、CPU 监控电路和两路查询报警的实时时钟。时钟使用一个低成本的32.768kHz 的晶体作为输入,可精密地用秒、分钟、小时、日期、星期、月、年来显示时间,它可以自动调整闰年至2096年。同时X1227有一个看门狗定时器、3个超 时时间可供选择。另外,X1227有一个4K位的EEPROM阵列,可用作某些用户配置数据的存储器。下面以X1227为例,说明一个具体的I2C设备驱 动程序的设计要点。

  如前所述,I2C总线驱动只是提供了对一条总线的读写机制,本身并不会去做通信。通信是由I2C设备驱动来做的,设备驱动透过I2C总线同具体 的设备进行通讯。一个设备驱动有两个模块来描述,struct i2c_client和struct i2c_driver。i2c_client用来描述一个具体的I2C设备,i2c_driver结构提供了i2c_adapter与 i2c_client之间的通信方式。

  struct i2c_driver x1227_driver = {
 name:  襒1227?
 id:  I2C_DRIVERID_X1227,
 flags I2C_DF_NOTIFY,
 attach_adapter: x1227_probe,
 detach_client: x1227_detach,
 command: x1227_command
};


 

  初始化i2c_adapter结构成员如下:

  static struct i2c_adapter at91rm9200_adapter = {
name:           "AT91RM9200",  
id:           I2C_ALGO_SMBUS,  
algo:           &at91_algorithm,  
algo_data:      NULL,  
inc_use:        at91_inc,  
dec_use:        at91_dec,  
... ...
};

  这个模块并未提供读写函数,具体的读写方法由第二个模块struct i2c_algorithm提供。

  static struct i2c_algorithm at91_algorithm = {
 name:  "at91 i2c" ,
 id:  I2C_ALGO_SMBUS,
 smbus_xfer: at91_smbus_xfer,
 master_xfer: at91_xfer,
 functionality: at91_func,
};

  通过调用I2C core中的接口函数i2c_add_adapter将这两个模块注册到操作系统里,总线驱动就算装上了。由此可见,i2c_algorithm实现了 i2c通信具体方法。针对本文at91rm9200 I2C适配器, at91_xfer最为关键。分析内核可知,I2C core框架中提供给主机使用的数据传输接口:i2c_master_send,i2c_master_recv,i2c_transfer最终都是通过 调用at91_xfer实现。

  数据传输处理如下:数据发送主机初始化Start状态后,向主机模式寄存器TWI_MMR中DADR发送一个7位从机地址,以通知从机器件。从 机地址后的位表示传输方向(写或读)。该位为0,说明是写操作(发送操作);若该位为1,说明为数据读请求( 接收操作)。TWI 传输要求从机每收到一个字节后均要给出应答。在应答时钟脉冲中,主机释放数据线(HIGH),将从机拉低以产生应答。主机在该时钟脉冲中轮询数据线,可使 用轮询或中断方式来检验状态位。若从机未应答该字节,将置位状态寄存器TWI_SR的NAK 位。

  写操作则发送数据至保持寄存器TWI_THR,设置TWI_CR的START 位以启动传输。数据在内部移位寄存器中移位,当检测到应答,TXRDY位置位,直到TWI_THR中有新数据写入,才清除该位。主机产生STOP 状态来结束传输。设置START 后开始读序列。当状态寄存器中RXRDY 位置位时,接收保持寄存器(TWI_RHR)以收到一个字符。当读TWI_RHR 时RXRDY 位复位。

  TWI接口可执行多种传输格式:7位从机地址和10位从机地址。通过主机模式寄存器TWI_MMR配置三个内部地址字节。若从机仅支持7 位地址,IADRSZ 必须置为0。若从机地址大于7 位,用户必须配置地址大小IADRSZ 并在内部地址寄存器TWI_IADR中设置其他从机地址位。

  X1227的设备驱动实现

  X1227 是一个带有时钟、日历、CPU 监控电路和两路查询报警的实时时钟。时钟使用一个低成本的32.768kHz 的晶体作为输入,可精密地用秒、分钟、小时、日期、星期、月、年来显示时间,它可以自动调整闰年至2096年。同时X1227有一个看门狗定时器、3个超 时时间可供选择。另外,X1227有一个4K位的EEPROM阵列,可用作某些用户配置数据的存储器。下面以X1227为例,说明一个具体的I2C设备驱 动程序的设计要点。

共2页: 上一页 1 [2] 下一页

上一篇:如何选择合适的嵌入式软件开发平台   下一篇:DSP25年–让梦想照进现实

标签:嵌入式 Linux系 统中 I2C总线 设备 驱动 点此搜索本站更多相关信息...搜索更多相关内容..

您可能还感兴趣的内容: 深圳今科电子单片机解密、IC解密服务 今科电子单解机、IC解密业务是怎样的流程?

此页的访问者还关注了下面这些相关资讯


·如何选择合适的嵌入式软件开发平台
·DSP25年–让梦想照进现实
·使用图形化的开发环境——LabView开发嵌入式系统
·用UML建模开发嵌入式软件
·达芬奇数字媒体片上系统的架构和Linux启动过程
·基于ADV202的嵌入式视频压缩系统软硬件设计
·基于μC/OS-II嵌入式系统的低功耗开发
·用USB启动Windows XP Embedded
·嵌入式Linux系统的动态电源管理技术
·FPGA的DSP性能揭秘
·嵌入式操作系统uClinux和eCos的比较
·嵌入式操作系统的新动向
·嵌入式实时操作系统Nucleus PLUS在S3C2410A上移植的实
·Keil C动态内存管理机制分析及改进
·基于模型和产品代码生成的汽车嵌入式系统设计
·分析技术:让世界变得更安全、更清洁、更美好
·红旗嵌入式系统EOSnux占彩票终端半壁江山
·用现场可编程门阵列实现的频率计
·基于PNX1500的嵌入多媒体平台
·FPGA在语音存储与回放系统中的应用
·基于FPGA的32 Kbit/s CVSD语音编解码器的实现
·SI/C负极在实际应用中的失效原因分析
·混合仿真下DDS的改进研究与实现
·用FPGA实现数据远距离的高精度传输
·TMS320C61416 EMIF总线下双FPGA加载设计
·基于IXP2400的RPR综合业务接入系统设计
·μC/OS-II中缩短中断关闭时间的方法
·8位机嵌入式TCP通信速度的研究
·基于嵌入式Web的电子交警系统
·嵌入式闪存使“智能”汽车接口应用得以实现
·嵌入式移动通信技术的研究与发展
·一种新的嵌入式TCP/IP协议栈的研究与实现
·在嵌入FPGA的IP核8051上实现TCP/IP的设计
·基于ARM的嵌入式多参数监护仪设计与实现
·基于MPC860T的嵌入式通信服务器的设计与实现
·基于ET系列的嵌入式多媒体导游系统的设计
·基于嵌入式系统的隔离硬件设计
·基于Linux和S3C2410的嵌入式图象传输系统设计
·嵌入式系统设计的核心技术
·便携式设备发展的新思路


版权声明:
( 更多版权详述 | 隐私政策 )

1、凡本网注明“来源:单片机信息网”或“单片机论坛”的文字、图片和音视频作品,版权均属深圳市今科电子有限公司所有,任何媒体、网站或个人未经本网书面授权不得转载、链接、转贴或以其他方式使用;已经本网书面授权的,在使用时必须注明“来源:单片机信息网”或“单片机论坛””。
2、本网未注明“来源:单片机信息网”或“单片机论坛”的作品均为转载稿,本网转载稿件只为传递更多信息,并不意味着认同其观点或真实性。如其他媒体、网站或个人转载使用,必须保留本网注明的“稿件来源”,并自负法律责任。
3、对于单片机信息网通过单片机论坛发布的作品,本网受著作权人委托禁止任何媒体、网站或个人在未经书面授权的情况下转载使用。
4、为维护自身权益、尊重作者版权,单片机信息网特委托深圳市律师协会为本网站法律顾问。对于违反本声明的,单片机信息网律师将依法追究其责任;对于刊载作品涉及版权等问题的,请作者在两周内与网站管理或张朝阳律师联系。
责任编辑:今科电子
双击复制本文网址,发送给您QQ/MSN上的朋友:
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。

·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
§最新评论
今科热门解密系列
·PIC芯片DSP系列单片机解密PIC芯
·Freescale单片机解密飞思卡尔芯
·飞思卡尔(Freescale)单片机解密/
·pic18f系列单片机解密
·三星(Samsung)系列单片机极速解
·飞林Feeling芯片系列MCU单片机/I
·MICROCHIP微芯(PIC)系列单片机/M
·单片机破解的常用方法及应对策略
·IC卡预付费电度表的安全及防范技
·单片机解密 单片机解密方法 单片
·PHILIPS系列单片机解密
·独家STC单片机解密
·我对红外遥控信号的解码思路
·51系列单片机解密(数分钟搞定)
·芯片解密业务流程介绍
·单片机解密后提供什么文件?
·单片机解密后为何要提供厂家的专
·芯片是如何被解密的?
·SST系列MCU单片机/IC/芯片解密
·INTEL系列单片机/IC/芯片解密
·ISSI系列MCU单片机IC破解芯片解
·ZILOG系列MCU单片机IC破解芯片解
·MOTOROLA系列MCU单片机IC破解芯
·LG(HYUNDAI系列MCU单片机/IC破
·MCPLD/EPLD系列MCU单片机IC破解
·新茂系列MCU单片机IC破解芯片解
·PHILIPS系列MCU单片机IC破解芯片
·MXIC系列MCU单片机IC破解芯片解
·(ATMEL)51系列MCU单片机IC破解芯
·华邦芯片系列MCU单片机/IC/芯片
·(MICROCHIP)微芯(PIC)系列MCU单
·CYPRESS系列MCU单片机IC破解芯芯
·Sinowealih系列MCU单片机IC破解
·Tenx系列MCU单片机IC破解芯片解
·松翰(SONIX)系列MCU单片机IC破解
·义隆(EMC)系列MCU单片机IC破解
·合泰(HOLTEK)系列MCU单片机IC破
·麦肯(MDT)系列mcu单片机IC破解芯
·今科单片机解密服务
·单片机程序开发
热点技术文章文献
·嵌入式系统的技术特点及前景展望
·加密存储芯片AT88SC1616的原理和
·编写适合自己需要的printf()函数
·基于ARM的嵌入式网络收音机的设
·嵌入式Linux的GDB调试环境建立
·用USB启动Windows XP Embedded
·基于ARM7的指纹考勤机设计
·HC(S)08单片机的高效C语言编程
·基于Linux和S3C2410的嵌入式图象
·基于FPGA的32 Kbit/s CVSD语音编
·嵌入式实时Linux的技术研究
·X86嵌入式处理器开发
·基于WinCE的ARM视频监控系统
·如何制作嵌入式Linux文件系统
·模拟器开发以及嵌入式系统内核调
·基于DM642的嵌入式网络视频服务
·嵌入式系统的发展趋势:网络互联
·嵌入式数据库Berkeley DB 环境使
·嵌入式系统中USB主机控制器的设
·基于mClinux的嵌入式USB接口设计
·Keil C动态内存管理机制分析及改
·54M无线网络适配器在嵌入式系统
·使用虚拟机嵌入式Linux开发前的
·基于AVR单片机的嵌入式“瘦服务
·用MSP430实现的嵌入式因特网终端
·基于TinyXml的嵌入式Linux
·Java能否主演嵌入式应用开发?
·嵌入式芯片同质化的对策
·32位ARM嵌入式处理器的调试技术
·基于嵌入式ARM的LCD图像显示系统
今科推荐产品
·51系列单片机解密(数分钟搞定)
·今科单片机解密服务
·单片机程序开发
·小家电(厨卫电器)系列产品
·灯饰控制系列产品
·四键遥控器系列产品
·红外遥控器系列产品
相关技术文献资讯
·如何选择合适的嵌入式软件开发平
·DSP25年–让梦想照进现实
·使用图形化的开发环境——LabVie
·用UML建模开发嵌入式软件
·达芬奇数字媒体片上系统的架构和
·基于ADV202的嵌入式视频压缩系统
·基于μC/OS-II嵌入式系统的低功
·用USB启动Windows XP Embedded
·嵌入式Linux系统的动态电源管理
·FPGA的DSP性能揭秘
·嵌入式操作系统uClinux和eCos的
·嵌入式操作系统的新动向
·嵌入式实时操作系统Nucleus PLUS
·Keil C动态内存管理机制分析及改
·基于模型和产品代码生成的汽车嵌
·分析技术:让世界变得更安全、更
·红旗嵌入式系统EOSnux占彩票终端
·用现场可编程门阵列实现的频率计
·基于PNX1500的嵌入多媒体平台
·FPGA在语音存储与回放系统中的应
·基于FPGA的32 Kbit/s CVSD语音编
·SI/C负极在实际应用中的失效原因
·混合仿真下DDS的改进研究与实现
·用FPGA实现数据远距离的高精度传
·TMS320C61416 EMIF总线下双FPGA
论坛最新讨论资讯
芯片解密常见问题
· 什么是单片机?
· 单片机要如何加密?
· 单片机芯片是如何被解密的?
· 单片机解密后提供什么文件?
· 芯片解密为何用专用格式文档?
· 芯片解密是怎样的业务流程?
首页 - 隐私政策 - 版权申明 - 网站地图 - 产品中心 - IC解密中心 - 企业文化 - 代理加盟 - 公司简介 - 人才招聘 - 常见问题 - 我要投稿 - 联系我们 - 返回顶部
[单片机信息网] .© 2006-2009 版权所有,严禁非法复制与建立镜像.运营商:[今科电子] 公司地址:中国.深圳/上海 E-Mail:renbangent#126.com sales#techmcu.com(换#为@)
深圳公司 电话热线:+86 0755-82964200 82964201 82964700 传真:0755-82964432 支持手机:13684994966 业务QQ: 501995683 联系人:王小姐 张小姐(工程师) 罗先生(高工)
上海公司 电话热线:+86 021-63062380 15001885509   传真:+86 021-63062380-6   技术支持:15001885509 业务QQ:xxxxxxxx   联系人:郑小姐(业务) 陆工(工程师)
Optimized for 1024x768 to Firefox,Opera and MS-IE6 or higher,Template designed by: Berlin Lee.Web Support[FuAn Network] ICP Record No.:07053756 Webmaster