软件IIC和硬件IIC的引脚配置有什么区别?

STM32的硬件IIC和软件模拟IIC在引脚配置上有根本性的区别

下面是两者的核心区别对比:

特性 硬件IIC 软件模拟IIC (Software IIC)
引脚要求 必须 使用芯片指定的、具有I2C外设功能复用的特定引脚 几乎任意通用输入输出(GPIO)引脚都可以。
配置模式 将GPIO模式设置为 GPIO_Mode_AF_OD (复用开漏输出)。 将GPIO模式设置为 GPIO_Mode_Out_OD (通用开漏输出)或使用推挽输出加外部上拉。
初始化内容 需要初始化两个部分 : 1. GPIO引脚 2. I2C外设本身(如I2C1) 只需要初始化GPIO引脚。所有时序都由软件代码控制。
内部上拉电阻 通常禁用 内部上拉,依赖外部上拉电阻(4.7kΩ),以确保总线兼容性和可靠性。 强烈建议 使用外部上拉电阻(4.7kΩ),禁用内部上拉。
灵活性 。引脚由芯片数据手册(Datasheet)的引脚定义表固定死,不可更改。 极高。可以任意更换到其他GPIO引脚,无需修改硬件电路。
性能 。由硬件处理,占用CPU资源少,速度稳定且快。 。由CPU循环模拟,占用大量CPU资源,速度慢且受其他中断影响。
可靠性 。硬件处理时序精确,抗干扰能力强。 较低。时序由软件延时保证,在复杂中断环境中容易出错。

详细配置代码对比

假设我们使用STM32F103系列芯片,操作I2C1,其硬件I2C引脚通常是PB6(SCL)PB7(SDA)

1. 硬件IIC配置

硬件IIC的配置分为两大步:配置GPIO配置I2C外设

c 复制代码
/* 硬件IIC引脚配置函数 */
void HW_I2C_GPIO_Config(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    
    // 配置I2C1 SCL (PB6) 和 SDA (PB7)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    // 关键区别:模式必须设置为 **复用开漏输出**
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度建议设置高一些
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/* 硬件IIC外设模式配置函数 */
void HW_I2C_Mode_Config(void) {
    I2C_InitTypeDef I2C_InitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); // I2C1时钟位于APB1总线
    
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = 0x00; // 作为主设备,此地址可任意,不冲突即可
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 400000; // 400kHz
    I2C_Init(I2C1, &I2C_InitStructure);
    
    I2C_Cmd(I2C1, ENABLE); // 使能I2C1
}

// 在主函数中,需要调用以上两个函数来完成完整初始化
void main() {
    ...
    HW_I2C_GPIO_Config();
    HW_I2C_Mode_Config();
    ...
}
2. 软件模拟IIC (Software IIC) 配置

软件IIC只需要配置GPIO,非常灵活。这里我们仍然使用PB6和PB7,但你完全可以换成PC0和PC1等其他引脚。

c 复制代码
// 首先进行宏定义,方便后续编程和修改引脚
#define SOFT_I2C_SDA_PORT    GPIOB
#define SOFT_I2C_SDA_PIN     GPIO_Pin_7
#define SOFT_I2C_SCL_PORT    GPIOB
#define SOFT_I2C_SCL_PIN     GPIO_Pin_6

#define SOFT_I2C_SDA_HIGH()  GPIO_SetBits(SOFT_I2C_SDA_PORT, SOFT_I2C_SDA_PIN)
#define SOFT_I2C_SDA_LOW()   GPIO_ResetBits(SOFT_I2C_SDA_PORT, SOFT_I2C_SDA_PIN)
#define SOFT_I2C_SCL_HIGH()  GPIO_SetBits(SOFT_I2C_SCL_PORT, SOFT_I2C_SCL_PIN)
#define SOFT_I2C_SCL_LOW()   GPIO_ResetBits(SOFT_I2C_SCL_PORT, SOFT_I2C_SCL_PIN)
#define SOFT_I2C_SDA_READ()  GPIO_ReadInputDataBit(SOFT_I2C_SDA_PORT, SOFT_I2C_SDA_PIN)

