历史上的今天
返回首页

历史上的今天

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

正在发生

2018年07月14日 | 51单片机的IIC总线

2018-07-14 来源:eefocus

一、IIC

(一)、IIC有什么作用


穿插:

上垃电阻一般接电源,下拉电阻一般接地

上拉电阻作用:

1、增加驱动电流

2、让线悬空电平不好确定,让总线在浮空的状态下,有确定的电平,滤除干扰

(二)、IIC通信协议


1、起始信号

SCL为高电平时,SDA由高变低

SCL为高电平时,SDA由低变高

函数:

void iic_start()

{

    SDA = 1;//首先操作SDA,再操作SCK,防止SCK在高电平时,SDA出现高低电平的变化

      SCK = 1;

      delay_us(1);//10us

      SDA = 0;

      delay_us(1);//10us

      SCK = 0;//钳住总线,让iic总线失效

}

void iic_stop()

{

    SDA = 0;

      SCK = 1;

      delay_us(1);

      SDA = 1;

      delay_us(1);

      SCK = 0;

}

2、IIC总线的数据传送

规定:

SCK(时钟线)为1时,数据必须保持稳定

SCK为0时,数据允许变化

传送一个字节,先发数据最高位,再发次高位,直至最低位

IIC发送数据函数

unsigned char iic_send_byte(unsigned char byte)

{

    unsigned char i;

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

      {

              SDA = byte & 0x80;//51中,若unsigned char 赋给一个bit类型的,则bit类型的值当unsigned char非0时为1,                                                                 否则为0

              SCK = 1; //先给SCK赋值,保持时钟为高电平时,数据稳定

              delay_us(1);//10us

              SCK = 0;

              byte <<= 1;

        }

        //检测应答信号

        SDA = 1;

        SCK = 1;

        delay_us(1);//10us

     

        if(0 == SDA)

        {

              SCK = 0;

              return SUCC;

        }

        else

        {

              SCK = 0;

              return FAIL;

        }

}

IIC接收数据函数

unsigned char iic_rcv_byte()

{

    unsigned char i;

      unsigned char temp;

      SDA = 1;//防止上一次操作将SDA给拉低

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

      {

              SCK = 0;

              delay_us(1);

              SCK = 1;

              delay_us(1);

              temp <<= 1;//发送最高位,先放在最低位,然后移位,一直移到第八次

              if(1 == SDA)

                {

                      temp += 1;//如果SDA为0,为temp+=0,所以省略

                }

        }

        SCK = 0;//钳住总线

        return temp;

}

3、应答信号和非应答信号

应答:在SCK为高电平期间,接收设备将SDA拉低为低电平,

应答信号函数:

void iic_ack()//应答函数

{

    SDA = 0;

      SCK = 1;

      delay_us(1);

      SCK = 0;//钳住总线

}

在发送函数末尾可以添加:

        //检测应答信号

        SDA = 1;

        SCK = 1;

        delay_us(1);//10us

     

        if(0 == SDA)

        {

              SCK = 0;

              return SUCC;

        }

        else

        {

              SCK = 0;

              return FAIL;

        }


非应答信号:

void iic_noack()//非应答信号

{

    SDA = 1;

      SCK = 1;

      delay_us(1);

      SCK = 0;//钳住总线

}

二、EEPROM

型号                    容量

AT24C02        256bit  (开发板)  

AT24C04        512bit

AT24C08        1024bit

AT24C16        2048bit

关于设备的地址:


对EEPROM写入

unsigned char at24c02_send_str(unsigned char device_addr,unsigned char rom_addr,unsigned char *str,unsigned char num)

{

    unsigned char result;

      unsigned char i;

      iic_start();

      result = iic_send_byte(device_addr);

      if(FAIL == result)

        {

              return FAIL;

        }

      result = iic_send_byte(rom_addr);

      if(FAIL == result)

        {

              return FAIL;

        }

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

      {

                result = iic_send_byte(*str++);

                if(FAIL == result)

                {

                        return FAIL;

                }

        }

        iic_stop();

        return SUCC;

}

对EERPOM读取:

unsigned char at24c02_rcv_str(unsigned char device_addr,unsigned char rom_addr,unsigned char *str,unsigned char num)

{

    unsigned char result;

      unsigned char i;

      iic_start();

      result = iic_send_byte(device_addr);

      if(FAIL == result)

        {

              return FAIL;

        }

      result = iic_send_byte(rom_addr);

      if(FAIL == result)

        {

              return FAIL;

        }

        iic_start();

      result = iic_send_byte(device_addr + 1);

      if(FAIL == result)

        {

              return FAIL;

        }

        for(i = 0; i < num - 1; i++)

      {

                *str++ = iic_rcv_byte();            

        iic_ack();                    

        }

        *str = iic_rcv_byte();

        iic_noack();

        iic_stop();

        return SUCC;

}


推荐阅读

史海拾趣

赛微(Cellwise)公司的发展小趣事

随着公司业务的不断发展和技术实力的不断提升,赛微开始积极拓展国际市场。公司坚持“以人为本”的理念,积极引进国际化人才,加强与国际知名企业的合作与交流。通过多年的努力,赛微已经成功打入国际市场,与众多国际知名企业建立了长期稳定的合作关系,实现了业务的国际化拓展。

