This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 处理 NACK 错误

Guru**** 2538950 points
Other Parts Discussed in Thread: TM4C123GH6PM, TCA9535, TCA6424A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/905947/handling-nack-errors

器件型号:TM4C123GH6PM
主题中讨论的其他器件: IO-EXPANDER-EVMTCA9535TCA6424A

大家好、我在 Tiva C Launchpad TM4C123GXL 上使用 TM4C123GH6PM 、通过 I2C 与组装有 TCA6242A 和 TCA9535芯片的 IO-Expander EVM 连接。  我使用跳线将3.3V/GND 从 TivaC 连接到 IO-Expander EVM、因为 IO-Expander EVM 用于连接 MSP430 Launchpad、而分线接头/连接器不允许使用任何具有堆叠 I2C 功能的 TM4C123GH6PM GPIO 引脚 连接。 我的问题是、当我尝试发送 I2C 帧时、地址字节和数据字节会被 NACK。 我可以通过在 CCS 中单步执行我的代码并在调试寄存器窗口中监控 I2C1_MCS 寄存器来看到这一点。 这是我 要引用的 CCS 调试中的代码和寄存器窗口。

#include "TM4C123GH6PM.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_I2C1);
////等待 I2C0模块准备就绪。//
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C1)){}

//启用包含 I2C 的 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

//为端口 A6和 A7上的 I2C3功能配置引脚复用。
GPIOPinConfigure (GPIO_PA6_I2C1SCL);
GPIOPinConfigure (GPIO_PA7_I2C1SDA);

//为这些引脚选择 I2C 功能。
GPIOPinTypeI2CSCL (GPIO_Porta_base、GPIO_PIN_6);
GPIOPinTypeI2C (GPIO_Porta_base、GPIO_PIN_7);


////初始化主设备和从属设备//
I2CMasterInitExpClk (I2C1_base、SysCtlClockGet ()、false);
///指定从器件地址//
I2CMasterSlaveAddrSet (I2C1_base、0x23、false);
////将要发送的字符放入数据寄存器//
I2CMasterDataPut (I2C1_base、0x08);
////开始将字符从主控方发送到从属方//
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_SEND);
while (I2CMasterBusy (I2C1_base)){}

返回0;
} 

I2C1_MCS 寄存器 在该函数调用完成后将这些位置为有效:

I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_SEND);

我认为我的问题是由于通道中的噪声。 我认为这是因为以下原因:

1) 1)我已经尝试过 MSP430评估。 可控制具有 GUI 驱动器和 IO 扩展器的板、切换 LED 以进行验证。 虽然通过分线接头/连接器连接时 MSP430评估板可与 IO 扩展器评估板配合使用、但使用跳线时通信不起作用。 我已通过原理图、布局文件和数字万用表测试验证所有设置上的引脚是否正确连接。 由于已知的工作设置中的信号路径较短、而跳线(6英寸) 不工作、这向我表明、差异是一个有噪声的通道、当使用跳线实现时、MSP430/TIVAC 上的噪声通道将是相同的。

2) 2)我已通过数据表验证了在 TCA6424A 上获取 NACKED 的地址、以及将与 GUI IO 扩展器 Eval 一起使用的 MSP430评估源代码。 当 作为参数传递到地址集函数时、可执行文件应具有值0x23。

我还尝试在评估时与 TCA9535通信。 没有成功。

现在、由于我在地址上得到了 NACKED、所以我对帧的其余部分不是很担心。 但我尝试发送整个帧、但没有成功。

我没有可用的示波器来验证我的噪声通道理论或位流。

 我经常看到使用跳线实现类似这样的简单 I2C。 我在其中一个 TI 论坛中看到了一个、有人在其中连接到 IO Eval。 有问题的电路板、具有跳线和 RPI。 因此、我认为这是可能的。

我的描述和发布的代码中是否有任何内容可供大家认为是一个潜在的问题、需要在不良的物理 I2C 通道之外进行改进?

通过检测 NACK 并基本上重置消息并再次发送直到 NACK 来处理有噪声的通道是否不可取或不可能?

我一直在尝试为此程序开发错误处理代码、在该代码中检测 AddressNACK 并 停止通信并重新发送消息。 目前我正在尝试这样的方法、但没有成功、I2C_MCS 中的停止位和开始位似乎都保持启用状态、无论发生什么情况。 我检查了总线监控寄存器、SCL 没有被从器件保持在低电平。

此外、i2c 评估板上还为 SDA/SCL 线路提供4.7K 上拉电阻。

uint32_t ERROR_STATUS = 0x01;

while (error_status|I2CMasterBusy (I2C1_base)){
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_SEND);
if (I2CMasterErr (I2C1_base))
{
I2CMasterIntClear (I2C1_base);
while (I2CMasterIntStatus (I2C1_base、true)){}
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
}
其他
{
ERROR_STATUS =0x00;
}
} 

我在中断处理程序之外使用了 I2CMasterIntClear (),因为我想使用这样一个简单的程序,忙/等待的实现对我来说会更容易,并且在尝试实施 ISR 时更明智。

非常感谢您花时间在这里为我提供帮助、我对此表示感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、

     这是完整的 main()吗? 我看不到您使用 SysCtlClockSet()配置系统时钟。 请参阅下面的 Tivaware I2C 示例 /examples/peripherals/i2c. 添加 SysCtlClockSet (...)后、请告诉我它能解决您的问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在使用默认设置、 因此我的 SysClock 为16MHz (如下所示)。 很抱歉更新迟到了、但我觉得我发现了导致我的地址获取 NACKd 的问题。 我正在努力充分界定我的假设导致了这一问题,并确定问题是什么,然后,一旦我完全解决了问题,我将更新论坛,以将其标记为已解决。 感谢您的建议 Charles。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、

     请告诉我们您的调试进度。 除了默认情况下您正确的系统时钟是使用 PIOSC 的16MHz 之外、我不会发现您的代码有任何错误。 您还说过、在 SDA 和 SCL 总线上有适当的上拉电阻器。 因此您的硬件似乎也可以。 但是、要真正了解发生了什么并帮助您进行调试、您确实需要具有示波器或逻辑分析仪。