/* 软件IIC GPIO配置函数 */
void SOFT_I2C_GPIO_Config(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    // 配置SCL引脚为**通用开漏输出**
    GPIO_InitStructure.GPIO_Pin = SOFT_I2C_SCL_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 关键区别:通用开漏输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SOFT_I2C_SCL_PORT, &GPIO_InitStructure);
    
    // 配置SDA引脚,初始化为开漏输出。在读取时会临时切换为输入模式。
    GPIO_InitStructure.GPIO_Pin = SOFT_I2C_SDA_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 关键区别:通用开漏输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SOFT_I2C_SDA_PORT, &GPIO_InitStructure);
    
    // 将总线置于空闲状态(高电平)
    SOFT_I2C_SCL_HIGH();
    SOFT_I2C_SDA_HIGH();
}

// 之后,你需要用软件代码模拟I2C的时序,例如:
void SOFT_I2C_Start(void) {
    SOFT_I2C_SDA_HIGH();
    SOFT_I2C_SCL_HIGH();
    Delay_us(5);
    SOFT_I2C_SDA_LOW(); // Start condition: SDA falls while SCL is high
    Delay_us(5);
    SOFT_I2C_SCL_LOW();
}
// ... 还需要实现Stop、SendByte、ReceiveByte等函数

总结与选择建议

场景 推荐方案 理由
高速、高可靠性、多从机通信 硬件IIC 硬件处理效率高,不占用CPU,时序精确稳定。
引脚冲突,硬件IIC引脚被占用 软件IIC 可以灵活更换到其他任意引脚。
学习、调试、快速验证 软件IIC 配置简单,便于理解I2C协议本质,调试时可用逻辑分析仪抓波形。
项目初期,硬件设计未定型 软件IIC 即使后期硬件引脚变更,软件也只需修改宏定义,无需大改。
需要同时使用多个I2C总线 组合使用 STM32通常只有1-2个硬件I2C,可用硬件I2C操作主要设备,软件I2C操作次要设备。

核心记住一点:硬件IIC的引脚是芯片固定的,而软件IIC的引脚是你自己任选的。 硬件IIC需要配置外设模式,软件IIC只需要配置GPIO模式并为它们编写模拟时序的函数。无论是软件IIC抑或是硬件IIC都依赖于外部上拉电阻来确保线兼容性和可靠性,这个电阻通常可以取4.7K。

相关推荐
易享电子2 分钟前
基于单片机车窗环境监测控制系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
三佛科技-1341638421221 分钟前
LED氛围灯方案开发MCU控制芯片
单片机·嵌入式硬件·智能家居·pcb工艺
小莞尔1 小时前
【51单片机】【protues仿真】基于51单片机主从串行通信系统
c语言·单片机·嵌入式硬件·物联网·51单片机
Hello_Embed1 小时前
STM32 环境监测项目笔记(一):DHT11 温湿度传感器原理与驱动实现
c语言·笔记·stm32·单片机·嵌入式软件
三佛科技-134163842123 小时前
便携式榨汁机方案开发,榨汁机果汁机MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
yongui478343 小时前
基于TMS320F28027实现光伏MPPT控制
单片机·嵌入式硬件
炸膛坦客5 小时前
Cortex-M3 内核 MCU-STM32F1 开发之路:(一)单片机 MCU 的构成,包括 FLASH 和 SRAM 的区别,以及引脚类型
stm32·单片机·嵌入式硬件
A9better5 小时前
嵌入式开发学习日志39——stm32之I2C总线物理层与常用术语
stm32·单片机·嵌入式硬件·学习
三佛科技-187366133975 小时前
FT62FC3X 8位MCU单片机选型表,详细解析FT62FC31A/32A/33A/35A/3FA
单片机·嵌入式硬件
充哥单片机设计6 小时前
【STM32项目开源】基于STM32的智能衣柜系统
stm32·单片机·嵌入式硬件