之前碰到的一些I2C问题,提供有关解决常见 I2C 问题的指南。
作为 I2C 主设备运行的PIC单片机 ,生成一个启动条件以开始 I2C 数据传输。如果没有生成启动条件,则说明设置有问题。
- 检查 I2C 引脚(SDA 和 SCL)是否设置为数字输入。默认情况下,引脚可能具有模拟功能,需要配置为数字模式。这些引脚也可能被错误地配置为源代码中的输出。有关配置管脚的更多信息,请参阅这篇文章:http ://microchipdeveloper.com/8bit:emr-digital-io
- I2C 总线必须处于空闲状态,I2C 外设才能生成启动条件。这意味着 SDA 和 SCL 线都必须处于高电平状态。在 PIC 尝试生成启动条件时,查看示波器上的引脚信号以验证它们是否处于此状态。如果 I2C 线路未处于空闲高电平状态,则可能是总线上的某些东西将引脚拉低,或者缺少所需的上拉电阻。
- I2C 外设必须处于主机模式才能生成启动条件。检查 I2C特殊功能寄存器 (SFR)以确保外设设置为 I2C 主模式。
注:如果 PIC 单片机在 I2C 总线未就绪或未正确配置引脚时尝试生成启动条件,这将导致总线冲突,并且 I2C 相关的 BCL 或 BCLIF 位将设置为“1” SFR。并非所有 PIC 单片机都有这个位,这取决于所使用的设备。
问题 #2:没有为 I2C 地址提供 ACK
I2C 从机在接收到来自主机的有效 I2C 地址字节时将生成确认 (ACK),否则将生成非确认 (NACK)。
- 在示波器上查看 I2C 信号以验证主机发送的地址。I2C 从设备的数据表通常会有一个显示 I2C 地址的示例波形,可以将其与示波器上看到的波形进行比较。
- 如果 PIC 是不生成 ACK 的 I2C 从机,请使用调试器运行代码并检查地址寄存器(通常标记为 SSPADD 或 I2CADD),看看那里存在什么值。由于地址字节还包含位置 0 处的 R/W 位,因此可能需要移动地址值以解决此问题。此外,在 SFR 中验证 I2C 外设是否设置为从模式。
问题 #3:读取或写入操作未按预期工作
在某些情况下,I2C 主机读取或写入操作可能无法正常工作,即使在 I2C 总线上可以看到活动并且 I2C 代码没有阻塞。
当程序在执行下一个操作之前没有等待 I2C 操作完成时,可能会发生这种情况。I2C 操作(START、STOP、字节写入等)没有排队。程序必须确保当前操作在开始下一个操作之前完成,否则可能会错过部分 I2C 事务。一种方法是检查 I2C 中断标志,该标志在每个操作完成时设置为“1”。通过检查该标志,程序可以确定当前的 I2C 操作已完成。
当程序在执行下一个操作之前没有等待 I2C 操作完成时,可能会发生这种情况。I2C 操作(START、STOP、字节写入等)没有排队。程序必须确保当前操作在开始下一个操作之前完成,否则可能会错过部分 I2C 事务。一种方法是检查 I2C 中断标志,该标志在每个操作完成时设置为“1”。通过检查该标志,程序可以确定当前的 I2C 操作已完成。
以下是有关如何识别问题的一些建议。
- 在示波器上查看 I2C 信号以了解总线上发生的情况。可能不是所有字节都在总线上发送,或者事务的某些部分丢失。图 1 和图 2 显示了这方面的一个示例。图 1 显示了总线上的字节0xA0、0x12、0x34、0x56 。图 2 显示缺少字节0x12 。如果 I2C 事务的某些部分丢失,则完整传输将不会成功。
图 1:预期的 I2C 数据传输
图 2:数据传输中缺少数据字节0x12
检查 SFR 中的 I2C 错误标志。使用MPLAB® ICD3等调试器,可以在MPLAB X IDE中检查 SFR 值。当 I2C 外设出现问题时,会有一些错误标志来指示问题发生的位置。
WCOL:写冲突检测位
图 3:WCOL 错误标志
当 I2C 条件对开始传输无效时,尝试写入 SSPBUF 寄存器。
SSPOV:接收溢出指示位
图 4:SSPOV 错误标志
当 SSPBUF 寄存器仍保存前一个字节时接收到一个字节。
BCLIF:MSSP 总线冲突中断标志位
图 5:BCL 错误标志
检测到总线冲突。
- 使用备用 I/O 引脚指示程序中何时发生事件。事件发生时切换引脚,并在示波器上查看此引脚以及 I2C 信号。这将有助于验证程序是否在应启动 I2C 操作时启动。
图 6:使用备用 I/O 引脚显示事件何时发生
概括
- 查看示波器上的 I2C 引脚以了解发生了什么。
- 检查 I2C 寄存器 (SFR) 值以查看是否设置了任何错误标志。
- 使用备用 I/O 引脚查看 I2C 事件何时发生。
来源:电子资料库