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

}

相关推荐
EVERSPIN11 分钟前
高性能32位MCU在热敏打印机上的应用
单片机·嵌入式硬件·mcu·32位mcu
心语星愿1116 分钟前
单片机架构:CPU、存储器与外设的协同原理
单片机·嵌入式硬件·架构
弄曲幽篁44 分钟前
stm32 USB虚拟串口
stm32·单片机·嵌入式硬件
学嵌入式的小杨同学1 小时前
STM32 进阶封神之路(四十一)FreeRTOS 中断管理、软件定时器、内存管理与低功耗模式|工业级实战完整版
vscode·stm32·单片机·嵌入式硬件·mcu·智能硬件·嵌入式实时数据库
蜕变的小白1 小时前
☆嵌入式硬件的学习 :51单片机 知识总结
单片机·嵌入式硬件·51单片机
yu85939581 小时前
基于MSP430 LaunchPad的蔬菜基地分布式无线低功耗温湿度监测系统
分布式·stm32·嵌入式硬件
学嵌入式的小杨同学1 小时前
STM32 进阶封神之路(四十)FreeRTOS 队列、信号量、互斥锁精讲|任务通信、同步、资源保护(超详细图文版)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
fie88891 天前
基于51单片机的航模遥控器6通道接收机程序
单片机·嵌入式硬件·51单片机
bu_shuo1 天前
嵌入式硬件工程师VS单板硬件工程师
嵌入式硬件·电子工程师·单板硬件
llilian_161 天前
选择北斗导航卫星信号模拟器注意事项总结 北斗导航卫星模拟器 北斗导航信号模拟器
功能测试·单片机·嵌入式硬件·测试工具·51单片机·硬件工程