单片机入门---I2C通信

STM32 HAL库硬件IIC实现CAT24C128通讯 1. 使用STM32CubeMX生成I2C初始化代码。 阅读详情

STM32 可以同时支持Master以及Slave mode。

通常我们I2C如果作为slave设备的时候,如果主机是Linux系统,我们往往先通过i2ctools进行设备的扫描,检测下设备是否存在。命令如下:
#i2cdetect -y -r i2c-id
如果能正确的发现设备,比如我们发现设备为0x17。这时候我们就可以通过0x17跟i2c slave进行通信了。比如我们可以通过以下命令查看这个设备的全部寄存器值。
#i2cdump -y -f 1 0x17
那么进一步思考,我们就会想为什么我们知道slave address是0x17,或者说为什么能通过0x17跟设备进行通信呢?
下面我们就来一点一点的揭开谜底。

我们随便打开一个介绍I2C的文档都是这么描述的,在I2C开始之后,先发送7bit的数据,然后一个读写位,如果设备slave address匹配成功,则会在第九个clock接收到ACK。
在这里插入图片描述
也就是说,在上面我们在Linux系统下其实只传递了前面7bit的数据,并没有添加读写位。而这个读写位是我们在调用读、写函数的时候,函数完成了对这个数据位的填充(此处需要注意,在单片机中,没有完成对这个第7位数据的填充功能,因此需要自己将这个slave address转换成函数能够正确传递的值,一般为slave address<<1)。
而当我们传递了slave address之后,数据到底是怎么被slave设备识别并且回复一个ACK的呢?
首先我们看一下STM32 I2C部分寄存器的定义:
在这里插入图片描述
这里我们需要对照源码来看一下这个地方的赋值情况。

  hi2c1.Instance = I2C1;
  hi2c1.Init.Timing = 0x40000A0B;
  hi2c1.Init.OwnAddress1 = 46;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  hi2c1.Init.OwnAddress2 = 208;
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_MASK02;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

可以看到我们虽然知道设备的地址是0x17,但是我们看到 hi2c1.Init.OwnAddress1 = 46;却是0x17<<1。

我们做一个对比,我们设置是10bit地址,看一下初始化代码部分是:

  hi2c1.Instance = I2C1;
  hi2c1.Init.Timing = 0x40000A0B;
  hi2c1.Init.OwnAddress1 = 23;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_10BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

从上面的对比我们看的出来,首先在选择10bit的时候必须不能支持dual address了,另外地址就占用了最低位。
综上,我们就知道了为什么我们在使用7bit地址的时候一些疑问。

另外我们需要注意一下 I2C协议和SMBUS协议的不同,从而在实现协议的过程中,能够同时兼容两种协议模式。

嵌入式IIC 外设技术详解 I²C总线技术解析:作为嵌入式系统的关键通信协议,I²C以其双线制(SDA数据线+SCL时钟线)的极简设计,实现多主多从设备的高效互连。该协议由飞利浦半导体于1980年代首创,通过硬件简化、拓扑灵活等特性,广泛应用于传感器网络、消费电子等领域。文章将深入剖析I²C的协议原理、硬件实现及开发实践,并展望其在物联网等新兴领域的发展趋势,为工程师提供全面的技术参考。核心优势包括仅需两根信号线、支持多设备共享总线等。 阅读详情

相关推荐

学习单片机入门你需要了解的知识之通信协议I2C总线

如果主设备收到应答信号之后,则会发送同设备的内部寄存器的地址信息,比如我们想要读取ADSL345加速度传感器X轴的数据,ADSL的设备地址为0x53,X轴数据的内部寄存器地址为0x32,相应的主设备配对道从设备地址之后需要访问ADSL内部寄存器地址0x32才能读取到X轴的数据信息。

爱瑞单片机,口令“资料” 1459

STM32 HAL库之IIC

hi2c1.Instance = I2C1; hi2c1.Init.Timing = 0x2000090E; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; ...

当下可为,未来可期! 8027

单片机通信协议从入门到实战:UART/I2C/SPI全解析

在嵌入式开发中,通信协议是连接单片机与外部设备的桥梁,也是实现传感器数据采集、显示控制、多机互联等功能的技术基石。从最基础的UART异步串行通信,到广泛用于低速外设的I2C总线,再到高速全双工的SPI接口,每种协议都有其独特的时序规则、电气特性与适用场景。理解协议的本质在于掌握时序图、帧格式以及ACK/仲裁机制,而借助逻辑分析仪抓取波形,可以高效定位设备无响应、数据错位等典型故障。当项目从板级扩展至工业现场时,RS485、Modbus、CAN等总线协议又提供了长距离、抗干扰的组网方案。本文结合51单片机及S

weixin_42525211的博客 360

STM32 HAL库I2C驱动OLED SSD1306 12864,带FreeRTOS

