You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PIC32MK与PCF8574扩展I2C LCD通信时SCL线持续低电平问题

PIC32MK1024与PCF8574扩展LCD通信SCL持续低电平排查方案

一、代码层面的直接问题修正

1. 修复I2C引脚的ANSEL配置冲突

在I2C__initialization函数中,你已针对I2C引脚(RG7、RG8)设置ANSELG = 0xFFFFFE7F,但main函数里又执行ANSELG = 0x00000000,这会覆盖之前的配置,导致I2C引脚的模拟功能被错误启用。修改main函数中的ANSELG设置:

ANSELG = 0xFFFFFE7F; // 替代原来的ANSELG = 0x00000000,保留I2C引脚的数字模式

2. 完善I2C时序等待逻辑

当前I2C操作函数未等待START/STOP/发送完成,这是SCL锁死的核心原因之一:

  • I2C__Start函数:设置SEN=1后,必须等待SEN位自动清零(表示起始条件发送完成)
    void I2C__Start(void){
        I2C__state();
        I2C1CONbits.SEN = 0b1;
        while(I2C1CONbits.SEN); // 等待起始条件执行完成
    }
    
  • I2C__Stop函数:同理,等待PEN位清零
    void I2C__Stop(void){
        I2C__state();
        I2C1CONbits.PEN = 0b1;
        while(I2C1CONbits.PEN); // 等待停止条件执行完成
    }
    
  • I2C__Write函数:调整等待顺序,确保发送完成后再执行下一步
    void I2C__Write(uint8_t I2C_data){
        I2C__state();
        while(I2C1STATbits.TBF); // 等待发送缓冲区为空
        I2C1TRN = I2C_data;
        while(I2C1STATbits.TRSTAT); // 等待当前字节发送完成
        // 可选:检查应答位,用于调试
        if(I2C1STATbits.ACKSTAT){
            // 未收到应答,可添加错误处理逻辑
        }
    }
    

3. 补充LCD初始化流程

PCF8574扩展的16x2 LCD必须先完成初始化(如4位模式设置、显示开启),直接发送字符会导致LCD进入异常状态,可能触发总线锁死。添加初始化函数:

void LCD_Init(void){
    delay_ms(50); // 等待LCD上电稳定
    // 发送初始化序列(PCF8574一般BIT7为背光控制位)
    I2C__Start();
    I2C__Write(MASTER_WRITE_LCD_BLUE);
    // 4位模式初始化步骤
    I2C__Write(0x00);
    delay_ms(5);
    I2C__Write(0x00);
    delay_ms(1);
    I2C__Write(0x00);
    delay_ms(1);
    I2C__Write(0x20); // 设置4位模式
    delay_ms(1);
    // 配置显示参数
    I2C__Write(0x28); // 4位模式、2行显示
    delay_ms(1);
    I2C__Write(0x0C); // 开显示、关闭光标
    delay_ms(1);
    I2C__Write(0x06); // 光标自动右移
    delay_ms(1);
    I2C__Write(0x01); // 清屏
    delay_ms(2);
    I2C__Stop();
}

在main函数的I2C初始化后调用LCD_Init();。

4. 修正I2C波特率计算

你的CPU时钟为8MHz,100kHz波特率对应的I2C1BRG值需按公式计算:
I2C1BRG = (FPB / (2 * Fscl)) - (FPB / 10000000)
代入数值得:(8000000/(2*100000)) - 0.8 = 39.2,取整为0x27(39)。当前设置的0x10(16)会导致速率远超100kHz,超出PCF8574规格,引发总线异常。修改:

I2C1BRG = 0x27; // 对应8MHz FPB下的100kHz速率

二、硬件与调试层面的排查方向

  • 示波器捕捉完整I2C时序:确认SCL拉低发生在起始条件后、地址发送时还是数据发送阶段,观察应答位波形,判断是主设备未释放SCL还是从设备异常拉低。
  • 检测总线空闲状态:程序启动未触发I2C操作时,测量SCL/SDA电平是否为3.3V(由上拉电阻拉高),若此时SCL已低,检查主设备引脚是否被错误配置为输出低。
  • 替换PCF8574模块:个别模块可能存在内部短路或损坏,尝试替换排除硬件故障。
  • 检查电源稳定性:用示波器测量LCD的5V供电和PIC的3.3V供电,确认无明显纹波或压降,电源波动可能导致设备异常拉低总线。

内容的提问来源于stack exchange,提问作者Vilius Žalėnas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:45:49