当前位置: 首页 > news >正文

【通信协议】IIC通信协议详解

IIC(Inter-Integrated Circuit)通信协议,又称为I2C(Inter-Integrated Circuit 2)协议,是一种广泛使用的串行通信协议。它由Philips Semiconductor(现NXP Semiconductors)开发,用于连接微控制器和其他设备,实现数据的串行传输。

I2C协议的基本原理

I2C协议使用两条线进行通信:数据线(SDA)和时钟线(SCL)。这两条线通过上拉电阻连接到电源,确保在空闲状态下保持高电平。I2C协议支持多主设备和多个从设备,通过每个设备的地址来区分通信目标。

I2C协议的关键特性

  1. 双向通信:I2C协议支持双向数据传输,即主设备可以发送数据给从设备,也可以从从设备接收数据。
  2. 多主模式:允许多个主设备连接到同一条总线上,通过仲裁机制来选择唯一的主设备进行通信。
  3. 多从模式:I2C总线可以连接多个从设备,每个从设备都有唯一的地址,主设备通过地址来选择要通信的从设备。
  4. 速率灵活:I2C总线的速率可以根据应用需求进行调整,常见的速率有100 kHz(标准模式)、400 kHz(快速模式)和3.4 MHz(高速模式)。
  5. 低成本:I2C总线只需要两根线进行通信,降低了硬件成本和复杂性。

I2C协议的应用场景

I2C协议被广泛应用于各种数字芯片间的通信,例如:

  • 传感器与微控制器之间的通信:如温度传感器、湿度传感器、加速度计等。
  • 存储器芯片:如EEPROM和RTC芯片,用于数据的读写和时钟管理。
  • 控制外设设备:如LED驱动器、LCD控制器、扩展IO芯片等。
  • 显示器控制器:如OLED显示屏、液晶显示模块等。
  • 工业自动化领域:如工业传感器、PLC等。

I2C协议的通信过程

I2C通信过程包括以下几个步骤:

  1. 起始信号:主设备发送一个起始信号,表示开始通信。
  2. 发送从设备地址:主设备发送从设备的地址和读/写位。
  3. 应答信号:从设备确认收到地址并发送应答信号。
  4. 数据传输:主设备和从设备之间进行数据的发送和接收。
  5. 停止信号:通信完成后,主设备发送停止信号,表示通信结束。

I2C协议的代码示例

以下是使用STM32通过软件模拟I2C协议来驱动AT24C02 EEPROM的示例代码:

#include "stm32f10x.h"#define I2C_SCL_PIN GPIO_Pin_6 // 定义SCL引脚
#define I2C_SDA_PIN GPIO_Pin_7 // 定义SDA引脚
#define I2C_SCL_PORT GPIOB // 定义SCL引脚所在的端口
#define I2C_SDA_PORT GPIOB // 定义SDA引脚所在的端口// I2C延时函数
void I2C_Delay(void) {// 延时函数,根据实际情况调整
}// I2C初始化函数
void I2C_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_SCL_PORT, &GPIO_InitStructure);// 设置I2C引脚输出高电平GPIO_SetBits(I2C_SCL_PORT, I2C_SCL_PIN | I2C_SDA_PIN);
}// I2C起始信号
void I2C_Start(void) {I2C_SDA_PORT->BSRR = I2C_SDA_PIN; // SDA高电平I2C_Delay();I2C_SCL_PORT->BSRR = I2C_SCL_PIN; // SCL高电平I2C_Delay();I2C_SDA_PORT->BRR = I2C_SDA_PIN; // SDA低电平,开始信号I2C_Delay();I2C_SCL_PORT->BRR = I2C_SCL_PIN; // SCL低电平
}// I2C停止信号
void I2C_Stop(void) {I2C_SDA_PORT->BRR = I2C_SDA_PIN; // SDA低电平I2C_Delay();I2C_SCL_PORT->BSRR = I2C_SCL_PIN; // SCL高电平I2C_Delay();I2C_SDA_PORT->BSRR = I2C_SDA_PIN; // SDA高电平,停止信号
}// I2C发送一个字节
void I2C_SendByte(uint8_t byte) {uint8_t i;for (i = 0; i < 8; i++) {if (byte & 0x80) {I2C_SDA_PORT->BSRR = I2C_SDA_PIN; // SDA高电平} else {I2C_SDA_PORT->BRR = I2C_SDA_PIN; // SDA低电平}byte <<= 1;I2C_SCL_PORT->BSRR = I2C_SCL_PIN; // SCL高电平I2C_Delay();I2C_SCL_PORT->BRR = I2C_SCL_PIN; // SCL低电平}I2C_SDA_PORT->BSRR = I2C_SDA_PIN; // SDA释放,准备接收应答I2C_Delay();I2C_SCL_PORT->BSRR = I2C_SCL_PIN; // SCL高电平I2C_Delay();I2C_SCL_PORT->BRR = I2C_SCL_PIN; // SCL低电平
}// I2C读取一个字节
uint8_t I2C_ReadByte() {uint8_t i, byte = 0;I2C_SDA_PORT->ODR &= ~I2C_SDA_PIN; // SDA输入模式for (i = 0; i < 8; i++) {byte <<= 1;I2C_SCL_PORT->BSRR = I2C_SCL_PIN; // SCL高电平I2C_Delay();if (I2C_SDA_PORT->IDR & I2C_SDA_PIN) {byte |= 0x01;}I2C_SCL_PORT->BRR = I2C_SCL_PIN; // SCL低电平I2C_Delay();}return byte;
}// 从AT24C02读取一个字节数据
uint8_t AT24C02_ReadByte(uint8_t addr) {uint8_t data;I2C_Start();I2C_SendByte(0xA0 << 1); // 发送写命令I2C_WaitAck();I2C_SendByte(addr); // 发送地址I2C_WaitAck();I2C_Start();I2C_SendByte(0xA1 << 1); // 发送读命令I2C_WaitAck();data = I2C_ReadByte();I2C_Stop();return data;
}int main(void) {I2C_Init();uint8_t data = AT24C02_ReadByte(0x00); // 从地址0x00读取数据// ... 其他操作while (1) {// ... 主循环}
}

以上代码展示了如何初始化I2C接口,发送起始和停止信号,以及如何发送和接收数据。在实际应用中,可能需要根据具体的硬件连接和设备地址进行适当的调整。通过理解和掌握I2C协议的原理和编程方法,可以实现微控制器与其他设备的高效通信。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

相关文章:

【通信协议】IIC通信协议详解

IIC&#xff08;Inter-Integrated Circuit&#xff09;通信协议&#xff0c;又称为I2C&#xff08;Inter-Integrated Circuit 2&#xff09;协议&#xff0c;是一种广泛使用的串行通信协议。它由Philips Semiconductor&#xff08;现NXP Semiconductors&#xff09;开发&#x…...

2024年中国科技核心期刊目录(社会科学卷)

2024年中国科技核心期刊目录 &#xff08;社会科学卷&#xff09; 序号 期刊代码 期刊名称 1 SC02 JOURNAL OF S…...

用Python集成免费IP归属地查询API

IP查询的优势是什么&#xff1f; IP查询是一种强大的工具&#xff0c;能够快速提供关于IP地址的信息&#xff0c;如地理位置、互联网服务提供商&#xff08;ISP&#xff09;、连接类型等。这些数据在多种场景下都非常有用&#xff0c;帮助用户理解网络环境和用户行为。 首先&…...

C 数组

C 数组 数组是C语言中的一种基本数据结构&#xff0c;用于存储一系列相同类型的数据。它是连续的内存分配&#xff0c;允许通过索引快速访问元素。本文将详细介绍C数组的概念、使用方法、以及注意事项。 1. 数组的概念 数组是一个集合&#xff0c;可以存储一定数量的元素。在…...

【Unity】unity安卓打包参数(个人复习向/有不足之处欢迎指出/侵删)

1.Texture Compression 纹理压缩 设置发布后的纹理压缩格式 Use Player Settings:使用在播放器设置中设置的纹理压缩格式 ETC&#xff1a;使用ETC格式&#xff08;兼容&#xff09; ETC2&#xff1a;使用ETC2格式&#xff08;很多设备不支持&#xff09; ASTC&#xff1a;使用…...

C0016.Clion中qDebug()打印输出中文时,都是问号??????的解决办法

问题描述 在clion中使用qDebug打印输出中文内容时&#xff0c;都是&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;如下图&#xff1a; 注意&#xff1a;修改该文件的编码格式就行&#xff0c;该文件名为apr.cpp&#xff1b; 解决办法...

C++ priority_queue 优先队列构造大根堆和小根堆

priority_queue的三个参数 template <class T, class Container std::vector<T>, class Compare std::less<typename Container::value_type>> class priority_queue;1、元素类型 2、底层容器类型&#xff0c;默认vector 3、比较函数&#xff08;传入的是…...

音视频入门基础:FLV专题(9)——Script Tag简介

一、SCRIPTDATA 根据《video_file_format_spec_v10_1.pdf》第75页到76页&#xff0c;如果某个Tag的Tag header中的TagType值为18&#xff0c;表示该Tag为Script Tag&#xff08;脚本Tag&#xff0c;又称Data Tag、SCRIPTDATA tag&#xff09;。这时如果Filter的值不为1表示未加…...

Vue页面,基础配置

最简单页面 日期范围及字符搜索&#xff0c;监听器处理日期范围搜索控件清空重置问题导出、导出文件文件名称带日期时间表格日期指定格式显示。。。 <template><div class"app-container"><el-form :model"queryParams" ref"queryForm…...

(杨辉三角) 攻防世界--->notsequence

学习笔记。(不想看可以直接跳正文。) 前言&#xff1a;仿佛又回到高中 - - 只不过&#xff0c;是以另一种形式再次出现。 学习思维为主&#xff0c;做题位次。&#xff08;后面再补。&#xff09; 前置知识&#xff1a; 什么是杨辉三角&#xff1a; 杨辉三角_百度百科 (bai…...

【CTF Web】Pikachu CSRF(get) Writeup(CSRF+GET请求+社会工程学)

CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”&#xff0c;在CSRF的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09;&#xff0c;然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击就完成…...

智能工厂的软件设计 作为“程序Program”的中台 之2

Q11、现在&#xff0c;我们再重新理解一下前面所说&#xff1a;三种中台&#xff08;数据中台、技术中台和业务中台&#xff09;作为这个整体的三个整子Holon&#xff0c;合起来是一个 融合了三分法&#xff08; 三分部 的三个中台构成三段式 程序框架&#xff0c;分别用 <h…...

GB28181信令交互流程及Android端设备对接探讨

GB28181规范必要性 好多开发者在做比如执法记录仪、智能安全帽、智能监控等设备端视频回传技术方案选型的时候&#xff0c;不清楚到底是用RTSP、RTMP还是GB28181&#xff0c;对GB28181相对比较陌生&#xff0c;我们就GB28181规范的必要性&#xff0c;做个探讨&#xff1a; 实现…...

OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 视频写入器类。 该类提供了用于写入视频文件或图像序列的 C API。 cv::VideoWriter 类是 OpenCV 库中用于创建和写入视频文件的一个类。它提供了…...

c语言学习(书本目录)

关键字 变量 3.typedef的使用&#xff1a; 定义一个结构体&#xff0c;名字是Person&#xff1a; struct Person { char name[50]; int age; }; 给结构体取一个别名&#xff1a;struct Person---》Person typedef struct Person Person; 上面带标签的结构体等效于 …...

2024年最新版本神马TV8.5影视APP源码 293TV影视点播系统源码搭建教程 神马TV8.2加强版反编译教程 保姆级小白可搭建 完整版本视频教程

2024年最新版的神马TV影视APP源码&#xff0c;版本号8.5&#xff0c;提供了前所未有的定制化选项和高级功能。用户可以轻松更换应用的包名和名称&#xff0c;确保品牌个性化。此外&#xff0c;该应用采用了动态域名加密技术&#xff0c;增强了数据传输的安全性。它支持自动切换…...

衍生品交易的隐藏风险:认识CCR和xVA

作为一名资深的量化交易专家和金融自媒体人&#xff0c;我经常被问到&#xff1a;"衍生品交易真的像传说中那么危险吗&#xff1f;"这个问题背后&#xff0c;隐藏着许多投资者对金融市场的担忧和好奇。今天&#xff0c;让我们一起揭开衍生品交易中两个关键概念的面纱…...

我的项目管理生涯

1 前言 从好几年前就想写几篇关于自己职业生涯的文章了&#xff0c;一直由于各种原因没有写成&#xff0c;正好借新的工作机会&#xff0c;尤其是项目管理这段工作经历&#xff0c;计划通过这一二篇文章进行总结和反思一下&#xff0c;以期更顺利的开展相关工作或是自己能更上…...

ChatGPT Canvas:交互式对话编辑器

自两年前 ChatGPT 发布以来&#xff0c;主流 AI 均以对话形式进行交互。传统的对话式界面可以直观看到反馈结果&#xff0c;但在需要深度编辑和协作的项目中就略显局限。为了解决此问题&#xff0c;几个月前 Claude 就发布过 Artifacts 功能&#xff0c;用来拓展原有对话。而现…...

[Linux] Linux 的进程如何调度——Linux的 O(1)进程调度算法

标题&#xff1a;[Linux] Linux 的进程如何调度——优先级与进程调度 个人主页水墨不写bug 目录 一、前言 二、将要出现的概念 1.进程调度队列 2.位图 3.进程的优先级 三、Linux进程的调度过程 1.活动队列&#xff08;*active指向的队列&#xff09; 2.过期队列&#…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...