51单片机模拟I2C协议

article/2025/8/16 21:42:20

什么是I2C

首先需要知道什么是I2C协议。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息(摘自百度百科)。I2C主要有两条线,一条SDA数据线,一条SCL时钟线。由于I2C支持主机与多从机之间的通信,所以在传输数据之前先进行寻址操作,才能与对应的从机建立通信。多从机的存在可能出现多个从机同时需要占用总线的情况,这时候就要通过总线仲裁来选择与某个从机进行通信了。每次通信发送或接收的数据为8位一个字节。

I2C时序图详解及通信协议程序

空闲时的SCL和SDA两条线都为高电平,每次通信结束后都需要释放总线,将SCL和SDA拉高。

起始信号和结束信号

起始信号和结束信号时序图如下:
在这里插入图片描述可以看到起始信号是这样产生的:先将SDA数据总线拉低,再将SCL时钟线拉低;而结束信号与其实信号相反,先把SCL时钟线拉高后再将SDA数据总线拉高。
程序代码如下:

//起始信号
void I2C_start()
{I2C_SCL_1;I2C_SDA_1;I2C_Delay();I2C_SDA_0;I2C_Delay();I2C_SCL_0;
}
//结束信号
void I2C_stop()
{I2C_SDA_0;I2C_SCL_1;I2C_Delay();I2C_SDA_1;
}

数据传输

在这里插入图片描述I2C要求在SCL高电平期间数据线保持稳定,在低电平期间SDA可以产生电平跳变和数据变化。
发送数据代码如下:

void I2C_sendbyte(uint8_t send_data)
{uint8_t i;for(i=0;i<8;i++){if(send_data&(0X80>>i)) I2C_SDA_1; else I2C_SDA_0;I2C_SCL_1; I2C_Delay(); I2C_SCL_0;}
}

接收数据如下:

uint8_t I2C_readbyte(uint8_t ack)
{uint8_t read_data=0;uint8_t i;uint8_t readbit;for(i=0;i<8;i++){if(I2C_SDA_0) readbit=0; else readbit=1;I2C_Delay();I2C_SCL_1;I2C_Delay();I2C_SCL_0;read_data= (read_data|readbit)<<1;}I2C_Delay();//应答信号if(ack==0)I2C_NACK();elseI2C_ACK();return Data;
}

应答信号

有应答信号(ACK)和非应答信号(NACK)两种,代码如下:

void I2C_ACK(void)		//	应答信号
{I2C_SDA_0;I2C_Delay();I2C_SCL_1;I2C_Delay();I2C_SCL_0;I2C_SDA_1;
}void I2C_NACK(void)		//非应答信号
{I2C_SDA_1;I2C_Delay();I2C_SCL_1;I2C_Delay();I2C_SCL_0;I2C_Delay();I2C_SDA_0;
}

还有一个等待从机发送应答信号的函数:

uint8_t waitACK()
{uint8_t receive;I2C_SDA_1;I2C_Delay();I2C_SCL_1;I2C_Delay();if(I2C_SDA_1)receive=1;else   receive=0;I2C_SCL_0;I2C_Delay();return receive;   
}

通信协议

在对某个芯片的寄存器进行读写操作的时候,需要严格按照时序图的操作来执行:
在这里插入图片描述
I2C的通讯协议大概分为几个步骤:
1.主机发出起始信号
2.主机发出寻址信号并确认本次操作是读还是写(由寻址信号的最后一位是0还是1决定,0为写,1为读)
3.从机发送应答信号,主机接收
4.主机发送数据信号,从机接收
5.从机发送应答信号,主机接收
6.主机发送停止信号,从机接收,然后结束一次通信。

写入寄存器时的代码如下:

void I2C_write_reg(uint8_t slaveaddr,uint8_t regaddr,uint8_t*writebuffer,uint8_t Wlen)
{uint8_t writeflag=0;uint8_t i;uint8_t error;I2C_start();						//起始信号I2C_sendbyte(slaveaddr|0x00);		//寻址信号:从机地址+写操作if(waitACK)							//等待从机应答信号error|=0x01;I2C_sendbyte(regaddr);				//寄存器地址if(waitACK)error|=0x02;for(i=0;i<Wlen;i++)					//写入数据{I2C_sendbyte(writebuffer[i]);if(waitACK)error|=0x04;}I2C_stop();    						//停止信号
}