芯片为STM32F103C8T6,运行在72MHz。 该代码为完整的main.c,所有的代码都在这里面。使用STM32CubeMX生成的工程,除了基本配置,还有FreeRTOS,Interface为CMSIS_V2,默认配置。I2C1,配置为I2C,Fast Mode,400KHz,Duty cycle = 2,Addr = 7bit。 运行正常。 /* USER CODE BEGIN...

qq_41544116的博客 4479

电子知识笔记—单片机通信协议入门指南:5种常用协议详解与实战选择

从最常见的协议开始,比如UART、SPI、I2C,因为这些是基础,然后可能扩展到CAN、USB、蓝牙等。每个协议的结构应该包括基本概念、工作原理、优缺点、适用场景,以及常见问题。

m0_58350196的博客 2632

51单片机+ADS1110打造高精度电流表:从I2C通信到串口数据采集全解析

在嵌入式系统与数据采集领域,模数转换器(ADC)是将现实世界连续模拟信号转换为数字系统可处理离散数据的关键器件。其工作原理基于采样与量化,通过逐次逼近或Δ-Σ等技术实现高精度转换。ADC的技术价值在于为微控制器(MCU)提供了感知电压、电流、温度等物理量的能力,是物联网节点、智能仪表和工业控制系统的感知前端。典型应用场景包括传感器信号采集、电池管理系统和精密测量仪器。本文聚焦于**高精度ADC**与经典**51单片机**的协同应用,详细阐述了如何利用ADS1110这款16位Δ-Σ ADC芯片,通过I2C总线

weixin_34163553的博客 316

51单片机快速入门之 IIC I2C通信

51单片机快速入门之 IIC 总线通信

梦境虽美,却不长. 984

《STM32单片机基础入门》 - 第9章:I2C通信

【代码】《STM32单片机基础入门》 - 第9章:I2C通信。

2301_79143213的博客 879

STM32单片机入门学习——第31节: [10-1] I2C通信协议

本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!

qq_44764442的博客 1331

单片机学习之路——嵌入式开发的常见疑问与个人学习总结

嵌入式系统是指在特定应用领域中,以计算机技术为基础,以满足特定需求为目标,将计算机硬件系统与软件系统结合在一起的一种专用计算机系统。本文将介绍一些常见的疑问,并提供相应的源代码示例,帮助初学者更好地理解和入门单片机开发。软件方面,我们需要下载并安装相应的集成开发环境(IDE),如Keil、IAR等,以及单片机相关的软件库。当然,单片机的学习是一个持续的过程,需要不断实践和深入学习。中断是单片机开发中常用的一种机制,它可以在特定的事件发生时打断当前的程序执行,转而执行中断服务程序。

PixeGO的博客 112

单片机学习全攻略:从基础到实践

本文还有配套的精品资源,点击获取 简介:单片机作为嵌入式系统的核心,是电子设备的基石。本资源包旨在通过全面的学习材料,包括PPT、电路图、代码和软件工具,指导初学者逐步学习单片机的工作原理、结构组成、工作模式及编程技术。内容覆盖硬件连接、数字电路基础、通信协议和单片机编程语言。通过理论学习与实践操作相结合,本教程帮助初学者快速入门并深入理解单片机应用。 1. 单片...

weixin_35879493的博客 2334

基于单片机的I2C通信入门:操作指南与示例

深入浅出讲解i2c协议的工作原理与通信机制,结合单片机应用实例,帮助开发者掌握I2C总线的配置、数据传输及常见问题解决方法,提升嵌入式系统开发效率。

weixin_30205153的博客 452

I2C_Timing_Configuration

I2C_Time 寄存器配置工具,主要针对stm32F1 stm32f0系列的I2C配置

STM32单片机入门学习——第34节: [10-4] I2C通信外设

本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!

qq_44764442的博客 1069

PAM4信号测试实战:从眼图分析到误码率测量的技术演进

在高速数字系统设计中,信号完整性测试是确保数据传输可靠性的核心环节。其基本原理在于通过时域和频域分析,精确评估信号在传输过程中的质量衰减与失真。随着数据速率向56Gbps及以上演进,传统的NRZ编码面临带宽瓶颈,而PAM4调制技术通过在每个符号周期内承载更多比特信息,成为提升信道效率的关键路径。这项技术的工程价值在于,它允许在相同带宽下实现翻倍的数据吞吐量,这对于数据中心互联、PCIe 6.0及800G以太网等高速接口至关重要。然而,PAM4信号电平间距更小,对噪声和抖动极为敏感,导致其原始误码率显著升高,

weixin_42522817的博客 657

Multisim仿真运放积分器踩坑实录:为什么你的方波变不成三角波?

本文针对Multisim仿真运放积分器时方波无法转换为三角波的常见问题,提供了详细的排查与调试指南。文章指出,经典RC积分电路因直流反馈开路导致运放饱和,核心解决方案是在反馈电容两端并联大阻值电阻以稳定直流工作点。通过参数优化(调整Rin、C、Rf)和高级仿真技巧,手把手教你调出线性度好、幅度适中的完美三角波,并分享异常波形(如饱和、不对称、振荡)的对应策略。

weixin_29231263的博客 114

江科大51单片机入门学习笔记合集

学习自普中、江科大自化协课程。

jtwqwq的博客 2万+

微处理器实验报告-实验四

实验四 可编程定时/计数器8253实验 一、实验要求 利用8086外接8253可编程定时/计数器,可以实现方波的产生。 二、实验目的 1、学习8086与8253的连接方法。 2、学习8253的控制方法。 3、掌握8253定时器/计数器的工作方式和编程原理

青竹小轩的博客 5112

单片机入门(四)----I2C和AT24C02 用AT24C02做秒表

I2C和AT24C02I2CAT24C02秒表 I2C 下面展示一些 内联代码片。 I2C.c #include<STC15F2K60S2.H> sbit I2C_SCL=P2^0; sbit I2C_SDA=P2^1; /** * @brief I2C开始 * @param 无 * @retval 无 */ void I2C_Start(void) { I2C_SDA=1; I2C_SCL=1; I2C_SDA=0; I2C_SCL=

m0_46070147的博客 756

Fluent新手避坑:遇到‘Floating point exception’别慌,这7个排查步骤帮你搞定

本文为Fluent新手提供了遇到‘Floating point exception’错误时的7个详细排查步骤。从理解浮点异常的本质到边界条件检查、时间步长设置、求解器选择、网格优化、亚松弛因子调节以及高阶格式的取舍,帮助用户快速定位并解决问题,确保CFD仿真的稳定性和准确性。

weixin_30480075的博客 260

Verilog 并行 FIR 滤波器设计

FIR(Finite Impulse Response)滤波器是一种有限长单位冲激响应滤波器,又称为非递归型滤波器。FIR 滤波器具有严格的线性相频特性,同时其单位响应是有限长的,因而是稳定的系统,在数字通信、图像处理等领域都有着广泛的应用。

m0_61687959的博客 1604

入门单片机-认识stm32

单片机芯片引脚大多数都是GPIO口,用来输入和输出,根据引脚的数量分为GPIOA、GPIOB、GPIOC等,GPIOA又分为GPIOA0到GPIOA15,简写问PA0到PA15,16个引脚。每个单片机都要用到的一个外设就是RCC,它负责控制系统时钟和复位相关功能,只要MCU想要驱动程序,必须由RCC来设置初始化时钟,因为静息状态下硬件为了节省功耗是不工作的。中断是指CPU在执行主程序时,当特定触发条件(中断源)出现时,会暂停当前任务,转而处理中断程序,完成后返回到原位置继续执行。

2301_82013959的博客 310

157、飞控中的鲁棒自适应控制

本文总结了飞控系统中鲁棒自适应控制的实践经验。作者通过炸机案例引出传统PID控制的局限性,分析了鲁棒性与自适应性的本质矛盾,提出"用鲁棒性兜底,用自适应性提性能"的设计原则。重点介绍了模型参考自适应控制(MRAC)的实现方法,包括参考模型设计、自适应律调参技巧(建议初始增益设为0.01)、直接/间接自适应的应用场景差异,以及防止参数漂移的鲁棒修正方法。文章还分享了实际调试中的三大关键问题(初始值设定、激励条件、执行器饱和)及解决方案,并推荐了"鲁棒PID+自适应前馈"的混合架构。最后强调调试顺序应为先保证鲁

2401_88858637的博客 27

PCF8591芯片I2C通信与ADC/DAC应用实战指南

模数转换(ADC)与数模转换(DAC)是连接模拟世界与数字世界的核心技术,广泛应用于传感器数据采集、信号生成与控制等场景。其核心原理是通过特定电路将连续的模拟信号量化为离散的数字值,或将数字值还原为模拟信号。在嵌入式系统中,I2C总线因其接口简洁、占用引脚少,成为连接此类转换芯片与微控制器的常用通信协议。通过软件模拟I2C时序,开发者可以深入理解通信协议的底层机制,掌握寄存器配置、数据读写流程等关键技能,这对于构建稳定可靠的测控系统具有重要价值。本文以PCF8591这颗集成了ADC和DAC功能的经典芯片为例

weixin_29191761的博客 309

工业预测性维护实战:振动分析+Transformer预警系统构建指南

摘要:本文聚焦工业设备预测性维护难题,提出基于振动分析与Transformer模型的全栈解决方案。通过低成本硬件选型(单传感器¥380)实现设备振动信号实时采集,利用边缘计算单元完成特征工程(RMS、峰度、峰值频率提取),并在云端部署Transformer时序模型进行异常预警。某风电龙头企业实践显示,系统将故障误报率从38%降至6%,维护成本降低58%,非计划停机时长减少87%。文中提供完整的边缘端特征提取代码、云端模型架构及实施流程,适配ISO 13373振动分析标准,为制造业设备健康管理提供可复用的工程

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 626

WPF实战案例 | C# WPF实现大学选课系统

WPF实战案例_C# WPF实现大学选课系统, C# WPF实现大学选课系统,大作业,毕业设计,该系统实现多身份登录、修改密码、课程的管理,个人信息的管理等功能。这个源码让你快速搭建自己的应用程序,注释完整,代码规范,各种风格都有,代码上手简单,代码独立,可以直接用程序打开,运行使用。也可直接点击EXE运行程序。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4624
上一篇: 单片机入门---ADC采样
下一篇: 单片机入门---EEPROM & programming flash
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值