IIC设备驱动及子系统开发
基本概念
- 设备都有自己得设备地址,EEprom存储设备信息,包括设备地址
一般为7位,前四位已经固化好了,其余三位可以通过设计图,上图,看出接地为000,P0,P1也在数据手册中进行描述,为未接,为0. 即AT24LC08(上图有误)地址为1010 000.
总线速度:标准速度100kbps,快速模式400kbps,高速模式3.4Mbps(一般为100,四百也多一点)
IIC特点: 半双工(串行方式),仅需要两根线(所以又被称为2-wixe总线)
设备操作时序
IIC从机设备地址是由主机写进去的
低电平写,高电平读
- IIC开始条件和终止条件,基本时序图如下
读写时序分析
按字节进行写操作
主设备设备地址为1010 000,发送数据,写到地址0x3,写入0x5。
写入逻辑图
按页进行写操作
按页进行写操作如下图。
当前地址读操作
当前地址读操作如下图。
随机读操作
随机读操作如下图。
序列号读操作
序列化读操作如下图。
读写逻辑
结合上图随机读操作进行理解。
写数据
装载AT24C08设备地址:0xA0
设置IIC开始条件
使能ACK
检测状态
装载存储地址 //写数据
使能ACK
检测状态
写数据
使能ACK
设置IIC停止条件
读数据
装载AT24C08设备地址:0xA0
设置IIC开始条件
使能ACK
检测状态
装载存储地址 //读取数据
使能ACK
检测状态
装载设备地址:0xA0|0x1
设置IIC开始条件
使能ACK信号
检测状态
读取数据
关闭ACK信号
设置停止条件
相关寄存器分析
基本寄存器如下。
- I2CCON:使能ACK,选择时钟源,使能Ix/Rx,检测状态
- I2CSTAT:主机发送/接收,设置开始/停止条件,数据Tx/Rx使能,AcK能否被接收?
- I2CDS0:装载设备地址,发送/接收数据
设备驱动框架功能分析
基础知识
IIC基本特征
- IIC是一种数据传输协议(sPI,USB,SDIo,UART.··.)
- 速度比较:IIC(100K,400K,3.4M)<SPI<SDI0<网络<‘USB’
- IIC是一个半双工通信方式,两根总线(SCL,SDA),每个设备都有唯一设备地址
- 一次传输8bit,高位在前,低位在后;总线空闲状态:数据线SDA拉为高电平
IIC设备驱动框架图如下。
i2c设备驱动层组件(i2c-dev.c)
- 给用户提供调用接口
- 实现策略问题:它知道发什么数据,但不知道怎么发数据
i2c核心层组件(i2c-core.c)
- 注册一根i2c总线
- 给驱动编程人员提供编程接口
i2c总线驱动层组件(I2c-s3c2410.c)
读源码:
- 注册一根总线
- 返回一个设备与驱动相对应的结构体,个人连接就是将设备与驱动相连接
- 通过匹配设备名称进行关联,设备匹配函数如下
- 注册I2C驱动
linux设备驱动涉及重要结构体(linux/i2c.h)
- 表示I2C的驱动
- 表示I2C的设备
- 表示I2C的适配器/控制器
- 表示I2C数据包
- 表示I2C板卡信息
设备驱动层分析
IIC主设备号,系统已经设置。
- 注册主设备号,返回设备描述符
2. 创建设备类
3. 绑定适配器
IIC设备驱动层移植
系统内核构成,如图下:
系统流程分析
整体流程如下:
open函数对应的操作流程(包括获取从机的信息):
ioctl函数对应的操作流程(指定client设备地址):
write函数对应的操作流程:
资源层分析
资源层分析图如下:
平台资源构建
平台资源构建如下:
平台数据构建如下:
注册平台设备
注册平台设备如下: