• IIC协议详解


    目录

    1.IIC协议概述

    2.IIC总线传输

    3.IIC-51单片机应用

    1.起始信号

    2.终止信号

    3.应答信号

    4.数据发送

    4.IIC-32单片机应用

    用到的库函数:


    1.IIC协议概述

    • IIC全称Inter-Integrated Circuit (集成电路总线)
    • 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式

    特点

    • 简单性和有效性

    由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件

    • 多主控(multimastering)

    其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当 然,在任何时间点上只能有一个主控。

    构成

    IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控 器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线 的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。

    2.IIC总线传输

    IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号。

    //起始位,停止位,数据位,速度

    这些信号中,起始信号是必需的,结束信号和应答信号

    • 起始信号
    • 终止信号
    • 应答信号

    发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;

    应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

    • 数据发送的时序

    3.IIC-51单片机应用

    先确认IO口

    1. sbit scl = P0^1;
    2. sbit sda = P0^3;

    1.起始信号

    1. void IIC_Start()
    2. {
    3. sda = 1;
    4. scl = 1;
    5. _nop_();
    6. sda = 0;
    7. _nop_();
    8. }

    2.终止信号

    1. void IIC_Stop()
    2. {
    3. sda = 0;
    4. scl = 1;
    5. _nop_();
    6. sda = 1;
    7. _nop_();
    8. }

    3.应答信号

    1. char IIC_ACK()
    2. {
    3. char flag;
    4. sda = 1;//就在时钟脉冲9期间释放数据线
    5. _nop_();
    6. scl = 1;
    7. _nop_();
    8. flag = sda;
    9. _nop_();
    10. scl = 0;
    11. _nop_();
    12. return flag;
    13. }

    4.数据发送

    1. void IIC_Send_Byte(char dataSend)
    2. {
    3. int i;
    4. for(i = 0;i<8;i++){
    5. scl = 0;//scl拉低,让sda做好数据准备
    6. sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda
    7. _nop_();//发送数据建立时间
    8. scl = 1;//scl拉高开始发送
    9. _nop_();//数据发送时间
    10. scl = 0;//发送完毕拉低
    11. _nop_();//
    12. dataSend = dataSend << 1;
    13. }
    14. }

    4.IIC-32单片机应用

    用到的库函数:

    1. HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c,
    2. uint16_t DevAddress,
    3. uint16_t MemAddress,
    4. uint16_t MemAddSize,
    5. uint8_t *pData,
    6. uint16_t Size,
    7. uint32_t Timeout)
    • 参数一:I2C_HandleTypeDef *hi2c,I2C设备句柄
    • 参数二:uint16_t DevAddress,目标器件的地址,七位地址必须左对齐
    • 参数三:uint16_t MemAddress,目标器件的目标寄存器地址
    • 参数四:uint16_t MemAddSize,目标器件内部寄存器地址数据长度
    • 参数五:uint8_t *pData,待写的数据首地址
    • 参数六:uint16_t Size,待写的数据长度
    • 参数七:uint32_t Timeout,超时时间
    • 返回值:HAL_StatusTypeDef,HAL状态(OK,busy,ERROR,TIMEOUT)

  • 相关阅读:
    RK3399平台开发系列讲解(内核调试篇)USB摄像头快速测试
    Unity打包基础(未完)
    VS code 下 makefile 【缺少分隔符 停下来】 报错解决方法
    亚马逊店铺运营的五个方法
    时序预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU时间序列预测
    简单解决网页的验证码
    『Java安全』Struts 2.2.3 表单参数类型转换错误OGNL注入漏洞S2-007复现与浅析
    【分隔结构】定从分离
    算法---树状数组
    STM8的C语言编程(5)--8位定时器应用之一
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/132888006