IIC通讯详解笔记

2023-05-16

IIC概述

IIC总线是一种串行半双工两线总线。一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。硬件拓扑如下图所示,且每个器件都有唯一的设备地址来确定每个器件,地址位通常为7bit。

IIC总线是一种多主机总线,连接在IIC总线上的器件可分为主机和从机。其中每个器件都可以作为主机也可以作为从机。(但同一时刻只能有一个主机)。主机有权发起和结束一次通讯。而从机只能被主机呼叫。并且,IIC总线的时钟信号是由主控器件(主机)产生。在传输速率上,串行的8位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。

IIC总线上的器件增加和删除不会影响其他器件正常工作,并且IIC总线在通讯时总线上发送数据的器件称为发送器,接收数据的器件称为接收器

在这里插入图片描述

  • 对于硬件IIC和软件IIC各有优劣,考虑实际情况具体使用。为更好理解IIC,文章下描述的是采用软件IIC。

IIC协议

IIC的通信过程由开始、结束、发送、响应、接收五个部分构成。并且在通讯过程中,IIC的SCL线和SDA线遵循以下原则:

  • 当SCL高电平时采样SDA电平状态,此时SDA电平状态不允许改变。
  • 当SCL低电平时不采样SDA电平状态,此时SDA电平状态允许改变。
  • IIC在总线空闲状态时,这两根线通常是被外部上拉电阻拉高,保持着高电平。

IIC总线通讯过程

  1. 主机发送起始信号启用总线
  2. 主机发送一个字节数据,指明从机地址和后续字节的传输方向(7bit地址加1bit读写(0-主机写/1-主机读))
  3. 被寻址的从机发送应答信号回应主机
  4. 发送器发送一个字节数据
  5. 接收器发送应答信号回应发送机
  6. (…循环4.5)
  7. 通讯完成后,主机发送停止信号释放总线

典型的IIC时序

在这里插入图片描述
在这里插入图片描述
下面是拆分通讯过程的描述和代码实现。
开始信号与停止信号

  • 开始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平。
  • 停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。
  • 此时的起始信号和停止信号都是由主机发出的,起始信号产生后,总线处于占用,停止信号产生后,总线处于空闲状态(MSB)。
    在这里插入图片描述
//产生IIC起始信号
void IIC_Start(void)
{
    SDA_OUT();      //1.设置SDA输出
    IIC_SDA=1;      //2.先拉高SDA      
    IIC_SCL=1;      //3.再拉高SCL,空闲状态
    delay_us(4);
    IIC_SDA=0;      //4.拉低SDA START:when CLK is high,DATA change form high to low 
    delay_us(4);
    IIC_SCL=0;      //5.钳住I2C总线,准备发送或接收数据 
}
//产生IIC停止信号
void IIC_Stop(void)
{
    SDA_OUT();     //1.sda线输出
    IIC_SCL=0;     //2.先拉低SCL
    IIC_SDA=0;     //3.再拉低SDA STOP:when CLK is high DATA change form low to high
    delay_us(4);
    IIC_SCL=1;     //4.拉高SCL
    IIC_SDA=1;     //5.拉高SDA 发送I2C总线结束信号
    delay_us(4);                                   
}

应答信号
发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。

  1. 当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的。应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答。

在这里插入图片描述

//等待应答信号到来
//返回值:1,接收应答失败
//      0,接收应答成功
//1.设置SDA为输入
//2.拉高SDA
//3.拉高SCL
//4.等待接收器返回应答信号,如果数据线SDA一直为高,就一直等待,并返回1(无效应答),如果数据线SDA为低,返回0(有效应答)
u8 IIC_Wait_Ack(void)
{
    u8 ucErrTime=0;
    SDA_IN();      //SDA设置为输入  
    IIC_SDA=1;delay_us(1);       
    IIC_SCL=1;delay_us(1);     
    while(READ_SDA)
    {
        ucErrTime++;
        if(ucErrTime>250)
        {
            IIC_Stop();
            return 1;
        }
    }
    IIC_SCL=0;//时钟输出0        
    return 0;  
}
  1. 当从机向主机发送完一个字节的数据,从机也是需要等待主机给出一个应答信号。

//产生ACK应答
//这里就很清楚了,产生应答:SCL在SDA一直为低电平期间完成低高电平转换
void IIC_Ack(void)
{
    IIC_SCL=0;
    SDA_OUT();
    IIC_SDA=0;
    delay_us(2);
    IIC_SCL=1;
    delay_us(2);
    IIC_SCL=0;
}
//不产生ACK应答    
//这里就很清楚了,不产生应答:SCL在SDA一直为高电平期间完成低高电平转换
void IIC_NAck(void)
{
    IIC_SCL=0;
    SDA_OUT();
    IIC_SDA=1;
    delay_us(2);
    IIC_SCL=1;
    delay_us(2);
    IIC_SCL=0;
}

