完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
本帖最后由 芯灵思FAE 于 2016-6-20 11:25 编辑 第24课:I2C驱动程序及应用程序开发(一)
(一)I2C总线介绍 I2C总线是有Philips公司开发的,它是一种比较简单的总线,接线简单,只有两根线,数据线(SCL)和时钟线(SDA),控制简单,所以一些封装较小的器件多使用I2C总线,常见的使用I2C总线的设备有EEPROM、rtc及一些传感器,这里我们介绍下基于Linux的I2C设备驱动的编写。 I2C设备驱动的编写有多种方式: 一种是直接操作CPU的I2C控制器,正对于某一个设备写一个字符驱动,这种驱动相对来说比较直接,不需要太依赖于内核相关配置,但这类设备驱动依赖CPU,可移植性较差。 一种是基于Linux内核I2C子系统完成设备驱动的编写,一般内核会继承相关CPU的控制器驱动,即使没有也可以通过技术支持获得,所以我们只需要使用Linux下I2C子系统提供的相关接口来构建我们的设备驱动就行了,这样我们的设备驱动并不依赖于某一个特定的CPU,可移植性较好。 在写驱动之前我们先了解下I2C总线中几个比较重要的概念: 1、地址 I2C总线上可以连接多个相同或者不同的设备,总线怎样才能知道数据应该发送到哪个设备呢,这里需要一个地址来唯一的标识一个设备,I2C设备地址有7位地址和10位地址,那么这个地址是怎么来的呢,其实这个地址我们可以通过相关的芯片手册获得,这里通过一个EEPROM和一个温度传感器来说明。 EEPROM(AT24C02/04/08/16)芯片手册上有如下说明:
再结合原理图
再通过芯片手册我们可以知道EEPROM的地址的前四位为1010,通过原理图A0/A1/及NC的状态,我们可以知道后三位为000,这样我们就知道这个EEPROM在I2C总线上的地址为7’b1010000。 同样我们可以通过如下内容知道温度传感器的地址为7’b1001000
2、时序 不同的I2C设备有不同的时序,也可以说是不同的协议,我们需要了解一些时序相关的东西,我们发送数据是什么时候开始什么时候结束,怎么发送都由这个时序决定
(二)I2C总线应用程序 现在的CPU多数都有I2C控制器,我们不需要太关心具体时序的实现,这些都由控制器去完成,并且内核已经集成多数CPU的I2C控制器驱动,我们写设备驱动就是按照I2C子系统的要求,为他提供需求的数据即可。 I2C子系统下设备驱动有两种模式,一种是用户模式设备驱动,这种驱动依赖I2C子系统中的i2c-dev这个驱动,我们需要在应用程序去封装数据,这需要应用程序的开发人员具备相当的硬件基础,另外一种是普通的设备驱动,我们来看一下这两种方法的具体实现过程。 用户模式驱动实现: 相关结构体: |
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
芯灵思SinlinxA33开发板Linux内核workqueue(附实测代码)
12232 浏览 0 评论
芯灵思SinlinxA33开发板Linux内核 tasklet 机制(附实测代码)
12907 浏览 0 评论
芯灵思Sinlinx A33开发板 Linux内核等待队列poll ---阻塞与非阻塞
35150 浏览 0 评论
芯灵思Sinlinx A33开发板Linux中断编程 3-应用程序
35079 浏览 0 评论
39164 浏览 0 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 07:10 , Processed in 0.564600 second(s), Total 38, Slave 29 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3208