欢迎光临
我们一直在努力

STM32通用软件IIC驱动|结构体封装任意IO、零硬件冲突、时序深度解析(适配全IIC设备)

一、前言(为什么放弃硬件IIC) 承接前文:GPIO、定时器、ADC、DMA、RS485、Modbus全套外设,项目开发高频遇到IIC痛点:

  • 硬件IIC引脚固定,复用功能冲突,布线受限,不能自选IO。
  • 硬件IIC极易总线死锁、忙标志卡死,断电才能恢复。
  • 多路IIC设备挂载,硬件外设数量不够,无法拓展总线。
  • 网上普通软件IIC写死引脚,换IO就要改底层时序,移植麻烦。 本文核心亮点:结构体抽象IO,任意PA/PB/PC口一键切换,零硬件外设占用、无总线冲突、带超时防死机、时序标准,适配项目多路传感器挂载。。

  • 二、软件IIC底层时序深度解析 2.1 软硬件IIC核心区别

    • 硬件IIC:片上外设自动输出时序,占用硬件资源,引脚固定,容错低。
    • 软件IIC:GPIO高低电平模拟时序,纯代码实现,IO自由选配,不占用硬件IIC外设,永不冲突。 2.2 标准IIC四大核心时序(代码一一对应)
  • 起始信号:SCL高电平,SDA下降沿拉低。
  • 停止信号:SCL高电平,SDA上升沿拉高。
  • 应答信号:接收方拉低SDA=ACK,拉高=NACK。
  • 字节读写:高位先行,标准100K通讯时序。 2.3 原创防卡死优化:应答超时机制 普通软件IIC等待应答死循环,设备掉线直接死机,本文加入超时计数,无应答直接退出,不阻塞主程序,适配工控不稳定接线场景。 2.4 总线适配规则 SDA必须配置开漏输出,支持总线线与,多设备共用总线互不干扰;SCL推挽输出即可。

  • 三、实战项目介绍 3.1 项目功能 主控STM32F103C8T6,搭建双路独立软件IIC总线:

  • 总线1:PA8/PA9 模拟IIC,驱动AT24C02存储ADC采集数据。
  • 总线2:PB10/PB11 模拟IIC,驱动SHT30温湿度传感器。 两套软件IIC独立运行,互不冲突,不启用芯片硬件IIC1/IIC2外设,无引脚复用报错。 3.2 方案优势
    • 无需开启硬件IIC时钟,彻底规避硬件寄存器bug。
    • 任意GPIO随意更换,布线随心所欲。
    • 一套驱动,挂载全部IIC协议外设,不用改写时序代码。

    四、结构体通用模块化代码 分层文件:soft_iic.h + soft_iic.c,结构体绑定IO,新建一路IIC仅初始化结构体,不用改写底层时序。 4.1 soft_iic.h 头文件 #ifndef __SOFT_IIC_H #define __SOFT_IIC_H #include “stm32f10x.h”

    //IIC电平定义 #define IIC_HIGH 1 #define IIC_LOW 0

    //IO操作结构体 【核心通用设计】 //更换IIC、更换引脚,仅新建结构体赋值即可,不改底层时序 typedef struct {
    //端口+引脚定义 GPIO_TypeDef *scl_port; uint16_t scl_pin; GPIO_

    赞(0)
    未经允许不得转载:171主机测评 » STM32通用软件IIC驱动|结构体封装任意IO、零硬件冲突、时序深度解析(适配全IIC设备)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址