发送数据

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答            

//IIC_SCL=0;
//在SCL上升沿时准备好数据,进行传送数据时,拉高拉低SDA,因为传输一个字节,一个SCL脉冲里传输一个位。
//数据传输过程中,数据传输保持稳定(在SCL高电平期间,SDA一直保持稳定,没有跳变)
//只有当SCL被拉低后,SDA才能被改变
//总结:在SCL为高电平期间,发送数据,发送8次数据,数据为1,SDA被拉高,数据为0,SDA被拉低。
//传输期间保持传输稳定,所以数据线仅可以在时钟SCL为低电平时改变。
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
    SDA_OUT();         
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        //IIC_SDA=(txd&0x80)>>7;
        //获取数据的最高位,然后左移7位
        //如果某位为1,则SDA为1,否则相反
        if((txd&0x80)>>7)
            IIC_SDA=1;
        else
            IIC_SDA=0;
        txd<<=1;       
        delay_us(2);   //对TEA5767这三个延时都是必须的
        IIC_SCL=1;
        delay_us(2); 
        IIC_SCL=0;    
        delay_us(2);
    }     
}

接收数据


//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   

//先拉低SCL,延时后拉高
//读取数据
//是否发送应答
u8 IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
    {
        IIC_SCL=0; 
        delay_us(2);
        IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
        delay_us(1); 
    }                     
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}

参考文章

[1]: IIC通信详解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IIC通讯详解笔记 的相关文章

  • scl sda 是什么接口_SOC设计控制接口IIC

    IIC全称为Inter Integrated Circuit 集成电路总线 IIC接口只有两根线 SCL SDA SCL为同步时钟线 SDA为数据线 通SPI不同的是 数据线为双向接口 也就是说 发送接收都走这根线 IIC是一种多向控制总线
  • STM32f103c8t6与iML7991的IIC通信

    一 iML7991 7991是应用在TFT LCD领域的P GAMMA芯片 xff0c 利用IIC对其内部的GAMMA值 xff08 共14个 xff09 进行设定 7991地址表参考图1 1 可以看到两个GAMMA值共用3个地址 xff0
  • 对IIC总线时序的一点理解以及ACK和NACK(NAK)

    参考自 xff1a http blog chinaunix net uid 16100003 id 3059814 html 关于IIC的响应问题 xff1a 对于每一个接收设备 xff08 从设备 xff0c slaver xff09 x
  • STM32 HAL库 STM32CubeMX -- I2C(IIC)

    文章目录 一 I2C 协议简介I2C 物理层I2C协议层I2C架构通讯过程 二 STM32Cube MX配置三 I2C HAL库函数 一 I2C 协议简介 I2C 通讯协议 Inter xff0d Integrated Circuit 也就
  • STM32基于IIC协议的OLED模块的使用

    前言 一 项目涉及的内容 项目简介 二 模块实操 1 IIC模块 1 1 IIC协议格式 1 2 开始信号与停止信号 1 3 写数据 1 3 1 硬件IIC代码编写 1 3 2 软件模拟IIC代码编写 2 OLED板块 前言 本篇文章对使用
  • IIC通讯详解笔记

    IIC概述 IIC总线是一种串行半双工两线总线 一根是双向的数据线SDA xff0c 另一根是时钟线SCL 所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上 xff0c 各设备的时钟线SCL接到总线的SCL上 硬件拓扑如下图所示
  • 0.96OLED 4针IIC STM32-标准库版本(附源码)

    0 96OLED 4针IIC STM32标准库版本 在前面已经介绍过 xff0c 这里就不多说了 xff0c 详情请见 xff1a 0 96OLED 4针IIC STM32HAL库版本 另外 xff0c 本人在代码中封装了一个OLED显示的
  • IIC通讯总结

    1 IIC简介 IIC全称Inter Integrated Circuit 是由PHILIPS公司在80年代开发的两线式串行总线 xff0c 用于连接微控制器及其外围设备 IIC属于半双工同步通信方式 2 IIC特点 xff08 1 xff
  • IIC通信协议总结(详细说明完整过程)

    IIC协议简介 IIC xff08 inter integrated Circuit集成电路总线 总线支持设备之间的短距离通信 xff0c 用于处理器和一些外围设备之间的接口 xff0c 它需要两根信号线来完成信息交换 IIC的一个特殊工艺
  • IIC上拉电阻的选择

    上周项目评审的时候 xff0c 评审部门问了我一个问题 xff1a 为什么单片机内部有上拉电阻 xff0c 你们还要用外部的上拉电阻 xff1f 我的答复如下 xff1a 上拉电阻的选取要考虑上限值和下限值这两点 xff1a 上限值的最大限
  • iic片选PCA9548A芯片

    PCA9548A数据表 产品信息和支持 TI com iic片选深入 从上图中我们可以看到通过iic的iic 例如 iic0 扩展出8路iic来访问slave 例如8个口的光模块 那么里面的原理是什么呢 我们先来看PCA9548A 文档 需
  • 通信协议(三)——IIC协议

    1 基础知识 1 1 概念 IIC通讯协议 Inter xff0d Integrated Circuit xff0c 也常被写作I2C 是由 Philips 公司开发的一种简单 双向二线制同步串行总线 xff0c 只需要两根线即可在连接于总
  • Arduino--LCD1602(IIC)

    xff08 1 xff09 简介 前篇文章介绍了LCD1602的四位数据线控制方法 xff1a https blog csdn net u011816009 article details 106573622 但是该方法还是需要较多的IO口
  • STM32——硬件IIC从机通信

    前言 xff1a 根据网上的资料 xff0c 大部分网友表示STM32自带的硬件IIC存在bug xff0c 读写时很容易卡死 自己在调试的时候也出现卡死的情况 xff0c 最后一点一点调试 xff0c 也还是调通了 本文将记录自己调试ST
  • SYD8821 IIC模块使用说明

    SYD8821是具有全球领先低功耗 RX 2 4mA 64 94 5dBm灵敏度 xff0c TX 4 3mA 64 0dBm输出功率 的蓝牙低功耗SOC芯片 xff0c 在极低电流下实现了优异的射频性能 xff0c 搭配176kB SRA
  • IIC 驱动OLED

    IIC总线可以驱动很多器件 xff0c 比较常见的有OLED EEPROM存储器 xff08 AT24C02 xff09 温度传感器 xff08 LM75A xff09 温湿度传感器 xff08 DHT11 xff09 等 有关IIC总线协
  • STM32软件模拟iic驱动oled(显示汉字,图片)(一)

    一 iic驱动模式 1 硬件驱动 xff1a 所谓硬件驱动就是使用STM32板子上固定的iic接口 xff0c 但是由于板载iic数量有限 xff0c 且大多和别的外设有引脚复用 xff0c 在别的外设使用的情况下还得通过重映射引到别的引脚
  • STM32的IIC接口输入输出定义

    IO方向设置 PC11 端口 define SDA IN GPIOC gt CRH amp 61 0XFFFF0FFF GPIOC gt CRH 61 8 lt lt 12 define SDA OUT GPIOC gt CRH amp 6
  • UART,SPI,IIC,RS232通信时序和规则

    一 UART 1 串口通信方式 2 串口通信步骤 注意 xff1a 串口协议规定 xff0c 闲置时必须是高电平 校验位 xff1a 是使用奇偶校验 停止位必须高电平 一个0和多个0区分是靠掐时间 异步通信 xff1a 时钟各不一样 二 I
  • 基于STM32 的IIC 模拟主机编写

    最近在学习STM32 的IIC IO 模拟主机方式 好像失败了 include myiic h include delay h MCU VERSION DATA 作者 other Function IIC

