驱动: i2c驱动 >>>>

1. IIC协议:

<<um_s3c2440a_rev10.pdf>>  p481 Figure 20-3. IIC-Bus Interface Data Format
<<AT24C08_DataSheet.pdf>>  Figure 1-12 Bus Timing and Device operations

iic总线里的角色:
    主机(Master):初始化发送、产生时钟信号和终止发送的器件
    从机(Slave):被主机寻址的器件

I2C的原则是:
    在SCL=1(高电平)时,SDA千万别忽悠!!! 否则,SDA下跳则"判罚"为"起始信号S",SDA上跳则"判罚"为"停止信号P".
    在SCL=0(低电平)时,SDA随便忽悠!!!(可别忽悠过火到SCL跳高)
    一条总线只有一个主机, 其他都是从机.
    
一次iic交互的例子:
    写AT24C08:
    start信号  +  addr + data[N] + stop信号    
    {
        1.   master发送start信号:     [scl高+sda下降沿]
        
        2.1. master发送addr: 7位设备地址 + R/W; 发完立刻把电平拉高,等待slave的ack;
                [sda在scl低电平的时候准备数据, 在scl上升沿时发送数据] * 8次
                MSB---先发最高位数据sda.
        2.2. slave收到master的start信号后,就开始监测master的数据了. 收到addr完毕并且发现addr就是自己的时候,马上拉低sda以表明传输有效(这就是所谓ack).
        
        3.1 主机收到ack后接着发送数据data, 这里是写1个字节,那就和发送addr用同样的方法连续发送8个bit就是了.
        同样,发完立刻把电平拉高,等待slave的ack;
        3.2 slave收到8位data完毕,马上拉低sda以表明传输有效(ack).
        
        4.   master收到ack,马上发送stop信号以关闭通信.
        
        说明:
        iic协议允许一次连接中传输多个字节,具体最多允许多少个字节看器件(AT24C08允许8个字节连续传输), 但是必须以8bit为单位, 接收方要给一个ack才会继续后面的传输.
        明确start和stop是由master发起的.
        
    }

一次iic交互的例子:
    读AT24C08:
    start信号  +  addr + data1 + start信号 + addr + data2[N] + stop信号    
    {
        你没看错, 有两次start, 一次stop.
        两次的addr地址都是同一个slave的, 区别在于它们的第8bit, 第一次是W(因为要写地址),第二次是R(读数据)
        data1指定数据存储在AT24C08中的哪个地址.
        data2[]是要写入的数据.
    }   

2. iic驱动
<<韦东山Linux视频第2期_从零写驱动第32课第1.1节_3.4.2内核下的I2C驱动之框架介绍_P.WMV>>

next: >>>>


原文地址:https://www.cnblogs.com/mylinux/p/5561562.html