基于STM32实现模拟3个I2C口操作2个SHT20和1个DS3231,并通过串口输出数据

简介: 基于STM32实现模拟3个I2C口操作2个SHT20和1个DS3231,并通过串口输出数据

基于STM32实现模拟3个I2C口操作2个SHT20和1个DS3231,并通过串口输出数据的解决方案。结合了软件I2C的灵活性和硬件I2C的稳定性,适用于需要多设备通信的场景。

硬件连接

  1. SHT20传感器:假设连接到两个不同的GPIO口组合,分别作为两个I2C总线。
    • SHT20_1:SCL -> PA0, SDA -> PA1
    • SHT20_2:SCL -> PA2, SDA -> PA3
  2. DS3231:使用STM32自带的硬件I2C接口(如I2C1),SCL -> PB6, SDA -> PB7。

软件设计

  1. 软件I2C实现:用于操作两个SHT20传感器。参考实现软件I2C通信,定义两个I2C结构体分别对应两个SHT20。
  2. 硬件I2C实现:用于操作DS3231,使用HAL库配置I2C1。
  3. 串口通信:用于输出数据,配置USART接口。

代码

1. 软件I2C驱动(部分代码)

#include "stm32f1xx_hal.h"

#define IIC_DELAY_TIME 1

typedef struct {
   
    GPIO_TypeDef* SCL_GPIO;
    uint16_t SCL_Pin;
    GPIO_TypeDef* SDA_GPIO;
    uint16_t SDA_Pin;
} IIC_TypeDef;

void IIC_Init(IIC_TypeDef* iic) {
   
    // GPIO初始化代码
}

void IIC_Start(IIC_TypeDef* iic) {
   
    // 软件I2C起始信号
}

void IIC_Stop(IIC_TypeDef* iic) {
   
    // 软件I2C停止信号
}

void IIC_SendByte(IIC_TypeDef* iic, uint8_t dat) {
   
    // 发送字节
}

uint8_t IIC_ReadByte(IIC_TypeDef* iic) {
   
    // 读取字节
    return 0;
}

uint8_t IIC_Sack(IIC_TypeDef* iic) {
   
    // 等待应答
    return 0;
}

2. SHT20操作函数

#define SHT20_ADDR 0x80

float SHT20_ReadTemperature(IIC_TypeDef* iic) {
   
    uint8_t cmd = 0xF3;
    IIC_Start(iic);
    IIC_SendByte(iic, SHT20_ADDR);
    IIC_SendByte(iic, cmd);
    IIC_Stop(iic);
    HAL_Delay(85); // 等待测量完成
    IIC_Start(iic);
    IIC_SendByte(iic, SHT20_ADDR | 1); // 读模式
    uint8_t data[2];
    data[0] = IIC_ReadByte(iic);
    IIC_Ack(iic, 1);
    data[1] = IIC_ReadByte(iic);
    IIC_Ack(iic, 0);
    IIC_Stop(iic);
    float temp = -46.85 + 175.72 * (((uint16_t)data[0] << 8) | data[1]) / 65536.0;
    return temp;
}

3. DS3231操作函数

#define DS3231_ADDR 0x68

void DS3231_ReadTime(I2C_HandleTypeDef* hi2c, uint8_t* time) {
   
    HAL_I2C_Master_Transmit(hi2c, DS3231_ADDR, 0x00, 1, 1000);
    HAL_I2C_Master_Receive(hi2c, DS3231_ADDR, time, 7, 1000);
}

参考代码 stm32 模拟3个IIC口操作2个SHT20和1个DS3231,串口输出数据 www.youwenfan.com/contentalc/56853.html

4. 主函数

int main(void) {
   
    HAL_Init();
    // 初始化硬件I2C和USART
    IIC_TypeDef iic1 = {
   GPIOA, GPIO_PIN_0, GPIOA, GPIO_PIN_1}; // SHT20_1
    IIC_TypeDef iic2 = {
   GPIOA, GPIO_PIN_2, GPIOA, GPIO_PIN_3}; // SHT20_2
    IIC_Init(&iic1);
    IIC_Init(&iic2);

    I2C_HandleTypeDef hi2c1; // 硬件I2C1
    DS3231_Init(&hi2c1);

    while (1) {
   
        float temp1 = SHT20_ReadTemperature(&iic1);
        float temp2 = SHT20_ReadTemperature(&iic2);
        uint8_t time[7];
        DS3231_ReadTime(&hi2c1, time);

        // 通过串口输出数据
        printf("SHT20_1 Temp: %.2f C\n", temp1);
        printf("SHT20_2 Temp: %.2f C\n", temp2);
        printf("DS3231 Time: %02d:%02d:%02d\n", time[2], time[1], time[0]);
        HAL_Delay(1000);
    }
}

