第32讲:实战——I2C传感器极简驱动快速验证
CSDN专栏嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料第32讲实战——I2C传感器极简驱动快速验证一、I2C传感器驱动基础I2C是最常用的传感器接口快速验证I2C传感器驱动是嵌入式开发的基本功。1.1 I2C传感器特点优点只需两根线SCL、SDA支持多设备共享总线协议简单常见I2C传感器温湿度SHT30、BME280加速度MPU6050、LIS3DH气压BMP280光照BH1750颜色TCS347251.2 I2C驱动要点基本操作写寄存器发送设备地址寄存器地址数据读寄存器发送设备地址寄存器地址然后读取数据时序要求Start/Stop条件ACK/NACK应答总线恢复时间二、SHT30温湿度传感器2.1 快速验证流程Prompt生成STM32F103 SHT30驱动 - I2C1PB6(SCL)、PB7(SDA) - 地址0x44 - 功能读取温度和湿度 - 使用HAL库AI生成#includestm32f1xx_hal.hI2C_HandleTypeDef hi2c1;#defineSHT30_ADDR0x44voidI2C1_Init(void){hi2c1.InstanceI2C1;hi2c1.Init.ClockSpeed100000;hi2c1.Init.DutyCycleI2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress10;hi2c1.Init.AddressingModeI2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressModeI2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress20;hi2c1.Init.GeneralCallModeI2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchModeI2C_NOSTRETCH_DISABLE;HAL_I2C_Init(hi2c1);}int8_tSHT30_Read(float*temperature,float*humidity){uint8_tcmd[2]{0x2C,0x06};uint8_tdata[6];// 发送测量命令if(HAL_I2C_Master_Transmit(hi2c1,SHT30_ADDR1,cmd,2,100)!HAL_OK){return-1;}// 等待测量完成HAL_Delay(20);// 读取数据if(HAL_I2C_Master_Receive(hi2c1,SHT30_ADDR1,data,6,100)!HAL_OK){return-1;}// 计算温度uint16_trawTemp(data[0]8)|data[1];*temperature-45.0f175.0f*(float)rawTemp/65535.0f;// 计算湿度uint16_trawHumi(data[3]8)|data[4];*humidity100.0f*(float)rawHumi/65535.0f;return0;}intmain(void){HAL_Init();SystemClock_Config();I2C1_Init();UART_Init();floattemp,humi;while(1){if(SHT30_Read(temp,humi)0){printf(Temperature: %.2f°C, Humidity: %.2f%%\r\n,temp,humi);}else{printf(SHT30 read failed\r\n);}HAL_Delay(1000);}}2.2 验证方法检查设备是否就绪voidSHT30_Check(void){if(HAL_I2C_IsDeviceReady(hi2c1,SHT30_ADDR1,3,100)HAL_OK){printf(SHT30 found at 0x%02X\r\n,SHT30_ADDR);}else{printf(SHT30 not found\r\n);}}I2C总线扫描voidI2C_Scan(void){printf(I2C Scan:\r\n);for(uint8_taddr0;addr128;addr){if(HAL_I2C_IsDeviceReady(hi2c1,addr1,1,10)HAL_OK){printf(Device found at 0x%02X\r\n,addr);}}}三、MPU6050加速度传感器3.1 MPU6050驱动Prompt生成STM32F103 MPU6050驱动 - I2C1PB6(SCL)、PB7(SDA) - 地址0x68 - 功能读取加速度和陀螺仪 - 使用HAL库AI生成#defineMPU6050_ADDR0x68int8_tMPU6050_Init(void){uint8_tdata;// 唤醒MPU6050data0x00;if(HAL_I2C_Mem_Write(hi2c1,MPU6050_ADDR1,0x6B,1,data,1,100)!HAL_OK){return-1;}// 配置加速度量程±2gdata0x00;HAL_I2C_Mem_Write(hi2c1,MPU6050_ADDR1,0x1C,1,data,1,100);// 配置陀螺仪量程±250°/sdata0x00;HAL_I2C_Mem_Write(hi2c1,MPU6050_ADDR1,0x1B,1,data,1,100);return0;}int8_tMPU6050_ReadAccel(float*ax,float*ay,float*az){uint8_tdata[6];if(HAL_I2C_Mem_Read(hi2c1,MPU6050_ADDR1,0x3B,1,data,6,100)!HAL_OK){return-1;}int16_trawX(data[0]8)|data[1];int16_trawY(data[2]8)|data[3];int16_trawZ(data[4]8)|data[5];// 转换为g±2g量程*ax(float)rawX/16384.0f;*ay(float)rawY/16384.0f;*az(float)rawZ/16384.0f;return0;}四、BME280环境传感器4.1 BME280驱动Prompt生成STM32F103 BME280驱动 - I2C1PB6(SCL)、PB7(SDA) - 地址0x76 - 功能读取温度、湿度、气压 - 使用HAL库AI生成核心代码#defineBME280_ADDR0x76int8_tBME280_Init(void){uint8_tdata;// 检查芯片IDif(HAL_I2C_Mem_Read(hi2c1,BME280_ADDR1,0xD0,1,data,1,100)!HAL_OK){return-1;}if(data!0x60){// BME280芯片IDreturn-1;}// 配置湿度过采样x1data0x01;HAL_I2C_Mem_Write(hi2c1,BME280_ADDR1,0xF2,1,data,1,100);// 配置温度和气压过采样、工作模式data0x27;// 温度x1、气压x1、正常模式HAL_I2C_Mem_Write(hi2c1,BME280_ADDR1,0xF4,1,data,1,100);// 配置待机时间、滤波器data0x00;HAL_I2C_Mem_Write(hi2c1,BME280_ADDR1,0xF5,1,data,1,100);return0;}int8_tBME280_Read(float*temperature,float*pressure,float*humidity){uint8_tdata[8];// 读取所有数据if(HAL_I2C_Mem_Read(hi2c1,BME280_ADDR1,0xF7,1,data,8,100)!HAL_OK){return-1;}// 解析数据简化版实际需要补偿计算uint32_trawPress(data[0]12)|(data[1]4)|(data[2]4);uint32_trawTemp(data[3]12)|(data[4]4)|(data[5]4);uint16_trawHumi(data[6]8)|data[7];// 简化计算实际需要补偿*temperature(float)rawTemp/100.0f;*pressure(float)rawPress/100.0f;*humidity(float)rawHumi/1024.0f;return0;}五、I2C调试技巧5.1 常见问题问题一设备未找到原因 - 设备地址错误 - I2C引脚配置错误 - 设备未供电 解决 - I2C总线扫描 - 检查引脚配置 - 检查供电问题二读取数据错误原因 - 寄存器地址错误 - 时序问题 - 总线干扰 解决 - 添加延时 - 降低I2C速率 - 检查寄存器地址5.2 调试代码I2C读取调试int8_tI2C_Read_Debug(uint8_taddr,uint8_treg,uint8_t*data,uint16_tlen){printf(I2C Read: Addr0x%02X, Reg0x%02X, Len%d\r\n,addr,reg,len);HAL_StatusTypeDef statusHAL_I2C_Mem_Read(hi2c1,addr1,reg,1,data,len,100);if(statusHAL_OK){printf(Data: );for(uint16_ti0;ilen;i){printf(%02X ,data[i]);}printf(\r\n);return0;}else{printf(Error: %d\r\n,status);return-1;}}六、本讲核心要点6.1 记住这三句话I2C传感器驱动写寄存器、读寄存器、数据转换快速验证设备扫描、读取数据、验证合理性调试技巧I2C扫描、读取调试、时序检查6.2 实践建议对于新手学习I2C协议实践传感器驱动使用调试技巧对于有经验工程师建立传感器驱动模板库实现通用I2C驱动框架优化性能6.3 下讲预告第33讲将深入讲解实战ADC采集、电压采样快速代码生成ADC是模拟量采集的基础如何快速生成ADC采集代码下一讲将详细讲解。

