3519|1

139

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【从0教学嵌入式Linux】第二十四集(上) [复制链接]

本帖最后由 babyking 于 2016-6-20 11:39 编辑

24课:I2C驱动程序及应用程序开发(一)
(一)I2C总线介绍
I2C总线是有Philips公司开发的,它是一种比较简单的总线,接线简单,只有两根线,数据线(SCL)和时钟线(SDA),控制简单,所以一些封装较小的器件多使用I2C总线,常见的使用I2C总线的设备有EEPROMrtc及一些传感器,这里我们介绍下基于LinuxI2C设备驱动的编写。
I2C设备驱动的编写有多种方式:
一种是直接操作CPUI2C控制器,正对于某一个设备写一个字符驱动,这种驱动相对来说比较直接,不需要太依赖于内核相关配置,但这类设备驱动依赖CPU,可移植性较差。
一种是基于Linux内核I2C子系统完成设备驱动的编写,一般内核会继承相关CPU的控制器驱动,即使没有也可以通过技术支持获得,所以我们只需要使用LinuxI2C子系统提供的相关接口来构建我们的设备驱动就行了,这样我们的设备驱动并不依赖于某一个特定的CPU,可移植性较好。
在写驱动之前我们先了解下I2C总线中几个比较重要的概念:
1、地址
I2C总线上可以连接多个相同或者不同的设备,总线怎样才能知道数据应该发送到哪个设备呢,这里需要一个地址来唯一的标识一个设备,I2C设备地址有7位地址和10位地址,那么这个地址是怎么来的呢,其实这个地址我们可以通过相关的芯片手册获得,这里通过一个EEPROM和一个温度传感器来说明。
EEPROM(AT24C02/04/08/16)芯片手册上有如下说明:
再结合原理图
再通过芯片手册我们可以知道EEPROM的地址的前四位为1010,通过原理图A0/A1/NC的状态,我们可以知道后三位为000,这样我们就知道这个EEPROMI2C总线上的地址为7b1010000
同样我们可以通过如下内容知道温度传感器的地址为7b1001000
2、时序
不同的I2C设备有不同的时序,也可以说是不同的协议,我们需要了解一些时序相关的东西,我们发送数据是什么时候开始什么时候结束,怎么发送都由这个时序决定
(二)I2C总线应用程序
现在的CPU多数都有I2C控制器,我们不需要太关心具体时序的实现,这些都由控制器去完成,并且内核已经集成多数CPUI2C控制器驱动,我们写设备驱动就是按照I2C子系统的要求,为他提供需求的数据即可。
I2C子系统下设备驱动有两种模式,一种是用户模式设备驱动,这种驱动依赖I2C子系统中的i2c-dev这个驱动,我们需要在应用程序去封装数据,这需要应用程序的开发人员具备相当的硬件基础,另外一种是普通的设备驱动,我们来看一下这两种方法的具体实现过程。
用户模式驱动实现:
相关结构体:
上面就是我们向底层传递的结构,我们需要把我们的时序封装成这样的结构,然后传递下去就行了
转化为消息结构为:
这里我们封装了两个消息,在这个时序中操作模式改变了,所以我们必须封装为两个时序,如果操作模式不变封装一个消息就可以了,比如如下时序:
我们把刚才封装的消息通过ioctl发下去就能够完成数据的读写了,例程如下:

最新回复

汇总帖在此: 【从0教学嵌入式Linux】——by babyking https://bbs.eeworld.com.cn/forum ... 1139&fromuid=536508   详情 回复 发表于 2016-6-20 13:13
点赞 关注

回复
举报

1万

帖子

203

TA的资源

管理员

来自 2楼
 
汇总帖在此:
【从0教学嵌入式Linux】——by babyking
https://bbs.eeworld.com.cn/forum ... 1139&fromuid=536508
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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