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

}

相关推荐
不会武功的火柴27 分钟前
SystemVerilog语法(8)-有限状态机(FSM)
嵌入式硬件·fpga开发·自动化·ic验证·rtl·uvm方法学
猫猫的小茶馆2 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
feifeigo1232 小时前
STM32矩阵键盘驱动(库函数版)实现
stm32·矩阵·计算机外设
嵌入式小站3 小时前
STM32 零基础可移植教程 05:按键消抖,为什么按一次会触发好几次
chrome·stm32·嵌入式硬件
czhaii3 小时前
跟我动手学FX系列PLC GX2环境
嵌入式硬件
拾知_H4 小时前
STM32/Delay延时函数编程思路
stm32·单片机·时钟·延时
2zcode5 小时前
基于STM32的智能扫地机器人设计与实现
stm32·嵌入式硬件·机器人
jllllyuz6 小时前
单相并网逆变器控制代码实现(STM32版)
stm32·单片机·嵌入式硬件
冉卓电子7 小时前
GD32C103RBT6 misc 内核驱动库极简解析
单片机·嵌入式硬件
yongui478347 小时前
MAX6675 K型热电偶温度采集程序(Keil环境)
单片机·嵌入式硬件