相关新闻

第31讲:实战——SPI屏驱动快速试错、点亮屏幕

第31讲:实战——SPI屏驱动快速试错、点亮屏幕

CSDN专栏: 嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料 第31讲:实战——SPI屏驱动快速试错、点亮屏幕 一、SPI屏幕驱动基础 SPI屏幕是嵌入式常见的显示设备,驱动屏幕需要正确配置SPI、理解屏幕控制命令…

2026/10/20 12:19:01 阅读更多 →
【Rust自学】16.2. 使用消息传递来跨线程传递数据

【Rust自学】16.2. 使用消息传递来跨线程传递数据

16.2 使用消息传递来跨线程传递数据 16.2.1. 消息传递 有一种很流行而且能保证安全并发的技术叫做消息传递。在这种机制里,线程(或 Actor)通过彼此间发送消息(数据)来进行通讯。 Go 语言有一句名言是这么说的&#…

2026/10/18 0:51:04 阅读更多 →
[GESP202606 七级] 染色

[GESP202606 七级] 染色

P17014 [GESP202606 七级] 染色 https://www.luogu.com.cn/problem/P17014 GESP7级终于通过啦!! https://www.bilibili.com/video/BV1kKXWYrExs/ GESP七级C历年真题讲解 https://www.bilibili.com/video/BV1Fk2wBxEHm/ 【6月GESP考后大盘点:七…

