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.

[参考译文] CCS/TM4C129XKCZAD:未连接时的 TM4C129 I2C 句柄

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/618884/ccs-tm4c129xkczad-tm4c129-i2c-handle-when-unconnected

器件型号:TM4C129XKCZAD
主题中讨论的其他器件:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

我在 TM4C129X 开发板上工作、我通过 I2C 将电源序列发生器 UCD 连接到该开发板

我的目的是检查接口是否是我尝试读取芯片组的器件 ID 和运行 ID 的接口。 正常情况下、我能够通过 I2C 与 UCD 芯片组通信。

当我从 I2C 上断开芯片连接时、我面临两个问题

这是我处理的代码

/********* /

   I2CMasterSlaveAddrSet (I2C1_base、UCD_I2Cadr、false);// 写入 ucd addr
   I2CMasterDataPut (I2C1_base、ui8Command);//将命令放置到 I2C1
   I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);//发送
   while (!I2CMasterBusy (I2C1_base));
   while (I2CMasterBusy (I2C1_base)); //检查 I2C 主设备是否占线、因此等待
   if (I2CMasterErr (I2C1_base)!= I2C_MASTER_ERR_NONE)
   {
   返回 false;
  }

/******* /

问题1:当 I2C 引脚悬空时、例如没有上拉电阻

我观察到代码在语句中挂起

"while (I2CMasterBusy (I2C1_base)); //检查 I2C 主设备是否忙、因此等待"'

该怎么办?

问题2:当 I2C 从 UCD 断开但具有上拉电阻时

I2CMasterErr (I2C1_base) 不会导致错误!!

但是

"I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);//发送"

在示波器上、我只能观察到9个时钟周期、实际情况是应该有18个周期(ADDR &&命令")

这种情况下如何确定接口中是否有错误?

这样做的正确方法应该是什么??

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不认为 I2C 接口被设计成像 USB 那样进行连接和断开。 TM4C1294是总线上的唯一主器件吗? 如果是,可以调用 I2CMasterLineStateGet ()以检查是否附加了上拉电阻器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、请注意-正如您和我经常建议的那样-在任何时候都必须使用(适当的)外部上拉电阻器。 任何基于 I2C 的器件的"I2C"引脚悬空都偏离了"最佳实践"-这并不是"正常"、也不推荐!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的目标是测试硬件、以便我能够识别可能的故障!! 所以我正在模拟各种情形...第二个问题是什么?? 不会发生 NACK 错误??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rakesh、

    我认为、如果您想尝试此类测试、您应该设法了解 I2C 的工作原理。 例如、本应用手册是一个很好的开始位置: www.ti.com/.../slva704.pdf

    第2.3节中的注释:"数据的每个字节(包括地址字节)后面跟随一个来自接收器的 ACK 位。" -这意味着当您断开从设备连接时,发送地址字节后,主设备将无法接收 ACK 位,因此会挂起。

    如果要测试硬件、应使用逻辑状态分析器、并在连接了两个器件的情况下调试 I2C 引脚、并监控它们之间的通信。

    此外、在您了解基础知识后、以下是专门针对 TM4C 的应用手册: http://www.ti.com/lit/pdf/spma073

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不确定的逻辑状态证明(很少)您的朋友。 还建议您阅读"更旧、更正式的"I2C 规范(迄今为止一直保持沉默)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    这就是我想提出的问题 请了解我能够与接收器建立通信/交换数据并通过 I2C 对其进行编程。 我的目标是创建一个代码来测试接口(POST 排序),以确保接口正常工作.... 因此,我尝试针对可能发生的错误情况执行模拟方案...因此,如果发生错误,我可以向硬件测试团队报告 I2C 接口的问题...

    问题2:当接收器不存在或 Addr 不匹配或 I2C 线路损坏时

    如果我尝试在没有接收器的情况下执行 I2C 周期、请执行以下代码

    /********* /

       I2CMasterSlaveAddrSet (I2C1_base、UCD_I2Cadr、false);// 写入 ucd addr
       I2CMasterDataPut (I2C1_base、ui8Command);//将命令放置到 I2C1
       I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);//发送
       while (!I2CMasterBusy (I2C1_base));
       while (I2CMasterBusy (I2C1_base)); //检查 I2C 主设备是否占线、因此等待
       if (I2CMasterErr (I2C1_base)!= I2C_MASTER_ERR_NONE)
       {
       返回 false;
      }

    /******* /

    我期待的

     I2CMasterErr()将返回一个错误,并且我可以使用 false 退出代码.... 我可以使用它来检测 I2C 中的故障...在本例中,代码不返回 false ...

     if (I2CMasterErr (I2C1_base)!= I2C_MASTER_ERR_NONE)
       {
       返回 false;
      }

    I2CMasterErr (I2C1_base)返回 I2C_MASTER_ERR_NONE……

    这意味着(地址和数据)有一个正确的应答...没有接收器就没有应答!!

    实际情况应导致 I2C_MASTER_ERR_ADDR_ACK……的应用

    我使用示波器探测 I2C 接口,UC 仅发出 addr,不会输出数据,这意味着没有对 addr...

    这可能是什么原因??...

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

    [引用 user="Rakesh Muralidharan"]我使用范围的 I2C 接口,UC 仅发布 addr,不会输出数据

    当您声称(必要)"I2C 上拉"已被删除/失败时、μ µC 如何能够发出"逻辑正确级别"从地址?   这是不一致的-不是吗?

    您应该记得、API 包括非常简单的函数、"监控 I2C 线路状态"-这难道不是检测"故障或缺失"(但必要)上拉电阻器的速度要快/容易得多的方法吗?

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

    "问题2:当 I2C 从 UCD 断开但具有上拉电阻时"

    请记住上拉问题...在第2个案例中,我重新加了上拉,但没有接收器...

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

    再次-"detail-lite!" 在很大程度上取决于上述上拉电阻器移除和重新插入的"时间"、这种细节(无任何披露)...

    通常、在"拆卸和插入"此类(必要)组件时、必须(部分)采取巧妙的做法、而器件保持(假设)"在功率下"。   再说一次-这是未描述的...  "重型"上拉"插入/移除"已被视为"锁定或锁住"从器件-或(甚至)混淆 MCU!   所有这些可能性都必须加以研究和解决、然后才能得到适当实施...

    请注意-如果在从器件"存在并通电"时继续进行此类测试-此时如何证明 "没有接收器(从器件)存在"?   从器件本身是否可能对您的测试做出反应、并可能(进一步)使您的测试变得复杂(甚至是复杂)。   此类测试必须更有条理-请注意您最近发布的文章"Plz 忘记上拉问题"-在发现流程的严重描述缺陷后发布。   (µC 有效的发送地址-没有任何上拉-现在应该"忘记了!"   这样做并不能说明对测试设计和执行的规划或信心-是吗?)   我的感觉是、您"有能力设计这样的测试"-但"太匆忙了"、无法设计一个系统且逻辑上有效的-包含从器件的测试...

    此外- 飞利浦发布的原始(正式/指导) I2C 规范涵盖了带有"不存在接收器"的"测试"。   (稍后到达 I2C 的"采用者"(即此处)可能偏离了该规范-增加了您的挑战...)

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

    我认为我应该单独启动两个单独的线程来解决每个问题...这可以避免混淆

    这两项试验都是单独进行的,没有对一项进行任何依赖。。

    现在我明确说明了这一点,让我们集中讨论第二个问题:接收器不在...

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

    在(更正确的)不存在"从器件" (不会始终是接收器) 的情况下-由于存在上拉电阻器、两条 I2C 信号线路都应"线路测试"为高电平。   在过去的测试中、我的公司设计用于测试(更快的 ARM MCU)、我们验证了(预期)当每个 I2C 引脚独立"被驱动为低电平"时、"电压电平结果"。    (这是通过 GPIO 的"备用集"-配置为"开漏"-能够有效地"下拉"来实现的。)    另请注意、每个 I2C 信号线的缓冲版本都路由到 MCU 的 ADC -该电压测量值确认上拉电阻(两者)"存在且正确"。

    减去任何从器件-您应该能够测试"不适当的线路电容"-或者 I2C 信号线路到电源或接地短路。

    和一个、"自由 MCU GPIO 对"-可"连接"从器件的 I2C PCB (信号封装引脚)-从而确认"PCB 的信号路径"(本身)完好无损 且正确。   然后、这些 GPIO 必须(恢复)为"输入"、以免妨碍"正常"I2C 操作。

    公司/我在过去几年做过-面向大得多的客户。  (随着他们继续与我们互动、这种测试似乎已达到他们的期望...)

    [编辑] 08:31 -我还记得我们使用了第二个微型 MCU -连接到一个小"钉子床"(连接到客户端的"I2C"总线) 与客户端的板载 MCU 配合使用、可实现比客户端(单个)板载 ARM MCU 更详细的测试。   (例如、显然是"您的"状况-以及...)

    也许(现在)可以授予"验证答案"?   (时间/努力->详细信息... 为您奉献...)

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

    对于问题1、此时不存在上拉电阻

    “如果是,可以调用 I2CMasterLineStateGet ()以检查是否附加了上拉电阻。”

    因为 Tiva 是唯一的主器件..... 我用 I2CMasterLineStateGet ()在板上尝试了这种方法,但部分成功...

    //******* //

    布尔
    I2C_Test_Pullup (uint32_t ui32Base)

       bool lbool_Status;
       uint32_t ltest;
       ltest = I2CMasterLineStateGet (ui32Base);
       如果(ltest = 0x00000003)
           {
           lbol_Status = true;
           }
       其他
           {lbool_Status = false;

           }
       返回 lbool_Status;

    /******** /

    在我的案例中 ,由于存在时钟上拉和数据上拉不起作用(泡沫)... I2CMasterLineStateGet (ui32Base)返回0x00000003...

     """在过去的测试中、我的公司设计用于测试(更快的 ARM MCU)、我们验证了(预期)当每个 I2C 引脚独立"驱动为低电平时"产生的"电压电平"。    (这是通过配置为"开漏"的 GPIO 的"备用集"实现的、能够有效地"下拉")。

    根据上述信息、我尝试了

    I2C 上拉电阻值2.2K。在初始化 I2C 之前。

    将 I2C 时钟和数据 GPIO 初始化为输入

    2.配置弱下拉

    3.读取 GPIO 值并检查是否存在故障

    4.禁用 GPIO 外设

    /******** /

    布尔
    I2C_Test_Pullup (void)

       bool lbool_status;
       uint32_t luint32_gpioRead;
       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
       while (!(SysCtlPeripheralReady (SYSCTL_Periph_GPIOG)));
       /*
        *启用弱下拉以实现
        *

       GPIOPinTypeGPIOInput (GPIO_PORTG_base、GPIO_PIN_1_GPIO_PIN_0);
       GPIOPadConfigSet (GPIO_PORTG_base、GPIO_PIN_1|GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPD);
       SysCtlDelay (5); //延迟
       /*
        *
        *
       luint32_GpioRead = GPIOPinRead (GPIO_PORTG_base、GPIO_PIN_1_GPIO_PIN_0);

       if (luint32_GpioRead = 3)
       {
           lbol_status = true;
       }
       其他
       {
           lbool_status = false;
       }

       SysCtlPeripheralDisable (SYSCTL_Periph_GPIOG);
       SysCtlDelay (5); //延迟
       返回 lbool_status;

    这似乎提供了一致的结果. 配置 GPIO 外设 并在稍后 重新配置 GPIO 影响尚未检查!!

     

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

    "2.3节中的注释:"数据的每个字节(包括地址字节)后跟一个来自接收器的 ACK 位。" -这意味着当您断开从设备连接时,发送地址字节后,主设备无法接收 ACK 位,因此会挂起。""

    我同意,我试图提供信息的方式造成了混乱......

    当从设备不存在时,UC 不会挂起... 它在执行时不指示 NACK 错误...我的理解是,如果 从器件不提供确认,主器件将生成 NACK 错误...

    /********* /

       I2CMasterSlaveAddrSet (I2C1_base、UCD_I2Cadr、false);// 写入 ucd addr
       I2CMasterDataPut (I2C1_base、ui8Command);//将命令放置到 I2C1
       I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);//发送
       while (!I2CMasterBusy (I2C1_base));
       while (I2CMasterBusy (I2C1_base)); //检查 I2C 主设备是否占线、因此等待
       if (I2CMasterErr (I2C1_base)!= I2C_MASTER_ERR_NONE)
       {
       返回 false;
      }

    /******* /

    我原本希望以下语句  将返回错误、但并未发生。 没有"return false;"UC 开始执行以下语句

    if (I2CMasterErr (I2C1_base)!= I2C_MASTER_ERR_NONE)
       {
       返回 false;
      }

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

    感谢您-请注意、您的"专注度更高"已实现(更好)响应-并且(希望)将"延续"您的工作的其他方面...

    "背靠背"(首先不是忙-然后是忙)对于您的设备而言是(高度)非常规("附加组件")(声称有"修复")、但可能会导致您注意到的漏洞。    IIRC (更简单)"4C123"制成、"无此类非传统/基质 SW 需求-并实现了"NAK"测试...

    遵循此处提供的指南和建议(已经)提高了您的 I2C 测试能力-"修复"供应商的 MCU 超出了我们的兴趣/能力...

    [编辑] 由于该 MCU 的高速运行(仍远低于其他竞争对手的运行速度)被认为:  "已导致套头"背靠背测试"-也许您的"I2C 测试"可以在"降低的系统时钟速度"下执行-这可能会消除"套头测试"-并使您的 NAK 能够"闪耀!"    (也许)   (所以应该是被禁止的“相似”——又一个可怕的!)

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

    您好!

    以下线程引用了中的错误

    “使用 I2CMasterErr()有一个已知的勘误表--它尝试从 I2CMCS 获取状态,但当 BUSY 被复位时,tm4c1294ncpdt 至少将复位 ADRACK 和 DATACK 位,因此您需要从 I2CMRIS 读取。 ""

    我创建了一个新的错误函数

    /******* /

    内部

    I2C_Error_check (uint32_t ui32Base)

        uint32_t ui32Err;

        //

        //获取原始错误状态

        //

        ui32Err = HWREG (ui32Base + I2C_O_MRI);

        //

        //检查错误。

        //

        IF (ui32Err &(I2C_MRI_NACKRIS))

        {

          返回(I2C_MASTER_ERR_ADDR_ACK);

        }

        其他

        {

          返回(I2C_MASTER_ERR_NONE);

        }

    /***** /

    那么、我的原始代码看起来是什么样的

    /********* /

       I2CMasterSlaveAddrSet (I2C1_base、UCD_I2Cadr、false);// 写入 ucd addr
       I2CMasterDataPut (I2C1_base、ui8Command);//将命令放置到 I2C1
       I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);//发送
       while (!I2CMasterBusy (I2C1_base))
       while (I2CMasterBusy (I2C1_base)); //检查 I2C 主设备是否占线、因此等待
       if (I2C_Error_check (I2C1_base)!= I2C_MASTER_ERR_NONE)
       {
           返回 false;
       }

    /********* /

    这似乎在当前是有效的…

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

    适合您-始终"最新"勘误表必须"搜索、找到并遵循"。

    值得注意的是、其他 MCU 的运行速度提高了50%以上、它们"避开了"这种"背靠背"(非常规/附加) I2C 繁忙检查...

    对于"检查到从器件的 I2C 信号路径的完整性"的能力、您是"静默"。   回顾一下、客户发现最有用的-如果该路径"有缺陷"-您的所有测试均已被破坏-是否没有?