i2c总线简单介绍

原创 2018年04月16日 00:26:55

2018/4/16

51单片机

1.说在前面:

今天朋友拿了一个ADDA模块,但是看到上面的SDA,SCL,瞬间就蒙了,学过的东西要记住去复习,边用边学,边用边复习

2.i2c

1.介绍是一种串行总线,结构比较简单,只有SDA(数据线)和SCL(时间线)

2.预备知识:

2-1.该总线是使用了上拉电阻来接正电源,总线为空闲(无数据交流),两根线都为高点平,但是任一为低电平,会拉低总线电平

2-2:在i2c进行数据传输的时候,只有时钟信号为高电平时,数据线上的数据才处于稳定状态,时钟信号为低电平的时候,数据线上才可以进行修改

2-3:SCL为高电平的时候,SDA从高变为低为起始状态,SCL为高电平,SDA从低变为高位终止

3.模式配置代码

1.时序图


起始位配置(I2cStart())

void Delay10us(void)
{
    unsigned char a,b;
    for(b=1,b>0;b++)
    {
        for(a=2;a>0;a--);
    }
}
//模拟起始信号
void I2cStart()
{
    SDA=1;
    Delay10us();//10us
    SCL=1;
    Delay10us();//10us
    SDA=0;
    Delay10us();//10us
    SCL=0;
    Delay10us();//10us
}

终止位配置( I2cStop())

void I2cStop()
{

    SDA=0;
    Delay10us();//10us
    SCL=1;
    Delay10us();//10us
    SDA=1;
    Delay10us();//10us
}

判断发送信号正误(1/0)

unsigned char I2cSendByte(unsigned char dat)//获得返回值,判断是否发送正确
{
   unsigned char a=0;
   for(a=0;a<8;a++)
   {
        SDA=dat>>7;//SDA来检测高位
        dat=dat<<1;循环向回推
        Delay10us();//总线时序最高4.7us
        SCL=1;//保持时钟线稳定
        Delay10us();
        SCL=0;//改变数据
        Delay10us();
   }
   int b=0;
   while(SDA)//设置没有应答的情况,返回1
   {
        b++;//设置变量
        if(b>200)//超过200ms
        {
            SCL=0;
             Delay10us();

        }

   }
   SCL=0;
   Delay10us();
   return 1;//发送成功,返回1

}

读取数据 (SDA储存的数据)

//读取数据
unsigned char I2cReadByte()
{
    unsigned char a=0,dat;
    for(a=0;a<8;a++)
    {
        SCL=1;
        Delay10us();//稳定数据
        dat<<=1;
        dat|=SDA;
        Delay10us();//稳定数据
        SCL=0;
        Delay10us();




    }
    return dat;


}



写入数据(写入初始地址和数据)

void At24c02Write(unsigned char addr,unsigned char dat)
{
    I2cStart();
    I2cSendByte(0xa0);//寄存器操作,写入
     //发送数据
     I2cSendByte(addr);//写入数据
     I2cSendByte(dat);//写入数据,
     I2cStop();//停止

}

读取数据(注意状态反转)

unsigned char At24c02Read(unsigned char addr)
{
    unsigned char num;
    I2cStart();
    I2cSendByte(0xa0);
    I2cSendByte(addr);//发送首地址
    I2cStart();
    I2cSendByte(0xa1);//读取数据
    I2cstop();



简单介绍I2C总线

第7章  I2C 总线简介 ZLG7290B与微控制器的接口形式是I2C串行总线,因此有必要简要地介绍一下I2C总线协议标准。第8章还给出了用C51编写的I2C总线软件包,以供参考学习。 7.1 I2...
  • junyeer
  • junyeer
  • 2015-06-13 16:51:19
  • 5239

I2C总线和SPI总线

I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输(字节高位先传),每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一...
  • u010667082
  • u010667082
  • 2015-07-24 13:37:20
  • 1360

I²C总线的总结

先看下总线的知识: 总线(Bus)是指计算机组件间规范化的交换数据(data)的方式,即以一种通用的方式为各组件提供数据传送和控制逻辑。从另一个角度来看,如果说主板(Mother Board)是一座...
  • sinat_20265495
  • sinat_20265495
  • 2015-12-19 22:23:13
  • 2842

个人总结之I2C总线协议

1.what is I2C? 简单讲就是用来传输数据的两根线:一根数据线(SDA)一根时钟线(SCL) 2.I2C怎么传输的? (1)基本过程:      1.主机发出开始信号      2...
  • black_yu
  • black_yu
  • 2016-07-16 20:03:22
  • 8128

SPI、I2C和UART三种串行总线协议的区别

SPI、I2C跟UART三种串行总线协议的区别 第一个区别当然是名字:      SPI(Serial Peripheral Interface:串行外设接口);      I2...
  • kai_zone
  • kai_zone
  • 2016-11-23 11:25:17
  • 2952

SPI、UART、I2C三种串行总线简介

SPI、UART、I2C三种串行总线简介
  • ivy_reny
  • ivy_reny
  • 2015-11-18 10:22:25
  • 855

I2C总线死锁原因及解决方法

原文地址:I2C总线死锁原因及解决方法作者:zhm4976转发网易DP先生关于I2C的博文,便于学习时查找 最近发现访问I2C设备时,主设备复位可能会引起i2C死锁,表现为SCL为高,SDA一直为低,...
  • u012045426
  • u012045426
  • 2016-08-28 08:57:43
  • 1203

SPI总线和I2C总线的异同点

一:SPI接口的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM、FL...
  • lishun1422840684
  • lishun1422840684
  • 2017-09-01 19:51:24
  • 1266

I2C总线及总线阻塞

这个问题以前还真遇到过但是没有仔细分析过原因,这次被问到这个问题傻了,看到网上的一些相关文档后,整理了这篇文章,主要分析产生原因和解决办法。 首先还是看看I2C相关的一些步骤的总线状态: ...
  • goodwillyang
  • goodwillyang
  • 2015-05-30 10:31:47
  • 2241
收藏助手
不良信息举报
您举报文章:i2c总线简单介绍
举报原因:
原因补充:

(最多只允许输入30个字)