读取从机数据的代码如下。需要注意每读取完一个字节(8位)数据后,都需要发送一次应答信号,当最后一个字节数据读取完毕之后发送非应答信号和结束信号以结束本次通信:

void I2C_read_reg(uint8_t slaveaddr,uint8_t regaddr,uint8_t*readbuffer,uint8_t Rlen)
{uint8_t error=0;uint8_t i=0;I2C_start();I2C_sendbyte(slaveaddr|0x00);if(waitACK)error|=0x01;I2C_sendbyte(regaddr);if(waitACK)error|=0x02;I2C_sendbyte(slaveaddr|0x01);if(waitACK)error|=0x04;for(i=0;i<=(Rlen-1);i++){*readbuffer=I2C_readbyte(1);	//每读取完一个字节,都需要给从机一个应答信号readbuffer++;}*readbuffer=I2C_readbyte(0);		//最后一个字节读取完发送非应答信号I2C_stop();}

http://chatgpt.dhexx.cn/article/77O7PvBP.shtml

相关文章

I2C协议原理讲解

一、物理层&#xff1a; 1、I2C通讯设备之间的常用连接方式&#xff1a; 2、特点&#xff1a; (1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中&#xff0c; 可连接多个I2C通讯设备&#xff0c;支持多个通讯主机及多个通讯从机。 (2) 一个…

一文搞懂I2C协议-硬件基础

I2C是什么 I2C总线是由飞利浦在80年代初设计的&#xff0c;以允许位于同一电路板上的组件之间能够轻松通信。其大大简化了电路的设计&#xff0c;早期的电视机中很多地方用到了I2C这种通信方式。飞利浦半导体于2006年迁移到了NXP。I2C名称翻译为“ Inter IC”。有时&#xff0…

I2C协议+实现源码

文章目录 摘要I2C通信协议简介补充空闲状态start和stop信号应答信号数据有效性规定数据传输延时 I2C协议的实现源码硬件说明头文件sys.h 主函数初始化I2C产生开始和停止信号等待应答信号产生或不产生应答I2C写操作I2C读操作 对24C02操作24C02的时序图头文件初始化IIC接口写数据…

学习笔记8-I2C协议

目录 一、关于I2C二、硬件结构三、I2C协议3.1、I2C的三种状态3.2、数据有效性3.3、应答信号3.4、总线时序3.5、读写时序3.5.1、读3.5.2、写 3.6、死锁3.7、仲裁 四、软件I2C&硬件I2C五、AT24C02六、代码编写6.1、I2C初始化6.2、开始信号6.3、ACK/NACK信号6.4、发送1byte数据…

I2C 协议 代码详解

I2C 协议 最后代码已上传&#xff01;&#xff01;&#xff01;&#xff01;   代码文章链接    github 代码链接在该文章最后 I2C 简要介绍 I2C 总线&#xff08;I2C bus&#xff0c;Inter-IC bus&#xff09;是一个双向的两线连续总线&#xff0c;提供集成电路&#xf…

通俗易懂的I2C协议

关注v-x-公-众-号&#xff1a;【嵌入式基地】 后-台-回-复&#xff1a;【电赛】 即可获资料 回复【编程】即可获取 包括有&#xff1a;C、C、C#、JAVA、Python、JavaScript、PHP、数据库、微信小程序、人工智能、嵌入式、Linux、Unix、QT、物联网、算法导论、大数据等资料 I2C总…

I2C 协议图文解析

转自&#xff1a;https://blog.csdn.net/EastonWoo/article/details/52712826 i2c协议注意几点就很好的使用它&#xff1a; 1&#xff09;由一个主设备&#xff0c;一个或多个从设备组成&#xff0c;所有的信号发起都是由主设备发起&#xff0c;从设备根据这些信号做一些应答。…

I2C协议---I2C时序图解析

一、I2C协议简介 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由 Phiilps 公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要 USART、CAN 等通讯协议的外部收发设备&#xff0c;现在被广泛地 使用在系统内多个集成…

I2C协议——物理层和协议层

I2C协议简介 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个集成电路(IC)…

I2C协议详解

I2C协议详解 一、I2C协议简介 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。主器件用于启动总线传送数据&#xff0c;并产生时钟以开放传送的器件&#xff0c;此时任何被寻址的器件均被认为是从器件…

I2C协议概述

目录 IntroductionFeaturesStandard-mode, Fast-mode and Fast-mode Plus I2C-bus protocols1. SDA and SCL signals2. SDA and SCL logic levels3. Data validity4. START and STOP conditions5. Byte format6. Acknowledge (ACK) and Not Acknowledge (NACK)7. Clock synchro…

I2C协议(详细)

I2C通讯协议(Inter&#xff0d;Integrated Circuit)引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个集成电路(IC)间的通讯。实现I2C需要两根信号线完成信息交换&#xff…

【总线】I2C 通信协议

目录 I2C 总线协议概述 参数总结 I2C 的工作原理 寻址 读/写位 数据帧 I2C数据传输的步骤 具有多个从机的单个主机 具有多个从机的多个主机 I2C的优缺点 优点 缺点 文章参考 I2C 总线协议概述 I2C 总线广泛应用在 OLED 显示器、气压传感器或陀螺仪/加速度计模块的…

【数字IC】深入浅出理解I2C协议

深入浅出理解I2C协议 一、什么是I2C协议二、I2C,SPI,UART协议的区别三、I2C的信号线四、I2C的连接方式4.1 单主设备&#xff0c;单从设备4.2 单主设备&#xff0c;多从设备4.3 多主设备&#xff0c;多从设备 五、I2C的数据传输格式5.1 空闲位5.2 起始位5.3 地址位与读写控制5.4…

I2C协议靠这16张图彻底搞懂(超详细)

文章目录 背景硬件层数据传输协议实际上如何工作&#xff1f;单个主设备连接多个从机多个主设备连接多个从机如何编程&#xff1f;总结 背景 IC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;中文应该叫集成电路总线&#xff0c;它是一种串行通信总线&#xf…

奇安信SSL VPN详细配置步骤

1、网络接口配置&#xff08;GE2接口配置&#xff0c;GE1调试接口&#xff09; 2、静态路由配置&#xff08;网络配置-网络路由-IPv4路由&#xff09; 3、NC的IP地址池添加&#xff08;SSL-VPN-应用设置-IP地址池-虚拟地址池添加&#xff09; 4、用户和组的添加 5、NC设置 6、…

防火墙之IPSec VPN实验

防火墙IPSec VPN实验 原理概述: 指采用IPSec协议来实现远程接入的一种VPN技术&#xff0c;IPSec全称为Internet Protocol Security&#xff0c;是由Internet Engineering Task Force (IETF) 定义的安全标准框架&#xff0c;在公网上为两个私有网络提供安全通信通道,通过加密通道…

如何使用Xshell7连接学校虚拟机(保姆级)

如何使用Xshell7连接学校虚拟机&#xff08;保姆级&#xff09; 文章目录 如何使用Xshell7连接学校虚拟机&#xff08;保姆级&#xff09;一、前言二、连接学校VPN三、使用学校平台建立虚拟环境四、配置OpenVPN客户端五、使用Xshell连接虚拟机1、新建会话2、设置新建会话属性2、…

密码应用体系建设(政务方向)

一、背景 密码是保障网络与信息安全的核心技术和基础支撑&#xff0c;是解决网络与信息安全问题最有效、最可靠、最经济的手段。《密码法》的颁布实施&#xff0c;从法律层面为开展商用密码应用提供了根本遵循&#xff0c;《国家政务信息化项目建设管理办法》的颁布实施&#…

OSI七层网络协议

在前一篇博客运维往事 一次负载均衡坏点检测事故中我提到了在生产环境中在第四层和第七层做healthCheck&#xff0c;这个第四层和第七层到底是什么意思呢&#xff1f;除了第四层第七层之外&#xff0c;其他的几层到底是什么&#xff1f;这几层到底做了啥&#xff1f;   OSI把…