• 驱动: 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: >>>>


  • 相关阅读:
    20200816
    20200815
    20200813
    20200811
    20200810
    20200806
    20200804
    20200803
    20200802
    20200801
  • 原文地址:https://www.cnblogs.com/mylinux/p/5561562.html
Copyright © 2020-2023  润新知