General Dynamics SATCOM Technologies公司的发展小趣事

随着公司业务的不断发展和技术实力的不断提升,赛微开始积极拓展国际市场。公司坚持“以人为本”的理念,积极引进国际化人才,加强与国际知名企业的合作与交流。通过多年的努力,赛微已经成功打入国际市场,与众多国际知名企业建立了长期稳定的合作关系,实现了业务的国际化拓展。

Cadeka公司的发展小趣事

Cadeka公司始终将品质和创新作为企业发展的核心。公司建立了严格的质量管理体系,确保每一件产品都符合高标准的质量要求。同时,公司还不断投入研发资金,推动技术创新和产品升级。通过品质和创新并重的发展战略,Cadeka公司赢得了客户的信赖和市场的认可。

GTE Microcircuits公司的发展小趣事
复合放大器在长时间工作后性能下降的原因可能包括元件老化(如电阻、电容值的变化)、温度漂移、以及电源波动等。为了缓解这些问题,可以定期校准电路、使用温度稳定性好的元件、以及加强电源的稳定性和滤波。
HALO Electronics公司的发展小趣事
优化复合放大器的增益稳定性主要涉及到选择合适的放大器类型(如低噪声、高精度运算放大器)、精确的电路设计(如使用温度系数低的电阻和电容)、以及适当的电源去耦和滤波技术。此外,采用反馈网络来稳定增益也是一种常见的方法。
Digital公司的发展小趣事

DIALIGHT公司一直专注于工业LED照明领域的发展。他们深入了解工业空间照明的需求和挑战,设计了一系列专为工业应用而定制的LED照明产品。这些产品不仅易于安装和维护,而且能在恶劣的环境下持续使用。此外,DIALIGHT还提供集成系统解决方案,帮助客户降低能源成本、维护成本和碳足迹,同时提高设施的安全性和生产力。通过不断创新和优质服务,DIALIGHT在工业LED照明领域赢得了广泛的认可和信赖。

问答坊 | AI 解惑

示波器的原理与使用方法

示波器的原理与使用方法…

查看全部问答>

传感器和变送器的区别

传感器和变送器的区别 传感器是能够受规定的被测量并按照一定的规律转换成可用输出信号的器件或装置的总称,通常由敏感元件和转换元件组成。当传感器的输出为规定的标准信号时,则称为传感器。 变送器的概念是将非标准电信号转换为标准电信号 ...…

查看全部问答>

哪位大侠有protues 包含dac0832,adc0804等单片机专用元件库

各位大侠:     小弟,想在protues中模拟仿真单片机实验,无奈找不到相关的器件,如adc0804,dac0832等有关器件,敢问那位大侠有单片机仿真的专用元件库,小弟期待中!!…

查看全部问答>

关于2440lcd 24bpp显示问题

我在移置2440的Bootload中的lcd驱动时候,设置24bpp Mode显示,现在屏幕上显示的内容为屏幕的上半边水平依次显示了两个一摸一样的我欲显示的开机画面,下半部分无任何显示,请问应该调节那几个参数啊。 我显示16bpp mode时候可以正常显示并调试通 ...…

查看全部问答>

WinCE显示网页

(1)事件:我在WINCE中用CreateWindow(TEXT(\"DISPLAYCLASS\")……)创建了一个浏览网页的控件,当我点击按钮打开网页A后,紧接着再点击另外的按钮打开网页B。 (2)现象:每次在网页B加载完成以前,先前的已经浏览过的旧网页A总是会显示出来直到网页B ...…

查看全部问答>

2011器件清单

20MHz普通示波器(双通道,外触发输入,有X轴输入) 60MHz双通道数字示波器 低频信号发生器(1Hz~1MHz) 标准高频信号发生器(1MHz~30MHz,可输出1mV小信号) 函数发生器(10 MHz,DDS) 低频毫伏表 高频毫伏表 100 MHz频率计 失真度测试 ...…

查看全部问答>

PIC16F690程序例子adc+uart+timer+eeprom

附件为PIC16F690程序例子adc+uart+timer+eeprom,下不来的可以加我QQ。…

查看全部问答>

ara-tracer ii仿真不了。

我用EasyJTAG-H仿真程序没有问题,现在我想用ARM-tracer ii仿真就不行,程序是MagicARM2410光盘中复制出来的,在AXD中也增加了multi-ice,并且也找到cpu,点击DEBUG后,进入AXD不会自动加载,AXD左下方有此显示:RDI Warning 00166: <tag \"RDIEr ...…

查看全部问答>

双核工控机

ITX主板(17CMX17CM)、CPU双核1.6、DDR800 2G、ST500G 7200PRM、双千兆网卡、4USB2.0、5COM、15“三星液晶+15”触摸屏。    …

查看全部问答>

diy无线遥控器

想自己做一个2.4g的无线遥控器,遥控距离要远,采用什么样的芯片,放大器,天线呢,希望能够推荐下,…

查看全部问答>