嵌入式通信协议:IIC简明学习笔记

IIC学习笔记

IIC特点

1.适合 小数据场合使用,传输距离短
2.只能有一个主机
3.标准IIC速度为100kHZ高速IIC一般可达400kHZ以上。
4.SCL和SDA都需要接上拉电阻(大小由速度和容性负载决定,一般在3.3k-10k之间)。
5.IIC为半双工通信。
6.为了避免总线信号混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或者集电极开路(OC)输出

IIC物理层

1.IIC有一条双向的串行数据线SDA,一条串行时钟线SCL谁控制时钟线谁就是主设备
2.每个设备都有唯一的地址,有的器件地址出厂时就已经设定好。
3.漏极开路(OD)即高阻状态,适用于输入\输出,其可独立输入\输出低电平和高阻状态,若需要产生高电平,则需要使用外部上拉电阻。
4.总线空闲时,SCL和SDA被上拉电阻拉高,保持高电平

IIC协议层

IIC在传输过程中有三种信号,分别是:开始信号结束信号应答信号

开始信号:SCL为电平时,SDA由高电平向低电平跳变,开始传输数据。
结束信号:SCL为电平时,SDA由低电平向高电平跳变,结束传输数据。
应答信号:接收数据的设备在收到8bit数据后,向发送数据的设备发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控设备发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断,若未收到应答信号,则判断受控设备故障。

起始信号是必需的,结束信号和应答信号可以不用。

IIC总线时序图

在这里插入图片描述

以下是IIC的通信协议流程:

初始状态

SCL和SDA都接上拉电阻保持空闲状态的稳定性所以空闲状态下均为高电平

void IIC_Init()
{IIC_SDA(1);IIC_SCL(1);iic_delay();
}

开始信号

SCL保存高电平,SDA由高电平变为低电平后,延时(大于4.7us),SCL变为低电平。

起始信号图

在这里插入图片描述

void IIC_Start(void)
{IIC_SDA(0);     // 当SCL为高时,SDA从高变成低, 表示起始信号 iic_delay();IIC_SCL(0);     iic_delay();
}

在起始信号发出后,总线处于忙状态,由本次数据传输的主从设备独占,其他器件无法访问总线。

停止信号

SCL为高电平,SDA由低电平到高电平

停止信号图
在这里插入图片描述

void iic_stop(void)
{IIC_SDA(0);     // 当SCL为高时, SDA从低变成高, 表示停止信号 iic_delay();IIC_SCL(1);iic_delay();IIC_SDA(1);     // 发送I2C总线结束信号iic_delay();
}

在停止信号产生后,本次数据传输的主从设备释放总线,总线处于空闲状态。

数据有效性

IIC信号在数据传输过程中,当SCL为高电平时,SDA必须保持稳定状态,不允许有电平跳变,只有当SCL为低电平时,数据线才允许高低电平变化

SCL为高电平时,数据线SDA的任何电平变化都会被看做是总线的起始信号或者停止信号

在这里插入图片描述

应答信号

每当主机向从机发送完一个字节的数据后,主机总是需要等待从机给出一个应答信号,以确认从机是否接收到了数据。

主机SCL拉高(大于4us),读取从机SDA的电平,如果为低电平,则产生应答
·应答信号为低电平时,规定为有效应答为(ACK),表示接收器件已经成功接收到了这个字节。
·若应答信号为高电平,则是非应答位,表示失败接收。

/* 等待应答信号到来,返回值为1表示接收应答失败,返回值为0表示接收应答成功 */
uint8_t iic_wait_ack(void)
{uint8_t waittime = 0;uint8_t rack = 0;IIC_SDA(1);     // 主机释放SDA线 iic_delay();IIC_SCL(1);     // 从机可以返回ACK iic_delay();while (IIC_READ_SDA)    // 等待应答 {waittime++;if (waittime > 250){iic_stop();rack = 1;break;}}IIC_SCL(0);     // SCL=0, 结束ACK检查iic_delay();return rack;
}/* 产生ACK应答 */
void iic_ack(void)
{IIC_SDA(0);     // SDA = 0,表示应答 iic_delay();IIC_SCL(1);     // 产生一个时钟 iic_delay();IIC_SCL(0);iic_delay();IIC_SDA(1);     // 主机释放SDA线 iic_delay();
}/* 产生ACK应答 */
void iic_nack(void)
{IIC_SDA(1);     // SDA = 1,表示不应答 iic_delay();IIC_SCL(1);     // 产生一个时钟 iic_delay();IIC_SCL(0);iic_delay();
}

数据传输

IIC信号在数据传输过程中,当SCL为高电平时,SDA必须保持稳定状态,不允许有电平跳变,只有当SCL为低电平时,数据线才允许高低电平变化。

数据传输图
在这里插入图片描述

