iic应用篇

2023-12-13 21:55:18

一.iic的优点?

????????1. IIC总线物理链路简单,硬件实现方便,扩展性非常好(1个主机控制器可以根据需求增加从机数量,同时删减从机数量也不会影响总线通信);IIC总线只需要SDA和SCL两条信号线,相比于PCI/LocalBus动则几十根信号线要简单太多,就算是SPI总线也至少需要4根信号线,而且片选(CS)数量受限(器件扩展受限);相对UART总线虽然只需要2条信号线,但一般只用于1对1通信(UART的一对多的通信也是可以的,但实现起来比较复杂)。

????????2.?采用IIC总线的器件封装更容易实现小型化,对PCB空间的要求较小;采用IIC总线的器件管脚数量得到明显的简化,举个栗子:采用SPI总线的EEPROM至少需要8个管脚,那么IIC总线的EEPROM只需要4个管脚,可以减少一半的器件面积。

????????3. IIC总线规范已经成熟稳定,IIC接口在不同行业的应用也非常广泛,大多数处理器/单片机集成了IIC控制器,而且很多种不同应用的器件支持IIC接口;

????????????????1,总线接口的生命力很旺盛,容易找到该总线接口的器件升级;

????????????????2,总线的软硬件接口设计标准化,开发难度低;

????????????????3,用一个总线解决不同器件的管理,简化系统软硬件设计;

????????????????4,IIC总线的各种问题已在大量应用中暴露出来,只需要关注已发现的问题,提前做好设计,就能保证总线的可靠。

????????4. IIC总线的故障诊断和调试简单,由于IIC总线信号线少,协议简单,所以如果出现故障,可以很容易通过示波器抓到时钟或信号线上的故障;

????????5. IIC总线通信:有抗电磁干扰高,电流损耗小,电源电压范围宽以及工作温度范围广等特点,适合应用于如下需求的板内部器件之间数据通信:

????????????????1,由至少一个主机(Master)和其它外围从机(Slave)组成;

????????????????2,IIC总线在系统中不同器件连接的成本最小;IIC器件接口复杂度小,器件封装小(器件成本小),IIC器件以及器件总线PCB走线所占PCB面积小(PCB成本小)等等;

????????????????3,用于控制功能的系统不要求高速的数据传输(适合低速数据通信);尽管IIC总线没有并行总线的数据吞吐能力,但只需要很少的信号线和连接管脚;总的效益由选择的器件和互连总线结构的种类决定。

二.IIC总线概念

????????IIC总线器件通过SDA(串行数据)和SCL(串行时钟线)在器件间传递信息,每个器件都有一个唯一的地址(无论是控制器、LCD、EEPROM或键盘接口),而且都可以作为是发送器或接收器。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机:主机(Master)是初始化总线的数据传输并产生允许传输的时钟信号的器件,而任何被寻址的器件都被认为是从机(Slave)。

三.使用AT24C02进行数据存储

1.开始位和停止位代码

?2.发送字节信息和接收字节信息

?

?

3.发送应答和接收应答

4.字节写

5.随机读代码

6.用AT24C02存储数据在LCD_1602显示屏显示

????使用LCD_1602进行显示,第二行显示num数字,当我们单击按钮时:

  • 点击k1,Num--

  • 点击k2,Num++

  • 点击k3,将Num的数据存储到AT24C02的地址为1的空间中

实现代码

void main(void)
{
  LCD_Init();
  LCD_ShowNum(1,1,Num,5);
  while(1)
  {
    KeyNum = Keynum_Get();
    if(KeyNum == 1)
    {
      Num++;
      LCD_ShowNum(1,1,Num,5);
    }
    if(KeyNum == 2)
    {
      Num--;
      LCD_ShowNum(1,1,Num,5);
    }
    if(KeyNum == 3)
    {
      AT24C02_WriteByte(0,Num%256);//取低八位放到0字节地址
      AT24C02_WriteByte(1,Num/256);//取高八位放到1字节地址
      LCD_ShowString(2,1,"Write OK!");
      delay_ms(1000);
      LCD_ShowString(2,1,"         ");
    }
    if(KeyNum == 4)
    {
      Num = AT24C02_ReadByte(0);//读低八位(地址0的数据)
      Num |= AT24C02_ReadByte(1) << 8;//读高八位(地址1的数据),程序自动数据类型转化,将一个字节的返回值转换成两个字节的数据,然后左移八位变成高八位
//      Num |= (unsigned int)AT24C02_ReadByte(1) << 8;
      LCD_ShowNum(1,1,Num,5);
      LCD_ShowString(2,1,"Read OK!");
      delay_ms(1000);
      LCD_ShowString(2,1,"        ");
    }
  }
}

????????这样我们每次重启时就可以看到上次存储的数字了。

文章来源:https://blog.csdn.net/weixin_66634995/article/details/134981481
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。