历史上的今天
返回首页

历史上的今天

今天是:2025年07月14日(星期一)

正在发生

2018年07月14日 | 单片机:IIC总线通信

2018-07-14 来源:eefocus

一、IIC总线通信

1、简介:

 IIC 即Inter-Integrated Circuit(集成电路总线),I2C总线是PHLIPS公司推出的一种串行总线, I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。

 每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。

2、常用的串行扩展总线有:

(1)、I2C (Inter IC BUS)总线
(2)、单总线(1-WIRE BUS)
(3)、SPI(Serial Peripheral Interface)总线等。

3、IIC总线电路接法

 I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。

        

4、IIC总线通信协议

(1)起始和终止信号

 SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;

 SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。


(2)应答和非应答

 IIC 总线协议规定,每传送一个字节数据后,都要有一个应答信号以确定数据传送是否被对方收到。应答信号由接受设备产生,在SCL为高电平期间,接受设备将SDA拉低为低电平,表示数据传输正确,产生应答。



(3)数据传送

数据位的有效性规定

 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。


5、IIC通信基本函数

(1)起止信号


i2c_Start()

 

 {

 

    SDA = 1;   //SCL为高电平时,SDA 出现一个下跳沿表示I2C总线启动

    SCL = 1;

    i2c_Delay();

    SDA = 0;

    i2c_Delay();

 

    SCL = 0;  // 启动后将SCL点平拉低

    i2c_Delay();

 }


(2)终止信号


void i2c_Stop()

{

    SDA = 0;  //当SC高电平时,SDA出现一个上升沿表示I2C总线停止

    SCL = 1;

    i2c_Delay();

    SDA = 1;

    i2c_Delay(); 

}

(3)发送数据


void i2c_SendByte(unsigned char Byte)

{

    unsigned char i = 0;   

    for (i = 0; i < 8; i++)  

    {

        if(Byte & 0x80)    //IIC规定下发送高位数据

        {

             SDA = 1;  

        }

        else   

             SDA = 0;  

        SCL = 1;          //在SCL为高电平期间写入数据

        i2c_Delay();   

        SCL = 0;  

        Byte <<= 1;

        if (i == 7)

            SDA = 1;      //在发送完数据后将SDA拉高

        i2c_Delay();

    }

}

(4)接收数据


unsigned char i2c_ReadByte()

{

    unsigned char i = 0;

    unsigned char value = 0;

    for (i = 0; i < 8; i++)

    {

         value <<= 1;      //先读取高位

         SCL = 1;          //SCL 为高电平时读取数据

         i2c_Delay(); 

         if(SDA)

         {

             value++;

         }

         SCL = 0;

         i2c_Delay();

    }

    return value;

}

(5)发送应答信号


void char i2c_Ack()

{

    SDA = 0;      //SCL为高电平时间SDA拉低表示应答

    i2c_Delay();

    SCL = 1;

    i2c_Delay();

    SCL = 0;

    i2c_Delay();

    SDA = 1;

    i2c_Delay();

}

(6)发送非应答信号


void i2c_NAck()

{

    SDA = 1;    //SCL高电平期间SDA拉高表示非应答

    i2c_Delay();

    SCL  = 1;

    i2c_Delay();

    SCL = 0;

    i2c_Delay();

}


(7)等待应答


unsigned  char i2c_WaitAck()

{

    unsigned char ret;

    SDA = 1;      

    i2c_Delay();

    SCL = 1;       //把SCL拉高读取SDA的点平高低,低电平表示应答

    i2c_Delay();

    if(SDA == 1)

    {

        ret = 1;

    }

    else

        ret = 0;

    SCL = 0;

    i2c_Delay();

    return ret;

}

(8)检查IIC设备总线


unsigned char i2c_CheckDevice(unsigned char _Address)

{

    unsigned char UcAck;

    if (SDA == 1 &&  SCL == 1)

    {

        i2c_Start();

        i2c_SendByte(_Address|I2C_WR); //发送地址

        ucAck = i2c_WaitAck();         //等待接收应答    

        i2c_Stop();                    //停止信号

        return ucAck;                  

    }

    return 1;

}





推荐阅读

史海拾趣

HAHN - Elektrobau GmbH & Co KG公司的发展小趣事

高通公司在追求技术创新的同时,也积极履行企业社会责任。公司发布了《2023高通中国企业责任报告》,详细介绍了高通如何通过赋能数字化转型、负责任地经营以及可持续地运营等战略重点领域,推动社会公平发展。高通与中国乡村发展基金会、中国红十字基金会等多个机构合作,开展智慧农业、基层医务工作者培训等项目,助力乡村振兴和医疗卫生事业发展。此外,高通还致力于STEM教育,通过合作项目为下一代创新者提供技能和知识支持。这些举措不仅体现了高通的社会责任感,也为其在电子行业中的长远发展奠定了良好的社会基础。

Engineered Components Co公司的发展小趣事

