Day29:I2C 高级应用

多字节读写:

连续读取 / 写入多个字节 (如读取温湿度传感器数据)

从设备模式:

STM32 作为从设备响应主设备请求

适用于多 MCU 系统或特定外设通信

I2C 常见问题与解决方案:

通信失败:检查上拉电阻、SDA/SCL 是否接反、地址是否正确

时序问题:降低通信速率 (如从 400Kbps 降至 100Kbps)

I2C 应用案例:

连接 EEPROM 存储数据

连接 OLED 显示屏

连接温湿度传感器 (DHT11/SHT30)

连接加速度计 / 陀螺仪 (MPU6050)

代码示例:(读取 DHT11 温湿度数据)

// DHT11协议(简化版)

uint8_t DHT11_Read(void){

uint8_t data5 = {0};

uint8_t i, j;

// 主机发送起始信号

HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); // 拉低SDA

HAL_Delay(20); // 持续至少18ms

HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); // 拉高SDA

HAL_Delay(30); // 等待响应

// 等待DHT11响应

while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待SDA变低

while(!HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待SDA变高

while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待SDA变低

// 接收40位数据

for(i=0; i<5; i++){

for(j=0; j<8; j++){

while(!HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待高电平

HAL_Delay(30); // 延时判断是0还是1

datai <<= 1;

if(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)) datai |= 1; // 高电平为1

while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)); // 等待低电平

}

}

// 校验

if(data4 == (data0 + data1 + data2 + data3)){

humidity = data0; // 湿度整数部分

temperature = data2; // 温度整数部分

return 1; // 成功

}

return 0; // 失败

}

相关推荐
sramdram1 小时前
MCU微控制器OA打印机方案
单片机·嵌入式硬件·mcu·mcu微控制器
天天爱吃肉82182 小时前
【电源拆解:跟着问答逐一认识开关适配器PCB元器件】
大数据·人工智能·python·功能测试·嵌入式硬件·汽车
科芯创展6 小时前
3.5A,60VIN,异步降压芯片,XZ1815
单片机·嵌入式硬件
茯苓gao6 小时前
嵌入式开发笔记:Qt信号槽机制深度解析——从原理到实战的全方位指南
开发语言·笔记·嵌入式硬件·qt·学习
浅止菌7 小时前
海思回归第二弹:瑞芯微的隐忧与对手的反击
嵌入式硬件
Kuakewei8887 小时前
PW2609A在2.6A负载下压差0.14V,温升较3A工况低11°C
单片机·嵌入式硬件
Zyed7 小时前
[FreeRTOS]Day7项目介绍
stm32·单片机·嵌入式硬件
xuxie999 小时前
start7 电机闭环控制
单片机·嵌入式硬件
嵌入式-老费9 小时前
esp32开发与应用(播放wav音频文件)
嵌入式硬件
LCG元9 小时前
嵌入式开发踩坑排查实战:从 STM32 外设初始化到 Linux SPI 驱动的 15 类硬件疑难故障深度复盘
linux·stm32·单片机