IIC驱动

        IIC驱动分为总线驱动和设备驱动,总线驱动只提供读写机制和函数,设备驱动才是真正进行通信的部分,总线驱动又分为IIC控制器驱动和算法模块,控制器驱动并未提供读写机制,而算法模块提供了读写机制,通常情况下每个IIC总线驱动都定义自己的读写算法,但是鉴于大部分的IIC读写算法一致,通常可以使用一致的读写算法,也定义自己定义修改,总线驱动一般是由芯片厂商实现,开发人员只实现设备驱动。总线驱动只是提供了对一条总线的读写机制,本身并不会去做通信。通信是由I2C设备驱动来做的,设备驱动透过I2C总线同具体的设备进行通讯。一个设备驱动有两个模块来描述,struct i2c_driver和struct i2c_client。一个client代表着一个设备,使用driver驱动一个设备,因而不仅一个I2C总线可以挂多个不同类型的设备,一个设备驱动也可以同时为挂在多个不同I2C总线上的设备服务。

         Intel制定了SMBus标准用于低速通讯。SMBus二线接口与I2C接口非常相似。SMBus也使用一条数据线(SMBDATA)和一条时钟线(SMBCLK)实现通讯。I2C接口和SMBus接口的主要区别是最大和最小时钟速度。SMBCLK必须在10kHz和100kHz之间。SMBCLK和SMBDATA线也需要上拉电阻。3V供电时上拉电阻大于8.5k ,5V供电时上拉电阻大于14k 。SMBus工作电压范围在3V和5V之间,大于2.1V为高电平,低于0.8V为低电平。struct i2c_adapter对应于物理上的一个适配器,而struct i2c_algorithm对应于一套通讯方法。i2c_algorithm提供一些控制适配器发送或接收函数,对于i2c总线需要初始化master_xfer函数,对于smbus总线需要初始化smbus_xfer函数。master_xfer函数是以i2c_msg为单位进行控制的。

        

        i2c_driver和i2c_client用于控制设备驱动方面的结构。当i2c_driver->attach_adapter探测到物理设备后,因为i2c_client对应一个真实的物理设备则把探测到的i2c_client->adapter指向其依附的适配器的struct i2c_adapter 结构,把i2c_client->driver指向其依附的 i2c_driver结构.其注册和注销的函数分别为 i2c_attach_client和i2c_detach_client.

      总线驱动需要定义一个包含 struct i2c_adapter的私有数据结构,用 i2c_adapter->algo_data指向它即可。

  1. 在总线驱动中需要探测并初始化适配器,分配一下IO地址和中断资源。
  2. 定义并初始化i2c_algorithm,依据总线类型为i2c或是smbus定义 master_xfer或smbus_xfer函数。

IIC驱动可以在应用层实现,也可以在驱动层实现,驱动层实现只是将在应用层实现的内容移到驱动层,IIC驱动应用层有两种实现方式,smbus算法和i2c算法。

你可能感兴趣的:(IIC,嵌入式,1024程序员节)