PAYATHON 2026

TM4C1294 LaunchPad 的 I2C 无时钟输出,如何排查?

数据小陈

结论

从贴出的初始化代码看,首先要检查的是 I2CMasterInitExpClk() 之后是否调用了 I2CMasterEnable()。设置时钟和波特率不会自动启用 I2C 主控。补上使能后,观察 PB2/SCL 是否出现时钟。

I2CMasterInitExpClk(I2C0_BASE, g_sysclk, false);
I2CMasterEnable(I2C0_BASE);

如果仍没有 SCL 活动,再确认引脚是否配置为 I2C0、事务是否已经发起,以及代码是否检查总线错误。

启用 I2C 主控并检查错误

可以在现有初始化函数末尾添加主控使能:

void I2C0_Init(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB)) {}

    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C0)) {}

    GPIOPinConfigure(GPIO_PB2_I2C0SCL);
    GPIOPinConfigure(GPIO_PB3_I2C0SDA);
    GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);
    GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);

    I2CMasterInitExpClk(I2C0_BASE, g_sysclk, false);
    I2CMasterEnable(I2C0_BASE);
}

每次传输结束后,先检查主控错误状态,再读取数据或执行下一步。否则,即使总线上没有应答,程序也可能继续读取数据,并把无效结果当作传感器数据。

I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
while (I2CMasterBusy(I2C0_BASE)) {}

uint32_t err = I2CMasterErr(I2C0_BASE);
if (err != I2C_MASTER_ERR_NONE) {
    // 记录错误并停止本次传输
}

接收命令也应在等待结束后检查错误。如果目标设备没有应答,应先处理错误,再读取数据或发送后续命令。

按顺序确认引脚和总线

  1. 先测一笔简单写入。初始化后,向 MCP9808 的 0x18 地址发送寄存器指针 0x05,用示波器同时观察 SCL 和 SDA。确认主控已使能后,如果仍没有 SCL,再检查是否调用了预期的 I2C0_Init()、I2C0_BASE 是否正确,以及 PB2/PB3 是否连接到板上对应的引脚。
  2. 确认引脚复用配置。代码将 PB2、PB3 配置为 I2C0 的 SCL、SDA。PCTL 读数 0x00002200 与两个引脚各使用复用值 2 相符。仅凭这个读数,不能认定寄存器写入失败。还要确认读数来自预期端口,并且是在初始化代码运行后读取的。
  3. 检查扫描程序是否判断 NACK。扫描结果显示所有地址都有设备响应,并不能证明每个地址都接有从设备。由于没有提供扫描代码,无法判断它的判断条件。应确认程序根据每笔传输后的错误状态区分 ACK 和 NACK。
  4. 确认上拉和共地。输入材料提到 SCL、SDA 空闲时均为高电平,且扩展板带上拉。还要确认 LaunchPad 与扩展板共地,并直接观察总线上的实际波形。

代码通过 I2CMasterSlaveAddrSet() 使用 7-bit 地址 0x18 表示 MCP9808。调试时应保持地址表示方式一致,在确认 API 约定前不要额外左移地址。

MCP9808 温度解析还有一处问题

当前代码先执行 msb &= 0x0F,再检查 msb & 0x10。高四位被掩掉后,0x10 位已经清零,因此后面的负温判断永远为假。这会导致温度换算错误,但无法解释 SCL 完全没有活动。

应先根据 MCP9808 的寄存器格式检查符号位,再按数据手册提取温度字段。收到有效的两字节数据之前,不要用当前计算结果判断 I2C 通信是否正常。

建议的排查顺序

先添加 I2CMasterEnable(I2C0_BASE) 并观察 SCL,再检查每笔传输的 I2CMasterErr(),确认扫描程序只报告得到 ACK 的地址。如果仍没有时钟,核对实际使用的 I2C 实例和板上引脚连接,并确认初始化代码运行到了主控使能处。总线收到有效应答后,再修正 MCP9808 的温度解析逻辑。

备注:内容仅供参考。