输出到SDA上的字节必须是8位,数据传输时先传最高位(MSB),每个被传输的字节后面必须跟着一位应答位,也就是说,一帧有9位。

当一个字节按数据位从高位到低位的顺序传输完,紧接着从设备拉低SDA线,回传给主设备一个应答位ACK,此时才认为一帧数据才被传输完成。
如果一段时间内未收到从机的应答信号,则自动认为从机已经正确接收到了数据。
每一帧数据共有9bit
如果是设备地址数据,则包含7bit设备地址+1bit读写位+1位应答位
如果是发送数据,则包含8bit数据+1bit应答位
在这里插入图片描述

多数从设备的地址位7位或者10位
8位设备地址=7位从机地址+读/写地址。
地址帧中的第8位为读/写位
·0表示写数据
·1表示读数据

在这里插入图片描述

向7位地址设备写数据
在这里插入图片描述

向7位地址设备读数据
在这里插入图片描述

向10位地址设备写数据
在这里插入图片描述

向10位地址设备读数据
在这里插入图片描述

/* IIC发送一个字节 data: 要发送的数据 */
void iic_send_byte(uint8_t data)
{uint8_t t;for (t = 0; t < 8; t++){IIC_SDA((data & 0x80) >> 7); // 高位先发送 iic_delay();IIC_SCL(1);iic_delay();IIC_SCL(0);data <<= 1; // 左移1位,用于下一次发送 }IIC_SDA(1);   //发送完成, 主机释放SDA线 
}
/* IC读取一个字节 ack:  ack=1时,发送ack; ack=0时,发送nack 返回值:接收到的数据 */uint8_t iic_read_byte(uint8_t ack)
{uint8_t i, receive = 0;for (i = 0; i < 8; i++ )    // 接收1个字节数据{receive <<= 1;  // 高位先输出,所以先收到的数据位要左移 IIC_SCL(1);iic_delay();if (IIC_READ_SDA){receive++;}IIC_SCL(0);iic_delay();}if (!ack){iic_nack();     // 发送nACK }else{iic_ack();      // 发送ACK }return receive;
}
   receive++;}IIC_SCL(0);iic_delay();
}if (!ack)
{iic_nack();     // 发送nACK 
}
else
{iic_ack();      // 发送ACK 
}return receive;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/3374.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于anaconda的python3.6安装opencv4.1.15

opencv-python一些新版本由于部分函数涉及专利问题&#xff0c;如sift和surf&#xff0c;有些功能不能很好地被使用&#xff0c;所以最好使用opencv-python 3.4.1.15版本的。 下载地址分别为&#xff1a; 1、https://pypi.tuna.tsinghua.edu.cn/simple/opencv-python/ 查找…

【自制操作系统】0x01MBR

环境 ubuntu 20.04 gcc 9.4.0&#xff08;加载硬盘程序之前都是&#xff0c;最后可能会切换到 gcc 4.4&#xff09; bochs 2.7 bochs 配置 bochs 安装之前文章记录过&#xff0c;现在记录一下本次使用的bochs配置 bochsrc #第一步&#xff0c;首先设置 Bochs 在运行过程中…

SpringBoot接入星火认知大模型

文章目录 准备工作整体思路接入大模型服务端和大模型连接客户端和服务端的连接测试 准备工作 到讯飞星火大模型上根据官方的提示申请tokens 申请成功后可以获得对应的secret&#xff0c;key还有之前创建的应用的appId&#xff0c;这些就是我们要用到的信息 搭建项目 整体思…

ssm056基于Java语言校园快递代取系统的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;校园快递代取系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园快递代取系统…

简单语音信号识别的MATLAB仿真

简单语音信号识别的MATLAB仿真 摘要&#xff1a; 隐马尔可夫模型&#xff08;HMM&#xff09;作为描述语音信号的一种统计模型&#xff0c;在现代语音处理中获得了广泛应用。本文概述了基于HMM的语音识别技术&#xff0c;阐述了预处理&#xff0c;特征提取以及训练&#xff0c…

童年玩具:两款线绳陀螺

1,2图是过去用来安装明线电线的瓷夹。现在应该找不到了。过去安装电线后&#xff0c;家里留下了一些&#xff0c;拿来做线陀螺非常好。 因为它非常重&#xff0c;旋转起来很有力&#xff0c;那声音呼呼响。 3,4图是现在都能看到的一个圆木片&#xff0c;两个孔&#xff0c;穿绳…

AntFlow一款开源免费且自主可控的仿钉钉工作流引擎

在现代企业管理中&#xff0c;流程审批的高效性直接影响到工作的流畅度与生产力。最近&#xff0c;我发现了一个非常有趣的项目——AntFlow。这个项目不仅提供了一个灵活且可定制的工作流平台&#xff0c;还能让用户以可视化的方式创建和管理审批流程。 如果你寻找一个快速集成…

光纤资源APP开发及二次开发说明