在稳固了国内市场后,ECC开始积极拓展国际市场。他们参加了多个国际电子展会,展示了公司的技术和产品。通过与国际客户的交流与合作,ECC逐渐打开了国际市场的大门。同时,ECC还与国际知名电子企业建立了长期合作关系,共同研发新产品、开拓市场。这些举措使得ECC在国际市场上的知名度不断提升。

Blaze Display Technology Co Ltd公司的发展小趣事

随着公司规模的不断扩大和市场份额的逐步提升,Blaze公司开始注重品牌建设和形象提升。通过加大广告宣传力度、提升客户服务质量、参与社会公益活动等方式,公司成功塑造了专业、可靠、创新的品牌形象。同时,公司还获得了多项行业荣誉和认证,进一步提升了品牌知名度和美誉度。

Eaton公司的发展小趣事

近年来,随着全球对环保和可持续发展的关注日益增加,伊顿公司也积极响应这一趋势,将其技术与绿色能源相结合。伊顿的EX-DMi型电容器金属封闭柜、SCB型环氧浇注干式变压器等产品,在新能源大基地建设中得到了广泛应用。这些产品不仅具有高效、稳定的性能,还采用了无SF6绝缘技术等环保技术,有效降低了温室效应的影响。此外,伊顿还推出了可支持锂电系统的UPS等产品,为光伏和风电机组等关键部件提供安全稳定的供电保障。

EPIGAP公司的发展小趣事

随着公司业务的不断拓展,EPIGAP公司意识到单靠自身力量难以应对日益复杂的市场环境。于是,公司开始积极寻求与产业链上下游企业的战略合作。通过与原材料供应商、代工厂商以及终端客户的紧密合作,EPIGAP公司实现了产业链的整合优化,提高了整体运营效率。这一战略不仅降低了公司的运营成本,还增强了公司的市场竞争力。

HBControls公司的发展小趣事
如果重启无效,可能是显示屏连接线松动或损坏。需要打开冰箱后盖检查连接线是否牢固连接。

问答坊 | AI 解惑

汽车预防冲撞领域商机无限,高田助力Tyzx开发测距技术

 三维测量技术开发商美国Tyzx日前宣布,接受了来自车用预防冲撞传感器开发商高田的技术开发投资。该投资打算用于将Tyzx拥有的距离测量技术推向汽车领域,应用于汽车与障碍物间的距离检测用途。不过目前尚未公布投资额。   &nbs ...…

查看全部问答>

怎样学会PLC

学习PLC一点也不难。有的初学者在理论上花了很多功夫,结果半年下来还是没有把PLC搞懂,其实他们只是缺少了一些PLC的实践经验,只要再进行一些实际的梯形图编写、程序下载、调试等操作,增加对PLC的感性认识,很快就可以掌握PLC这项技术了。开始阶 ...…

查看全部问答>

毕业设计(怎样利用MCS51单片机和PTR8000实现无线传输和发送)

为了共同的毕业设计目的(怎样利用MCS51单片机和PTR8000实现无线传输和发送) 有空我们可以互相交流下 QQ:515979200…

查看全部问答>

影响LED灯带价格的9大要素

replyreload += \',\' + 382176;     采购LED灯带的时候,不要只是关注价格。教你从以下几个方面去综合考核,以便买到性价比最好的LED灯带。Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

硬件高手请进

  有一个32*16 的FIFO 用于视屏采集 现要用DMA 将FIFO数据 按帧(176*144*2 Bytes) 送到SDRAM ,且DMA一帧只启动一次 FIFO深度 不等于 DMA配置传送的长度 这怎么实现DMA不间断传输啊  ???我是做 驱动的 硬件具体实现很 ...…

查看全部问答>

单片机中断响应慢的问题

我使用STC的单片机在使用INT0脚(P3^2)时读取高低电平时,发现比其它P0、P1、P2脚的响应的速度都慢。我试过用P2^5脚位能够完整读取高低电平的波形,但采用INT0口读取时出现波形丢失现象,采用中断读取时也是一样。 我的程序是首先启用T1计数器累加 ...…

查看全部问答>

求助:wince socket 蓝牙编程中怎样用OBEX协议封装数据

我是刚接触蓝牙开发的,最近要做一个蓝牙文件传输的应用,就是实现蓝牙设备之间的文件传输, MSDN上研究过SOCKET实现的API函数,但是不知道连接成功后发送的数据怎样才能让对方识别, 网上有人说\"这些数据必须是经过OBEX协议封装好的数据\" 请做过这 ...…

查看全部问答>

修改JOYSTICKMOUSE发送数据,前4字节正确后4错误

各位大大,我想问一下,我想修改JOYSTICK MOUSE程序,源程序是一次发送4字节,我想改为发送8字节,可是改完后抓包发现发送的前4个字节是正确的,后四个自己却是错误的,请问为什么? 修改的地方:SetEPTxCount(ENDP1, 8); UserToPMABufferC ...…

查看全部问答>