Day29:I2C 高级应用

多字节读写:

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

从设备模式:

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

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

I2C 常见问题与解决方案:

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

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

I2C 应用案例:

连接 EEPROM 存储数据

连接 OLED 显示屏

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

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

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

// DHT11协议(简化版)

uint8_t DHT11_Read(void){

uint8_t data[5] = {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

data[i] <<= 1;

if(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)) data[i] |= 1; // 高电平为1

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

}

}

// 校验

if(data[4] == (data[0] + data[1] + data[2] + data[3])){

humidity = data[0]; // 湿度整数部分

temperature = data[2]; // 温度整数部分

return 1; // 成功

}

return 0; // 失败

}

相关推荐
VekiSon12 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
来自晴朗的明天13 小时前
14、光耦隔离电路(EL3H7)
单片机·嵌入式硬件·硬件工程
G***技13 小时前
杰和IB3-272:以低功耗高性能打造新一代工业智能交互核心
单片机·嵌入式硬件·物联网
czhaii14 小时前
STC AI8052U单片机特点
单片机
MAR-Sky15 小时前
keil5中数据的不同定义和单片机(以stc8为例)里的对应关系(idata,xdata,data,code)
单片机·嵌入式硬件
项目題供诗16 小时前
51单片机入门(八)
单片机·嵌入式硬件·51单片机
羽获飞17 小时前
从零开始学嵌入式之STM32——9.STM32的时钟系统
stm32·单片机·嵌入式硬件
飞睿科技17 小时前
乐鑫智能开关方案解析:基于ESP32-C系列的低功耗、高集成设计
嵌入式硬件·物联网·esp32·智能家居·乐鑫科技
来自晴朗的明天18 小时前
13、NMOS 电源防反接电路
单片机·嵌入式硬件·硬件工程
17(无规则自律)19 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件