2026/10/19 14:36:16 阅读更多 →

最新新闻

上网家长控制软件怎么选?从DNS过滤到网关策略的部署实践

上网家长控制软件怎么选?从DNS过滤到网关策略的部署实践

简介:这是一款面向家长的 Windows 上网管控工具,针对儿童过度上网、访问不良网站等家庭场景,提供网址过滤、上网时段限制、密码锁屏、断网/关机及应用程序监控等功能,既适合家庭用户直接部署,也适合学习 C# 桌面应用开…

2026/10/20 16:44:46 阅读更多 →
BLDC双闭环调速Simulink仿真:建模、换相与PI参数整定实战

BLDC双闭环调速Simulink仿真:建模、换相与PI参数整定实战

BLDC无刷直流电机的仿真设计,名字听着挺“课程设计”,但说实话,这东西做到什么深度,完全看个人。你要是只是把模型搭起来跑个波形,那确实入门级别;但要是把转速环、电流环的参数整定逻辑搞清楚,…

2026/10/20 16:44:46 阅读更多 →
YOLO-World工程实践:文本驱动目标检测的可落地方案

YOLO-World工程实践:文本驱动目标检测的可落地方案

简介:本资源是YOLO-World开源检测模型的完整PyTorch实现包,面向计算机视觉方向的研究者、算法工程师及具备PyTorch基础的进阶学习者,旨在支持开放词汇目标检测与图文联合定位任务的快速复现与二次开发。压缩包共161个文件,涵盖110…

2026/10/20 16:44:46 阅读更多 →
边界值分析:软件测试中如何精准捕获临界点Bug

边界值分析:软件测试中如何精准捕获临界点Bug

1. 看清边界值分析的真面目 1.1 一个让我记忆犹新的线上事故 先讲一次真实的工作经历。某次版本上线后,运营反馈用户提交的资料总是“莫名丢失”。排查到最后,问题出在一个看起来人畜无害的字段校验上——一个文本输入框,需求文档写着“长度…

2026/10/20 16:44:46 阅读更多 →
Mac下JMeter入门:从Java环境到性能压测全流程

Mac下JMeter入门:从Java环境到性能压测全流程

"Mac下Jmeter的入门级操作"——说实话,第一次在Mac上打开JMeter的人,十个有九个会卡在安装或Java版本上,剩下那一个卡在界面看不懂。作为一个踩过不少坑的测试老兵,我来把从零开始到跑通第一个压测脚本的全过程捋一遍&a…

2026/10/20 16:44:46 阅读更多 →
5分钟粒度时间序列预测:ARIMA全流程实战与坑点解析

5分钟粒度时间序列预测:ARIMA全流程实战与坑点解析

数据准备:5分钟数据的“脏活累活” 2.1 采集与落库,先解决有没有的问题 2.2 缺失值处理,别让“空洞”骗了模型 2.3 异常值甄别,业务噪声与真实波动的边界 2.4 重采样与对齐,把时间轴捋直了 数据是一切时序建模的地…

2026/10/20 16:43:46 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →