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; // 失败

}

相关推荐
不悔哥1 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20161 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子1 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡1 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5551 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
女神下凡1 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9662 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛2 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅2 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员2 天前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程