随机推荐

  • 浅谈java继承机制——通过super调用父类方法

    最近在看代码的时候遇到一个天坑 xff0c 由于习惯性思维 xff0c 可能大部分人都会掉近这个坑 xff0c 所以拿出来记录一下 子类使用super调用的父类方法里 xff0c 再调用父类的方法 先来看一段代码 xff08 该段代码只是作
  • ORB_SLAM2运行KITTI数据集

    在前文我们已经安装运行了ORB SLAM2 xff0c 下载和编译 xff08 包括报错 xff09 在文章 xff1a ORB SLAM2下载编译及运行EuRoC数据集 浅梦语11的博客 CSDN博客 euroc数据集下载 并且我们使用运
  • 嵌入式学习札记(基于STM32L431) 一、ARM Cortex-M4微处理器

    ARM Cortex M4微处理器 写在前面ARM Cortex M4微处理器简介ARM Cortex M4微处理器内部结构概要位数总线结构中断控制存储器保护低功耗内部寄存器 寻址方式与机器码获取方法指令保留字简表与寻址方式指令保留字简表寻
  • 嵌入式 Linux平台 C程序 交叉编译技术

    嵌入式Linux平台C程序交叉编译技术 一 实验目的和任务 本实验要求复习和掌握Linux平台的C程序开发过程 本实验要求掌握嵌入式开发板的操作方法 本实验要求掌握Linux平台交叉编译方法和程序运行方法 二 实验设备介绍 B703实验室是
  • MapReduce编程综合应用

    MapReduce编程综合应用 实验环境 VMware虚拟机 xff08 CentOS 7系统 xff09 Hadoop 数据 现有一份汽车销售记录 xff0c 销售记录 包括时间 地点 邮政编码 车辆类型等信息 xff0c 每条记录信息包
  • MySQL报错1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated 解决方法

    1 问题复现 xff1a 今天在进行数据迁移时 xff0c 使用Navicat连接数据库进行连接时 xff0c 由于 SQL语句中使用了 group by分组函数 xff0c 结果报了如下错误 xff1a 2 产生原因 产生原因说是 xff
  • deepin linux 安装配置

    开启root权限 span class token function sudo span span class token function su span root 开启root权限 linux安装curl span class toke
  • 解决Ubuntu1804安装后不能使用root用户远程登录

    解决Ubuntu1804安装后不能使用root用户远程登录 root用户密码正确无法远程 解决方法 1 为root用户设置密码 span class token function sudo span span class token fun
  • git 删除本地/远程分支

    1 删除本地分支 git branch d 本地分支名A 注意 xff1a 需要切换到其他分支下才能删除 xff0c 处于分支A的时候 xff0c 无法删除分支A 切换分支git checkout 本地分支名B 如果本地分支A下有未合并的更
  • RTD\RTK\PPK\PPP\DGPS\地基增强系统\星基增强系统

    xff08 一 xff09 RTD xff08 Real Time Differential xff09 xff1a 实时动态码相位差分技术 RTD计算的是伪距 xff0c 根据基准站已知坐标和各卫星的坐标 xff0c 求出每颗卫星每一时刻
  • NVIDIA JETSON TX2 介绍及上电、刷机全纪录

    一 TX2相关 1 1 图片 1 2 TX2介绍 xff1a NVIDIA Jetson TX2 嵌入式领域的AI超级电脑 它是一台基于NVIDIA Pascal 架构的AI单模块超级计算机 它性能强大 xff0c 外形小巧 xff0c 节
  • 小白控制算法之自抗扰调参经验总结

    最近做的项目用到了自抗扰 xff0c 尝试联系一些相关领域的老师 xff0c 无奈似乎有所保留 xff0c 只得自己从头研究起 讲道理 xff0c 无论是复杂的系统 xff0c 还是超过9个参数的调节 xff0c 整个调程序和调参的过程都不
  • DS001-测试冒泡排序的运行时间

    本程序演示如何测试一段程序的运行时间 以冒泡排序算法为例 include 34 time h 34 与时间相关的函数 include 34 stdlib h 34 rand 函数在此库中 include 34 stdio h 34 输入输出
  • 嵌入式开发,裸机开发,中断,按键控制蜂鸣器。

    0 前言 最近想体验一下面试 xff0c 真正收到公司通知又有点无从下手 xff0c 没有做准备 但是反手一想 xff0c 既然是想体验 xff0c 锻炼而已 xff0c 干就完了 推荐一首歌 Timber MattyBRaps xff0c
  • 到底什么是MCU、MPU、CPU,和芯片是什么关系?区别又是什么?

    目录 0 前言 1 芯片 2 CPU 3 MPU 4 MCU 5 总结 0 前言 更新的是有点慢 xff0c 从这周开始吧 xff0c 应该会快一点 推荐一首歌 你到底有没有爱过我 蓝波 xff0c 额 xff0c 怎么说呢 xff0c 大
  • 从SLAM到视觉识别、VIO,大牛分享!

    用户分享汇总目录 01 双目惯性模组的初探与实践02 通过驱动字写数据采集程序03 INDEMIND双目惯性相机运行MSCFK04 利用开源识别算法进行车牌检测05 双目惯性模组导航项目分享项目简介 xff1a 车体结构 xff1a 技术简
  • zxing的使用及优化

    二维码介绍 zxing项目是谷歌推出的用来识别多种格式条形码的开源项目 xff0c 项目地址为 https github com zxing zxing xff0c zxing有多个人在维护 xff0c 覆盖主流编程语言 xff0c 也是目
  • INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析

    文章目录 一 xff0e OpencCV 4 0 新特性介绍首先是OpenCV完全支持了C 43 43 11DNN xff08 深度神经网络 xff09 模块是目前OpenCV更新最重要的模块G API 为算法的硬件优化加速提供计算图支持O
  • STM32 SWD烧录一次后J-LINK设备消失的问题

    偶然遇到移植程序时烧录一次后无法烧录的问题 如果用的时CUBEMX 应该马上检查SWDIO SWCLK的配置问题 如果无误 那就检查时钟问题 时钟问题有可能导致该问题的发生 看到有其它用户说在标准库的配置中添加 RCC AHB1Periph
  • IIC通讯详解笔记

    IIC概述 IIC总线是一种串行半双工两线总线 一根是双向的数据线SDA xff0c 另一根是时钟线SCL 所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上 xff0c 各设备的时钟线SCL接到总线的SCL上 硬件拓扑如下图所示