IIC通信

通信协议简述

  • 三条线:串行数据线(SDA)、串行时钟线(SCL),地线;

       

  • 半双工 一问一答 ,主从模式,多设备模式
  • 总线协议:支持多个设备进行通信(多主多从)

  • 异步模式(串口):通信双方约定好波特率,然后各自按照自己时钟进行通信。

        好处:便捷;

        缺点:双方必须时钟精确,否则对不齐了。

  • 同步通信(IIC):由主机的时钟总线确定通信速率
  • 选择IIC原因:考虑小型传感器没有晶振提供精确的时钟基准

通信协议过程

在IIC总线上,每个从机都有其唯一的默认设备地址【这个设备地址由谁规定的呢?】。发送数据时采用广播形式,数据最开始带着从机地址,其他设备会选择性失聪。

1、通信开始前:

两总线电平处于拉高状态:

主机在时钟线上产生恒定的时钟脉冲

2、主机发起通信:

在时钟线某个高电平时数据线下拉;随机主机会在时钟线上产生一个恒定的时钟脉冲信号。

3、数据发送过程:

接下来每一个时钟周期内,SDL上发送电平基本小规则

主机在低电平时钟时,设置数据;从机在高时钟时,读取数据。

字节数据发送主要规则:

       每当发送器传输完一个字节(8 bit)的数据之后,发送端会等待一定的时间,等接收方的应答信号。接收端通过拉低SDA数据线,给发送端发送一个应答信号,以提醒发送端我这边已经接受完成,数据可以继续传输,接下来,发送端就可以继续发送数据了。如此反复,直到发送完所有数据。

即每一帧的数据传送与应答数据 共有9bit

总线寻址:

值得注意的是,IIC通信中,主机发送的第一个字节往往是某个从机在总线上的地址

数据读写方向:

参考来源:

IIC详解,包括原理、过程,最后一步步教你实现IIC_iic协议-CSDN博客

4、通信终止信号:

然后主机会在时钟线处于高电平时,将数据线拉高,通信终止信号。整段通信完成。

起始信号和终止信号都是由主机发送的。在起始信号产生之后,总线就处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。

注意:每次数据传送总是由主机产生的终止信号来结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

模拟IIC协议代码实现

代码实现-学习视频推荐

iic读取函数书写_哔哩哔哩_bilibiliiic读取函数书写, 视频播放量 2012、弹幕量 4、点赞数 57、投硬币枚数 17、收藏人数 62、转发人数 0, 视频作者 小远课堂, 作者简介 作者已关闭了评论提醒,相关视频:I2C时序图解讲解[上],IIC的代码不会写?,秒懂I2C时序图,IIC时序图讲解【中】,I2C入门第一节-I2C的基本工作原理,I2C写字节的基本流程,lcd1602看时序图写代码,I2C时序图讲解【下】,学完C语言,做不出小程序,做不出图形化界面,只有黑乎乎的窗口,自学编程的几点建议,7分钟看懂时序图,不懂你骂我,花了四个多小时画了人生第一块PCBicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Vj411Z7qN/?spm_id_from=333.788&vd_source=f443c8140671d1c361aa817ad1193312代码更详细实现-博客推荐

【通信协议】IIC通信协议详解-CSDN博客IIC的基本介绍IIC总线的发展: 芯片间总线(Inter Interface Circuit,IIC),是应用广泛的芯片间串行扩展总线。目前世界上采用的IIC总线一共有两个规范,分别由荷兰飞利浦公司和日本索尼公司提出的,现在基本采用荷兰飞利浦的IIC总线的技术规范。IIC总线的优点:1、IIC总线优点中最主要的优点是其简单性(IIC只有两条信号线)和有效性(根据SCL线上的时钟线来判断)。带有IIC总线的接口的单片机都可直接与具有IIC总线接口的各种扩展器件..._iic通信协议https://blog.csdn.net/qq_53918631/article/details/124810934?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-124810934-blog-107078170.235%5Ev38%5Epc_relevant_anti_vip_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-124810934-blog-107078170.235%5Ev38%5Epc_relevant_anti_vip_base&utm_relevant_index=2

头文件myiic.h#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"  //IO方向设置
//CRH,CRL 端口输入输出模式寄存器。CRH为8-15引脚,CRL为0-7引脚
#define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}//PC11引脚为上拉/下拉输入
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}//PC11为推挽输出//IO操作函数    
#define IIC_SCL    PCout(12) //SCL
#define IIC_SDA    PCout(11) //SDA    
#define READ_SDA   PCin(11)  //输入SDA//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口                
void IIC_Start(void);                //发送IIC开始信号
void IIC_Stop(void);                  //发送IIC停止信号
void IIC_Send_Byte(u8 txd);            //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void);                 //IIC等待ACK信号
void IIC_Ack(void);                    //IIC发送ACK信号
void IIC_NAck(void);                //IIC不发送ACK信号//一下两个函数实际并未被定义
void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);      
#endif.c文件#include "myiic.h"
#include "delay.h"//初始化IIC
//硬件I2C必须开漏输出
//模拟I2C则为推挽输出(方便输出高低电平?)
void IIC_Init(void)
{                         GPIO_InitTypeDef GPIO_InitStructure;//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOC, ENABLE );    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);IIC_SCL=1;//PCout(12)IIC_SDA=1;//PCout(11)}
//产生IIC起始信号
//SCL为高时,SDA拉低,准备开始传数据。(记得再拉低SCL,这个是为什么?)
//SCL为高时,SDA拉高,结束传输数据。
//传输数据时,SCL为高时数据有效
void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA=1;     //SDA = 1,SCL = 1 空闲状态       IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to lowdelay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}      
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1;IIC_SDA=1;//发送I2C总线结束信号delay_us(4);                                   
}
//等待应答信号到来
//返回值:1,接收应答失败
//        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)//READ_SDA为0时表示接收到应答{ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0        return 0;  
}
//产生ACK应答
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应答            
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,无应答              
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT();         IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA=(txd&0x80)>>7;//先发高位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   
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();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}
————————————————
版权声明:本文为CSDN博主「碑 一」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dedell/article/details/96628955

模拟IIC应用实战:

stm32无人机:利用上面基础模拟IIC代码把数据从mpu6050传感器数据读取出来(未完成)

*stm32 HAL库 实现和使用IIC总线*#include "stm32xxxxx.h"
#include "stm32xxxxx_hal.h"I2C_HandleTypeDef hi2c1;void SystemClock_Config()
{// 配置系统时钟// ...
}void GPIO_Configuration()
{// 配置GPIO引脚// ...
}void I2C_Configuration()
{// 配置I2C外设hi2c1.Instance = I2C1;hi2c1.Init.Timing = 0x00303D5B; // 根据具体系统时钟和I2C时钟频率调整这个值hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 = 0;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;// 初始化I2C外设HAL_I2C_Init(&hi2c1);
}int main(void)
{uint8_t sendData[] = {0x01, 0x02, 0x03};uint8_t receiveData[3];// 初始化系统时钟SystemClock_Config();// 配置GPIO引脚GPIO_Configuration();// 配置I2C外设I2C_Configuration();// 发送数据HAL_I2C_Master_Transmit(&hi2c1, DeviceAddress, sendData, sizeof(sendData), HAL_MAX_DELAY);// 延时等待数据发送完成HAL_Delay(1); // 根据实际情况调整延时时间// 接收数据HAL_I2C_Master_Receive(&hi2c1, DeviceAddress, receiveData, sizeof(receiveData), HAL_MAX_DELAY);while (1){// 主程序逻辑}
}

参考:

【物联网】I2C(IIC)通信协议详解与应用_iic通信_嵌入式小白—小黑的博客-CSDN博客

【通信协议】IIC通信协议详解-CSDN博客IIC的基本介绍IIC总线的发展: 芯片间总线(Inter Interface Circuit,IIC),是应用广泛的芯片间串行扩展总线。目前世界上采用的IIC总线一共有两个规范,分别由荷兰飞利浦公司和日本索尼公司提出的,现在基本采用荷兰飞利浦的IIC总线的技术规范。IIC总线的优点:1、IIC总线优点中最主要的优点是其简单性(IIC只有两条信号线)和有效性(根据SCL线上的时钟线来判断)。带有IIC总线的接口的单片机都可直接与具有IIC总线接口的各种扩展器件..._iic通信协议https://blog.csdn.net/qq_53918631/article/details/124810934?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-124810934-blog-107078170.235%5Ev38%5Epc_relevant_anti_vip_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-124810934-blog-107078170.235%5Ev38%5Epc_relevant_anti_vip_base&utm_relevant_index=2

案例:利用IIC从单片机读取温湿度显示到电脑

数据显示到电脑上:

前几节用到的串口以及串口调试助手 - 从单片机发送数据到pc上,显示出来

IIC写驱动

项目架构

直接看“传感器数据手册”

重点关注:设备从机地址 0X71

【STM32入门教程-2023】第12集 IIC通信与温湿度传感器AHT20(DHT20)_哔哩哔哩_bilibili本期视频我们一起来了解一下如何使用STM32的IIC通信, 获取你房间的温度与湿度~------------------------------------------------------------------------------学习套件获取: https://b23.tv/sblUuvI 或者直接某宝搜索"keysking stm32", 认准店铺"波特律, 视频播放量 24904、弹幕量 140、点赞数 1026、投硬币枚数 605、收藏人数 1354、转发人数 109, 视频作者 keysking, 作者简介 立志做最好最简洁最易懂的教程!!!,相关视频:【STM32入门教程-2023】第14集 如何在OLED屏幕上挥毫,STM32物联网入门30步--STM32CubeMX+HAL库 CubeIde蓝牙 WIFI ESP8266 嵌入式物联网开发教学 基于F103 30集全,STM32入门100步→100集系统化STM32入门方案=STM32F103+KEIL标准库+C语言基础+代码逐行分析+独家教学PPT+人机界面开发全过程,【STM32入门教程-2023】第13集 IIC的中断与DMA以及状态机编程,【洋桃电子】STM32入门F4:F407+CubeMX+HAL库(CubeIDE)+蓝牙 WIFI ESP8266+原创例程+独家PPT图表(更新中),【STM32入门教程-2023】应该是全B站最好的STM32教程了,5分钟看懂!串口RS232 RS485最本质的区别!,电路里为什么要摆这两个电容?,【洋桃电子】洋桃补习班(为0基础的初学者补足基础知识)STM32入门100步系列视频,10行代码,就能让你真正理解DMA!你用的可能很少,但是在单片机中非常重要!icon-default.png?t=N7T8https://www.bilibili.com/video/BV1QN411D7ak/?spm_id_from=333.788&vd_source=f443c8140671d1c361aa817ad1193312

从面试角度看IIC的提问点:

1、为什么选择IIC通信,和SPI UART 的区别,哪个更快?

2、IIC最大速率

3、IIC协议,帧格式,收发数据的时序流程

4、介绍一下IIC

5、调试IIC过程中遇到的问题

6、iic寻址,主机从机如何对接的

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

起立科技(起鸿)在第25届高交会上展示透明OLED技术创新

第二十五届中国国际高新技术成果交易会 日期&#xff1a;2023年11月15日 地点&#xff1a;福田会展中心7号馆 深圳&#xff0c;2023年11月15日 — 起鸿科技&#xff0c;作为透明OLED领域的引领者&#xff0c;于今日参展了第二十五届中国国际高新技术成果交易会。这一展会将汇…

7 Redis的PipeLine

PipeLine的作用是批量执行命令 redis的性能瓶颈基本上是网络 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.…

数据结构~~~~ [队列] ~~~~

文章目录 队列队列的概念与结构队列的接口实现***队列的初始化******队列的销毁******队列的插入与创建节点******队列的删除******队列的队头数据******队列的队尾数据******队列的判空*** 队列 队列的概念与结构 队列的插入数据在队尾出数据在队头&#xff08;尾入头出&…

女人感染阴虱什么感觉?皮肤性病科主任谭巍全面解读

阴虱是一种常见的性传播疾病&#xff0c;通常由寄生虫引起&#xff0c;这些虱子寄生在阴部和肛门周围的毛发中。当女性感染阴虱后&#xff0c;可能会经历一系列的身体感觉和症状。 首先&#xff0c;感染阴虱的女性可能会感到阴部和肛门周围的皮肤瘙痒和不适。这种瘙痒可能会持…

MatrixOne完成与麒麟信安、欧拉的兼容互认

近日&#xff0c;超融合异构云原生数据库MatrixOne企业版软件V1.0完成了与欧拉开源操作系统&#xff08;openEuler简称“欧拉”&#xff09;、麒麟信安操作系统系列产品和虚拟化平台的相互兼容认证&#xff0c;通过了欧拉兼容性测评&#xff0c;获得了《openEuler技术测评证书》…

Python机器学习、深度学习提升气象、海洋、水文领域实践应用

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库&#xff0c;还有丰富的第三方库&#xff0c;Python在数据处理、科学计算、数学建模、数据挖…

深度学习之自监督模型汇总

1.BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding paper:https://arxiv.org/pdf/1810.04805v2.pdf code:GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT Abstract&#xff1a;我们引入了一种名为 BE…

如何在虚拟机的Ubuntu22.04中设置静态IP地址

为了让Linux系统的IP地址在重新启动电脑之后IP地址不进行变更&#xff0c;所以将其IP地址设置为静态IP地址。 查看虚拟机中虚拟网络编辑器获取当前的子网IP端 修改文件/etc/netplan/00-installer-config.yaml文件&#xff0c;打开你会看到以下内容 # This is the network conf…

ACREL DC energy meter Application in Indonesia

安科瑞 华楠 Abstract: This article introduces the application of Acrel DC meters in base station in Indonesia.The device is measuring current,voltage and energy together with hall current sensor. 1.Project Overview This company is located in Indonesia a…

基于模拟退火算法优化概率神经网络PNN的分类预测 - 附代码

基于模拟退火算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于模拟退火算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于模拟退火优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

城市交通领域的新趋势:地铁列车可视化

随着城市化进程的不断加速&#xff0c;地铁作为一种便捷、快速的城市交通方式&#xff0c;受到了越来越多人的青睐。地铁列车可视化&#xff0c;作为地铁运营管理中的一项重要工作&#xff0c;不仅可以提高列车运行效率和安全性&#xff0c;还可以为乘客提供更加舒适、便捷的乘…

小众市场:探索跨境电商中的利基领域

随着全球数字化和互联网的普及&#xff0c;跨境电子商务已经成为了一个蓬勃发展的产业。从亚马逊到阿里巴巴&#xff0c;大型电商平台已经占据了很大一部分市场份额。 然而&#xff0c;在这个竞争激烈的领域&#xff0c;寻找小众市场和利基领域可能是一种成功的策略。本文将探…

十六、RabbitMQ快速入门

目录 一、在centos上下载MQ镜像 二、安装运行容器 三、登录进入MQ 1、添加一个新的用户 2、新建虚拟机 3、 为用户分配权限 四、RabbitMQ的基本概念 RabbitMQ中的几个概念: 五、常见消息模型 六、简单的消息生产与消费 1、消费者类 2、生产者类 3、基本消息队列的消…

Adobe 2022,2023,2024永久安装包全家桶下载网盘下载和最全的安装教程!

收集整理&#xff1a;Adobe合集 最新:已更新到2024 资源包含&#xff1a;AE Adobe AE2022是一个非常强大的视频制作和后期制作软件&#xff0c;它可以让您制作出非常出色的电影特效、动画和其他非常优秀的视频作品。为了更好地使用这款软件&#xff0c;我们需要一些比较全面…

基于单片机的空气质量实时监测系统(论文+源码)

1. 系统设计 通过文献和市场调查&#xff0c;本设计的实现方案框架是以单片机为核心控制处理器搭建外围的功能模块如温度传感器模块、湿度传感器检测模块、二氧化碳传感器检测设备模块、无线通信模块和蜂鸣器声光报警提示模块来实现&#xff0c;辅以显示模块来展示。 该系统通…

GPU Microarch 学习笔记【3】Tensor Core

目录 1. 指令与架构 2. Load 3. 计算MMA 4. Set, Step 与thread group 5. OCTET 6. Tensor Core微架构 7. Final Nvidia自从Volta/Turing&#xff08;2018&#xff09;架构开始&#xff0c;在stream multi processor中加入了tensor core&#xff0c;用于加速矩阵计算。如…

Windows10下Maven3.9.5安装教程

文章目录 1.下载maven2.安装3.配置系统变量3.1.新建系统变量 MAVEN_HOME3.2.编辑系统变量Path 4.CMD命令测试是否安装成功5.配置maven本地仓库6.配置国内镜像仓库 1.下载maven 官网 https://maven.apache.org/download.cgi 点击下载。 2.安装 解压到指定目录 D:\installSoft…

零代码编程:用ChatGPT将SRT字幕文件批量转为Word文本文档

一个文件夹中有多个srt视频字幕文件&#xff0c;srt文件里面有很多时间轴&#xff1a; 现在想将其批量转为word文档&#xff0c;去掉里面与字符无关的时间轴&#xff0c;在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量将SRT字幕文件转为…

了解JVM的相关概述,发现很多全忘了(文末福利)

1、学之前存在的问题 1、你被JVM伤害过吗&#xff1f; 你是否也遇到过这些问题&#xff1f; 运行着的线上系统突然卡死&#xff0c;系统无法访问&#xff0c;甚至直接OOM&#xff01;想解决线上JVM GC问题&#xff0c;但却无从下手。新项目上线&#xff0c;对各种JVM参数设置一…

echarts 实现3D立体柱状图示例

该示例有如下几个特点&#xff1a; ①实现tooltip自定义样式&#xff08;echarts 实现tooltip提示框样式自定义-CSDN博客&#xff09; ②数据为0时&#xff0c;顶部四边形不展示 ③legend图标设置为自定义图片 【第②也是一个难点&#xff0c;我没有找到其他解决办法&#xff…