I2C总线
一主多从的通信协议
通信都是由主设备发起的
SCL:时钟线,由主端控制
SDA:数据线,主端和从端都可以配置
SCL和SDA的默认电平状态是高(上拉电阻)
i2c通信协议:
START信号:起始信号,SCL保持高,SDA从高到低跳变
STOP信号:结束信号,SCL保持高,SDA从低到高跳变
从设备地址:用来标识从设备的唯一性,从设备地址分为固定和可变的两部分
at24c02
adp8860
ACK信号:应答信号,表示是否处于数据交互的状态
I2C的通信过程:
1.主设备发送起始信号
2.主设备发送从设备地址(确定要访问的从设备)
3.主设备发送读写信号
4.从设备在位,就必须发送一个ACK信号给主设备
5.根据从设备的说明手册进行通信
6.如果数据交互完毕,主设备发送STOP信号
S5PV210内部集成了I2C控制器,I2C总线上数据交互时,所需的时序要求,都通过控制起来完成操作
控制器发起的时序,有些是固定的,有些是可变的,
固定:START/STOP/ACK/ R/W
可变:设备地址,读写设备的地址,数据
我们只需要把这些可变的信息高速I2C控制器,开始控制器即可完成相应的操作
基于以上内容,内核实现了I2C的驱动
I2C总线驱动
管理的硬件是I2C控制器,关心如何进行数据传输,不关心数据的具体含 义,总线驱动一般由芯片厂家提供,内核中已经存在
make menuconfig
Device Drivers --->
<*> I2C support --->
I2C Hardware Bus support --->
<*> S3C2410 I2C Driver
i2c设备驱动
管理的硬件是I2C从设备,关心的是从设备地址,访问从设备的方法,关 心数据的具体含义,不关心数据的传输,I2C设备驱动只需要将要传输的数据交给I2C总线驱动即可
linux内核i2c驱动框架
app:open read write
------------------------------------
i2c设备驱动
关心数据的具体含义,不关心数据的传输
eeprom_read................
-------------------------------------
内核提供了统一的方法实现设备驱动和总线驱动的数据交互
i2c_transfer();//老式接口
SMBUS接口(提供了一组函数);//新式接口
新式接口兼容老式接口
----------------------------------
I2C总线驱动
-----------------------
I2C控制器《=====》I2C从设备
I2C设备驱动如何实现?
使用设备---总线---驱动模型
i2c_bus_type总线
dev链表:i2c_client
drv链表:i2c_driver
i2c_client和i2c_driver如何使用
i2c_driver如何使用?
1.分配i2c_driver
2.初始化i2c_driver
struct i2c_driver eeprom_drv =
{
.id_table