注意事项

  1. GPIO初始化:确保GPIO的模式和速度配置正确。
  2. I2C设备地址:SHT20和DS3231的I2C地址是固定的,注意不要冲突。
  3. 延时处理:SHT20的测量需要一定时间,确保延时足够。

通过上述代码,可以实现STM32模拟多个I2C口操作多个设备,并通过串口输出数据。

相关文章
|
23天前
|
运维 Dubbo Cloud Native
Dubbo 云原生重构出击:更快部署、更强控制台、更智能运维
Apache Dubbo 最新升级支持云原生,提供一键部署微服务集群与全新可视化控制台,提升全生命周期管理体验,助力企业高效构建云原生应用。
172 22
|
10天前
|
存储 缓存 中间件
《金融对账系统雪崩隐患的深度复盘与架构重生》
本文复盘了金融级支付对账系统因分布式缓存设计缺陷引发的隐性危机:系统上线后,对账高峰时段出现节点“假死”、数据不一致问题,却无明显资源耗尽迹象,且问题间歇性发生。排查发现,高并发下任务调度框架返回异常商户ID,生成无效缓存Key,叠加缓存客户端“批量合并请求”与“无限重试”设计,导致线程池阻塞;节点恢复后又因任务状态未同步,引发数据重复处理或遗漏。通过全链路数据校验、缓存交互优化(分段查询+降级熔断)、分布式锁与全局状态同步,系统问题得以解决,最终提炼出分布式系统开发的四大核心原则,为后端架构设计提供参考。
85 33
|
10天前
|
数据采集 供应链 前端开发
90%的多维表格用户不知道:这些数据必须上BI
多维表格可以助力轻量数据管理,但在多源整合、复杂分析与企业级数据展示上仍有限制。Quick BI作为专业BI工具,可填补其空白,实现数据深度挖掘与决策支持。两者结合,打造高效数据闭环,释放商业智能价值。
|
17天前
|
API C++
【Azure 环境】VS Code登录China Azure(Function)报错 An error occurred while signing in: invalid_request - AADSTS65002
An error occurred while signing in: invalid_request - AADSTS65002: Consent between first party application 'c27c220f-ce2f-4904-927d-333864217eeb' and first party resource '797f4846-ba00-4fd7-ba43-dac1f8f63013' must be configured via preauthorization - applications owned and operated by Microsoft mus
108 13
|
28天前
|
SQL Oracle 关系型数据库
MySQL的sql_mode模式说明及设置
MySQL的sql_mode模式说明及设置
363 112
|
10天前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
59 18
|
12天前
|
存储 消息中间件 人工智能
Lazada 如何用实时计算 Flink + Hologres 构建实时商品选品平台
本文整理自 Lazada Group EVP 及供应链技术负责人陈立群在 Flink Forward Asia 2025 新加坡实时分析专场的分享。作为东南亚领先的电商平台,Lazada 面临在六国管理数十亿商品 SKU 的挑战。为实现毫秒级数据驱动决策,Lazada 基于阿里云实时计算 Flink 和 Hologres 打造端到端实时商品选品平台,支撑日常运营与大促期间分钟级响应。本文深入解析该平台如何通过流式处理与实时分析技术重构电商数据架构,实现从“事后分析”到“事中调控”的跃迁。
202 56
Lazada 如何用实时计算 Flink + Hologres 构建实时商品选品平台
|
29天前
|
运维 监控 Cloud Native
从本土到全球,云原生架构护航灵犀互娱游戏出海
内容整理自「 2025 中企出海大会·游戏与互娱出海分论坛」,灵犀互娱基础架构负责人朱晓靖的演讲内容,从技术层面分享云原生架构护航灵犀互娱游戏出海经验。
|
29天前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
简介:本文整理自阿里云高级技术专家李麟在Flink Forward Asia 2025新加坡站的分享,介绍了Flink 2.1 SQL在实时数据处理与AI融合方面的关键进展,包括AI函数集成、Join优化及未来发展方向,助力构建高效实时AI管道。
386 43