光纤资源APP主要由以下几部分组成&#xff1a; 登录界面选择项目界面地图创建节点界面填写详细信息界面成端及端口表界面接续及接续表界面 其中1、2、4界面不需要涉及到ht&#xff0c;故用原生界面即可实现&#xff0c;但是3、5、6涉及到ht&#xff0c;而ht在app中是不兼容的…

鉴源实验室·如何通过雷达攻击自动驾驶汽车-针对点云识别模型的对抗性攻击的科普

01 引 言 随着自动驾驶技术的迅速发展&#xff0c;雷达和激光雷达等传感器在自动驾驶汽车中的作用愈发重要。它们能够生成3D点云数据&#xff0c;帮助车辆实时感知周围环境并做出安全决策。然而&#xff0c;尽管这些传感器对驾驶环境的检测非常精确&#xff0c;它们也面临一种…

Stable Diffusion(2024)Ai绘画AIGC最新安装包资源下载+自学教程

以下内容为整理的Stable Diffusion保姆级教学内容&#xff0c;请购买的资料的同学务必认真学习&#xff01;按以下步骤操作快速掌握Stable Diffusion这个工具&#xff01; Stable Diffusion&#xff08;简称SD&#xff09;是一款地表最强AI绘图工具(AIGC)之一&#xff0c;Stab…

基于单片机的宠物自动喂食系统的设计

本设计以STM32单片机为核心控制器&#xff0c;搭载了OLED显示屏作为显示交互模块&#xff0c;HX711称重模块获取食物重量&#xff0c;ESP8266与手机APP通信从而远程控制&#xff0c;PWM输出控制舵机模拟投喂食物开关打开&#xff0c;驱动继电器控制水泵打开加水&#xff0c;HC-…

vue+websocket实现即时聊天平台

目录 1 什么是websocket 2 实现步骤 2.1 导入依赖 2.2 编写代码 1 什么是websocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它主要用于在客户端和服务器之间建立持久的连接&#xff0c;允许实时数据交换。WebSocket 的设计目的是为了提高 Web 应用程序的…

Spring Boot框架:大学城水电管理自动化

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

关于三色标记算法的理解

三色标记算法是一种垃圾标记的算法&#xff0c;用于cms和g1。 它将对象分为3种颜色&#xff1a; 1.白色对象&#xff1a;未被标记的对象 2.灰色对象&#xff1a;自身被标记&#xff0c;引用的其它对象还没被标记 3.黑色对象&#xff1a;自身以及所引用的对象都被标记完 标记过…

Python Matplotlib:基本图表绘制指南

Python Matplotlib&#xff1a;基本图表绘制指南 Matplotlib 是 Python 中一个非常流行的绘图库&#xff0c;它以简单易用和功能丰富而闻名&#xff0c;适合各种场景的数据可视化需求。在数据分析和数据科学领域&#xff0c;Matplotlib 是我们展示数据的有力工具。本文将详细讲…

深入探讨SEO分析技巧助力网站流量提升

内容概要 在当前的数字化时代&#xff0c;SEO分析的重要性不言而喻。它是提升网站流量的关键工具&#xff0c;帮助站长有效地优化网站内容和结构。通过系统的SEO分析&#xff0c;站长可以掌握用户搜索行为和需求&#xff0c;从而制定出更具针对性的内容策略。例如&#xff0c;…

配置QINQ

1. 配置公司A和公司B的私有网络&#xff0c;创建对应的VLAN&#xff0c;并且接口的链路类型 S3的配置: 系统视图进入&#xff1a; <Huawei>system-view 设置设备名称为s3&#xff1a; [huawei]sysname s3 创建VLAN 10和20&#xff1a; [s3]vlan batch 10 20 配置Gigabit…

react 中配置@寻找文件

安装插件craco npm i -D craco/craco 创建 craco.config.js文件放在根目录和package.json同级 const path require(path)module.exports {webpack: {alias: {"": path.resolve(__dirname, "src")}} }创建 jsconfig.config.js文件放在根目录和package.js…

基于Qt的独立线程创建与多线程执行实验Demo

一、多线程与线程池的应用目的[1][4] &#xff08;一&#xff09;多线程 一个进程内多个线程并发执行的情况就叫多线程&#xff0c;每一个线程是一个独立的执行流。多线程是一种编程模型&#xff0c;它与处理器无关&#xff0c;与设计机制有关。 需要多线程的原因包括&#xf…

电能质量治理产品在分布式光伏电站的应用

1.概述 随着全球对可再生能源需求的不断增长&#xff0c;分布式光伏电站的建设与扩张正迅速发展。然而&#xff0c;在其运行过程中&#xff0c;分布式光伏电站遭遇了一系列挑战&#xff0c;包括企业关口计量点功率因数降低和谐波污染等问题。这些问题不仅影响了光伏电站的运行…