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.

[参考译文] TM4C1294NCPDT:RTOS I2C 驱动程序:需要使用不同的 I2C 总线(枚举中定义的除外)

Guru**** 2391415 points
Other Parts Discussed in Thread: EK-TM4C1294XL, TMP006, TCA9555, TM4C1292NCPDT, TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1266080/tm4c1294ncpdt-rtos-i2c-driver-need-to-use-a-different-i2c-bus-other-than-defined-in-enum

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:TMP006TCA9555TM4C1292NCPDT、EK-TM4C1294XL

您好!

我有一个针对我的项目的运行参考代码、在其中3个不同的 I2C 总线被用于运行项目、即 I2C1、I2C2、I2C9总线、它们在枚举中定义如下:

typedef enum EK_TM4C1294XL_I2CName {
    EK_TM4C1294XL_I2C1 = 0,
    EK_TM4C1294XL_I2C2,
	EK_TM4C1294XL_I2C9,

    EK_TM4C1294XL_I2CCOUNT
} EK_TM4C1294XL_I2CName;

但是、如果我想使用附加的 I2C 总线、即 I2C5、而不干扰现有的 I2C 通信(即 I2C1、2和9)、我该怎么做? 它未在枚举中定义。

RTOS 中的用法如下:

 stI2cConfig.vui8I2cBus = Board_I2C9;

其中  

#define Board_I2C1 EK_TM4C1294XL_I2C1
#define Board_I2C2 EK_TM4C1294XL_I2C2
#define Board_I2C9 EK_TM4C1294XL_I2C9

上述内容在 Board.h 文件中定义、而 I2C5总线未定义。

请帮助实现 I2C5通信。

此致、

Kiran

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

    您好!

    另一个类似的问题是启用或禁用中断的命令。 与当前正在工作的项目一样、在已定义的引脚中清除、禁用和启用中断的命令为:

     GPIO_disableInt(BOARD_PORTF_PIN0);
     GPIO_clearInt(BOARD_PORTF_PIN0);
     GPIO_enableInt(BOARD_PORTF_PIN0);

    其中、Pf0在 Board.h 中定义为  Board_PORTF_PIN0。 但是、如果我们要使用 Board.h 中未定义的其他中断引脚、例如、我需要在3个不同的中断处理程序中使用引脚 PQ1、PP3和 PM4、并且我想要清除。 在各自的中断处理程序中禁用和启用这些引脚上的中断与上述预定义引脚的代码片段类似、对于未预定义的引脚、为了实现类似的目的、我应该使用什么命令?

    此致、

    Kiran

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

    您好!

     您需要将 I2C5添加到 EK_TM4C1294XL_I2CName。 有关详细信息、请参阅 TI-RTOS 用户指南第5.2.2节。  https://www.ti.com/lit/pdf/spruhd4

     另外、请看一下 TI-RTOS I2C TMP006示例。 在本例中、它仅使用 I2C7和 I28。 通过将此示例与您的当前代码进行比较、您将了解在何处以及如何添加另一个 I2C 对象。  

    其中引脚 PF0在 Board.h 中定义为  Board_PORTF_PIN0。 但如果我们要使用未在 board.h、
    中定义的额外中断引脚、

    另请参阅用户指南和 GPIO 示例。  

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

    尊敬的 Charles:

    感谢您的答复。

    我尝试了以示例代码中给出的方式实现、但我遇到了一个问题、即对于 TCA9555 IO 扩展器 IC、我已将前12位声明为输入、我需要在微控制器中获得中断信号、但 IC 不会生成中断信号。

    下面是 TCA9555 IC 的初始化代码片段,其中

    #define DI_SLAVEADDRESS2      0x26

        stI2cConfig.ui8regaddr = 0x06;
        stI2cConfig.vui8slaveAddress =  DI_SLAVEADDRESS2;
        stI2cConfig.vui8I2cBus = Board_I2C9;
        aui8txBuffer[0] = 0x06;
        aui8txBuffer[1] = 0xFF;
        aui8txBuffer[2] = 0x0F;
        stI2cConfig.pui8txbuffer = aui8txBuffer;
        stI2cConfig.pui8RxBuffer = aui8rxBuffer;
        stI2cConfig.vui8writeCount = 3;
        stI2cConfig.vui8readCount = 0;
        ioc_DII2CTransfer(&stI2cConfig);
    
        /* Writing Source Sink Configuration to output registers port1 */
        stI2cConfig.ui8regaddr = 0x03;
        stI2cConfig.vui8slaveAddress =  DI_SLAVEADDRESS2;
        stI2cConfig.vui8I2cBus = Board_I2C9;
        aui8txBuffer[0] = 0x03;
        aui8txBuffer[1] = ~((Source_Sink_Sel2 << 2) | (Source_Sink_Sel2 << 3)| (Source_Sink_Sel2 << 4)| (Source_Sink_Sel2 << 5)) & 0xF0;
    
        stI2cConfig.pui8txbuffer = aui8txBuffer;
        stI2cConfig.pui8RxBuffer = aui8rxBuffer;
        stI2cConfig.vui8writeCount = 2;
        stI2cConfig.vui8readCount = 0;
        ioc_DII2CTransfer(&stI2cConfig);
    

    以下是该 EVM 的

    2个 I2C 信号(SDA 和 SCL)在微控制器侧被上拉。

    您能否建议为什么 IC 在应用输入时不生成中断?

    谢谢。

    Kiran

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经将前12位声明为输入

    12位意味着什么?

    我期待微控制器中有中断信号,但 IC 没有生成中断信号。

    在 TI-RTOS 中、中断由 Hwi 管理。 你是否通过 Hwi 启用了中断? 请参阅此帖子、其中提供了 TI-RTOS 培训材料。 特别是 Hwi 章节。  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/887582/faq-where-is-the-old-ti-rtos-workshop/3281791#3281791

    另请参阅 I2C 驱动程序用户指南 https://www.ti.com/lit/pdf/spruhd4

    "我要你,我要你帮我脱衣服。" 我的答复将极为拖延。  

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

    尊敬的 Charles:

    感谢您的答复。

    在 TI-RTOS 中、中断由 Hwi 管理。 你是否通过 Hwi 启用了中断? 请参阅此帖子、其中提供了 TI-RTOS 培训材料。 特别是 Hwi 章节。

    可以、我在工程的.cfg 文件中启用了中断。 请参阅下面的屏幕截图。

    在我们的原理图中、2个 IO 扩展器 IC (TCA9555)连接到相同的 I2C 线路但地址不同。

    中断线路1 (INT1_N)连接到微控制器的 PF0引脚(矢量编号46)、中断线路2 (INT2_N)连接到微控制器的 PQ1引脚(矢量编号101)

    下面给出了两个 IO 扩展器 IC 的初始化代码。

            stI2cConfig.ui8regaddr = 0x06;
            stI2cConfig.vui8slaveAddress =  DI_SLAVEADDRESS1;
            stI2cConfig.vui8I2cBus = Board_I2C9;
            aui8txBuffer[0] = 0x06;
            aui8txBuffer[1] = 0xFF;
            aui8txBuffer[2] = 0x0F;
            stI2cConfig.pui8txbuffer = aui8txBuffer;
            stI2cConfig.pui8RxBuffer = aui8rxBuffer;
            stI2cConfig.vui8writeCount = 3;
            stI2cConfig.vui8readCount = 0;
            ioc_DII2CTransfer(&stI2cConfig);

            stI2cConfig.ui8regaddr = 0x06;
            stI2cConfig.vui8slaveAddress =  DI_SLAVEADDRESS2;
            stI2cConfig.vui8I2cBus = Board_I2C9;
            aui8txBuffer[0] = 0x06;
            aui8txBuffer[1] = 0xFF;
            aui8txBuffer[2] = 0x0F;
            stI2cConfig.pui8txbuffer = aui8txBuffer;
            stI2cConfig.pui8RxBuffer = aui8rxBuffer;
            stI2cConfig.vui8writeCount = 3;
            stI2cConfig.vui8readCount = 0;
            ioc_DII2CTransfer(&stI2cConfig);

    其中  

    #define DI_SLAVEADDRESS1 0x27
    #define DI_SLAVEADDRESS2 0x26

    如果我在 IO 扩展器上施加输入(PO0至 PO7线路)、我将在 INT1_N 处获得中断脉冲、但在 INT2_N 处不获得中断脉冲。 是由相同的 I2C 线路(I2C9)还是任何其他问题导致的?

    请指南。

    此致、

    Kiran

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

    您好!

     我目前在一周的剩余时间里度假。 我的答复可能会有延误。 我也无法访问我的 PC、因此无法实际根据数据表检查您的终端连接。  

     您说 INT2连接到了 PQ1。 为什么要对 PO0-PO7应用中断脉冲?  

     您可以在 Launchpad 上重复同样的问题吗?  

     您能否尝试一个简单的实验来仅在 PQ1上生成中断。 有 一个您可以参考的 TI-RTOS GPIO 中断。  

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

    尊敬的 Charles:

    第二个 IO 扩展器上显示出 INT2_N 脉冲。 我们没有到达所使用的隔离器的输出侧、因此选择了错误的隔离器。

    您说 INT2已连接到 PQ1。 为什么要对 PO0-PO7应用中断脉冲?

    我没有对 PO0-PO7应用中断脉冲、而是对微控制器的 GPIO PQ1应用中断脉冲。

    尽管现在第二个中断脉冲将传输到微控制器。 但它不会进入我的代码中的第二个中断处理程序、

    请参阅下面的第二个中断脉冲。

    我已经在上一篇文章中发布了中断激活代码、原理图和中断处理程序代码片段。 它是在 main.c 文件中针对低电平触发条件设置的。

    #ifdef DI_ISR_I2C_READ
        /* Digital input interrupt is set for Low level trigger */
        GPIOIntTypeSet(GPIO_PORTF_BASE, BOARD_PORTF_PIN0, GPIO_LOW_LEVEL);
        GPIOIntTypeSet(GPIO_PORTQ_BASE, BOARD_PORTQ_PIN1, GPIO_LOW_LEVEL);
        
    #endif
    

    能否告诉我在激活中断处理程序时有什么错误? 或者、为什么第二个 IO 扩展器的中断脉冲未进入第二个中断处理程序、而在第一个中断处理程序中它可以正常工作?

    此致、

    Kiran

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

    您好!

    除了以上内容、请参阅第二个 IO 扩展器到微控制器的 GPIO PQ1引脚的 INT2_N 输出引脚的原理图屏幕截图(通过10k 上拉至3.3V)

    如果我在 IO 扩展器上应用输入(PO0到 PO7行),我将在 int1_N 处获得中断脉冲,但在 int2_N 处却没有得到中断脉冲。

    我将向第二个 IO 扩展器的 PO0-PO7输入线路施加输入电压、以获得 IO 扩展器产生的输出 INT2_N 脉冲、该脉冲进入微控制器的 GPIO PQ1引脚、以便在中断处理程序中处理。

    此致、

    Kiran

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

    此外、

    我已在 tm4c1292ncpdt.c 文件中定义 GPIO PQ1、如下所示

    如果 我遗漏了任何内容、请提供帮助。

    此致、

    Kiran

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

    尊敬的 Kiran:

     在读取 EK_TM4C1294XL.c 文件的 TI-RTOS gpiointerrupt 示例源代码时、 其中包含以红色突出显示的以下注释。 我想确保您是否遵守注释中规定的订购要求。 请参阅以下代码片段。 如您在此示例中所见、有两个中断输入引脚和两个 GPIO 输出引脚。 订单为 PJ0、然后是 PD0。 这必须与  EK_TM4C1294XL.h 中定义的顺序一致。 另请确保  根据您的应用针对 EK_TM4C1294XL_GPIOName 结构更新您的 EK_TM4C1294XL.h。  

    来自  EK_TM4C1294XL.c 的代码片段。  

    /*
    *引脚配置数组
    *注:引脚配置的顺序必须与之前的配置保持一致
    在 EK_TM4C1294XL.h 中定义
    *注意:不用于中断的引脚应放置在
    *数组。 可以从回调数组中省略回调项、以
    *减少内存使用。
    */
    GPIO_PinConfig gpioPinConfigs[]={
    /*输入引脚*/
    /* EK_TM4C1294XL_USR_SW1 */
    GPIOTIVA_PJ_0 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_Rising、
    /* EK_TM4C1294XL_USR_SW2 */
    GPIOTIVA_PD_0 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_Rising、

    /*输出引脚*/
    /* ek_TM4C1294XL_USR_D1 */
    GPIOTiva_Pn_1 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
    /* ek_TM4C1294XL_USR_D2 */
    GPIOTIVA_PN_0 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
    };

    来自 eK_TM4C1294XL.h 的代码片段。

    /*!
    *@def EK_TM4C1294XL_GPIOName
     * EK_TM4C1294XL 开发板上 LED 名称的简明@
    */
    typedef 枚举 EK_TM4C1294XL_GPIOName{
    EK_TM4C1294XL_USR_SW1 = 0、
    EK_TM4C1294XL_USR_SW2、
    EK_TM4C1294XL_D1、
    EK_TM4C1294XL_D2、

    EK_TM4C1294XL_GPIOCOUNT
    }EK_TM4C1294XL_GPIOName;

    我将建议您修改 TI-RTOS gpiointerrupt 示例、以将 PQ1用作中断输入。 你能让它正常工作吗?

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

    尊敬的 Charles:

    引脚按正确的顺序定义。 下面的屏幕截图来自 tm4c1292ncpdt.c

    以下内容来自 tm4c1292ncpdt.h

    以下内容来自 Board.h

    我可以找到的中断示例来自以下路径:

    C:\ti\tirtos_tivac_2_16_01_14\products\TivaWare_C_Series-2.1.4.178\examples\boards\ek-tm4c1294xl\interrupts

    但是这个示例在 startup_ccs.c 文件中给出了中断号、而在我的项目.cfg 文件中却被用于同样的操作。

    与路径中给出的示例相关、C:\ti\tirtos_tivac_2_16_01_14\tirtos_tivac_2_16_01_14_examples\TI\ek_TM4C1294XL\gpiointerrupt

    我没有找到任何项目文件,它只是.c 和.h 文件

    您能否给出您引用的 gpiointerrupt 工作项目的路径?

    谢谢。

    Kiran  

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

    尊敬的 Kiran:

     这是 PJ0、PJ1、JK2、JF0、PQ1、 PP3和 PM4。 PQ1是唯一不生成中断的引脚吗? 您对  PJ0、JK2、JF0、PQ1、PP3和 PM4的其余引脚是否有任何中断问题?

    与路径中给出的示例相关、C:\ti\tirtos_tivac_2_16_01_14\tirtos_tivac_2_16_01_14_examples\TI\ek_TM4C1294XL\gpiointerrupt

    我没有找到任何项目文件,它只是.c 和.h 文件

    您能否给出您引用的 gpiointerrupt 工作项目的路径?

    [/报价]

    您可以使用 CCS 中的 Resource Explorer 导入各种 TI-RTOS 示例? 我强烈建议您首先尝试此示例、并使其正常工作。 然后、您可以修改它以生成 PQ1中断。 在 PQ1正常工作之前、请勿添加其他引脚。 通过修改示例使 PQ1正常工作后、您可以根据应用要求逐渐添加其他引脚。  

      

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

    尊敬的 Charles:

    您有 PJ0、PJ1、JK2、JF0、PQ1, PP3和 PM4。 PQ1是唯一不生成中断的引脚吗? 您是否对  PJ0、JK2、JF0、PQ1、PP3和 PM4的其余引脚有任何中断问题?

    该中断当前仅在 PF0引脚上工作、在其他引脚上不工作。 我正在尝试为附加中断添加额外的引脚 PQ1。

    您可以使用 CCS 中的 Resource Explorer 导入各种 TI-RTOS 示例? 我强烈建议您首先尝试此示例、并使其正常工作。 然后、您可以修改它以生成 PQ1中断。 在 PQ1正常工作之前、请勿添加其他引脚。 通过修改示例使 PQ1正常工作后、您可以根据应用要求逐渐添加其他引脚。  [/报价]

    关于 Resource Explorer、我当前使用的是 CCS v7.4版本、因为我的项目目前使用的是此版本、而 Resource Explorer 在该版本中未打开。

    此致、

    Kiran

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关于 Resource Explorer,我当前使用的是 CCS v7.4版本,因为我的项目目前正在使用此版本,而 Resource Explorer 在该版本中未打开。

    7.4很旧。 在任何情况下、都不看到"View"->"Resource Explorer Offline"?

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

    尊敬的 Charles:

    我访问了上面的选项卡视图-> Resource Explorer Classic、然后按照已打开的以下路径:

    它不显示 GPIO 中断项目、而只是显示导入和构建项目的步骤。

    请提供帮助。

    此致、

    Kiran

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

    尊敬的 Charles:

    那么、我将在另一个具有最新 CCS 版本 CCS12.1的系统中尝试该示例

    我对 gpioPinConfigs[]数组中的 EK_TM4C1294NCPDT.c 文件进行了如下更改:

    GPIO_PinConfig gpioPinConfigs[] = {
        /* Input pins */
        /* EK_TM4C1294XL_PQ1 */
        GPIOTiva_PQ_1 | GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_RISING,
        /* EK_TM4C1294XL_USR_SW2 */
        GPIOTiva_PJ_1 | GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_RISING,
    
        /* Output pins */
        /* EK_TM4C1294XL_USR_D1 */
        GPIOTiva_PN_1 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
        /* EK_TM4C1294XL_USR_D2 */
        GPIOTiva_PN_0 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
    };

    我替换了示例中的第一个 GPIO、即 采用 PQ1的 PJ0。 在 Board.h 中的定义与  

    另外,在文件 EK_TM4C1294NCPDT.h 文件中:

    此外、在 gpiointerrupt.c 文件中、进行了以下更改、以使用 Board_PQ1代替 USR_SW1 (Board_BUTTON0)。

    但使用相应的 bin 文件对 TI Launchpad 进行编译和编程后、它仍在 通过 USR_SW1切换 LED、如示例中所示、而不是通过 PQ1。

    此外、在我的项目中、我要在.cfg 文件中启用中断、而不是在.c 文件中启用

    请指南如何启用 PQ1进行中断。

    此致、

    Kiran

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

    尊敬的 Kiran:

     如果启用了 PQ、您是否可以检查 NVIC 寄存器。 如果您运行库存示例、则在 NVIC 中启用了三个中断通道、即 PD、PJ 和 Timer1。 如果您更改为 PQ1、我希望中断通道84 (如果您启用整个端口 Q)或85 (如果您专门启用 PQ1)已启用。  

    下面是来自器件数据表。  

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

    尊敬的 Charles:

    如何检查这些寄存器? 如果我在调试模式下运行该示例、则中断不会因为运行时而出现。 请参阅下面的

    请指南。

    此致、

    Kiran

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

    尊敬的 Kiran:

     我只想检查是否启用了 PQ 端口的中断。 您当前的 NVIC 已禁用所有中断通道。  您的屏幕截图可能是在代码运行之前捕获的。 您可以为 GPIO_enableInt (Board_PQ1)添加一个断点或单步执行调用。 查看是否设置了 NVIC_ENx 的任何位。 运行 stock 示例、并将 NVIC 设置与修改后的代码进行比较。  

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

    尊敬的 Charles:

    您可以设置一个断点或单步执行对 GPIO_enableInt (Board_PQ1)的调用。

    正如您提到过的那样添加了断点。 请参阅以下内容:

    请建议我的原始代码的后续步骤。

    谢谢。

    Kiran  

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

    尊敬的 Kiran:

     在阅读您的屏幕截图时、我看到启用了通道85 (端口 Q1)和通道51 (端口 J)。 操作系统使用的 timer1A 可能未启用,因为  尚未调用 BIOS_Start()。  

    您能否显示 GPIO_PORTQ 的寄存器设置? 让我们确保也在模块级别为 PortQ 启用中断。  

    请记住、您已为上升沿上的中断配置 PortQ1。 您对 PQ1的输入是什么? 您是否能够确认您创建了一个上升沿来引起一个中断?

     您可以在 gpioButtonFxn0()和 gpioButtonFxn1() 的条目上放置一个断点吗? 我还想 验证 是否由于 GPIO 结构的顺序而调用了错误的回调。  

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

    尊敬的 Charles:

    中断处理程序现在在示例中正常工作、在我的工作项目中、我有2个中断处理程序(对应于2个 IO 扩展器)也在工作。

    在我的原理图中、我有2个 IO 扩展器、分别用于数字输入(0-11)和数字输入(12-23)、从而分别导致中断1个和2个以及其他2个 IO 扩展器、用于对应于应用数字输入的相应 LED (0-11)和 LED (12-23)。

    数字输入 IO 扩展器的 I2C 线路为 I2C9 (具有不同的地址0x27和0x26)、而2个 LED IO 扩展器的 I2C 线路为 I2C2 (具有不同的地址0x27和0x26)。

    下面是我在2个不同中断处理程序中对连接到数字输入 IO 扩展器1 (和2)的 I2C 信号与 LED IO 扩展器1 (和2)的观察结果(示波器捕获):

    示波器捕获中信号及其各自颜色的详细信息:

    • 黄色:LED SCL
    • 绿色:LED SDA
    • 蓝色:DI SCL
    • 粉色:DI SDA

    情形1:

    ISR 1 (0-11 DI):两个设置均亮

    • 设置1:  0-11个 LED
    • 设置2:12-23个 LED

            

    在第一个 IO 扩展器的中断处理程序 ISR1中、我将向 IO 扩展器的发光 LED (0-11)和 LED (12-23)发出 I2C 命令、它们都在发光

    情形2:  

    ISR 2(12-23 DI):两个设置均亮

    • 设置1:  0-11个 LED
    • 设置2:  12-23个 LED

    在第二个 IO 扩展器的中断处理程序(即 ISR2)中、我将向 IO 扩展器发光 LED (0-11)和 LED (12-23)发出 I2C 命令、它们都亮起。

    情形3:

    ISR 1 (0-11 DI):SET 2不亮

    • 设置2:  12-23个 LED

     

    ISR 2(12-23 DI):设置1个发光

    • 设置1:  0-11个 LED

    案例4:

    ISR 1 (0-11 DI):设置1个发光

    • 设置1:  0-11个 LED

    ISR 2 (12-23 DI):不亮

    • 设置2:  12-23个 LED

    在第3和第4种情况中、观察到从任何一个中断处理程序单独运行时、第二个 LED IO 扩展器(12-23个 LED)无法正常工作。

    LED 的2个 IO 扩展器具有0x27和0x26地址。 驱动2个 LED 的代码  

    #ifdef USE_DI
        i2cConfigbus stI2cConfig;
        uint8_t aui8TxBuffer[4];
        uint8_t aui8RxBuffer[3];
    
        /* Configuration of Digital Input LED*/
        IOC_DEBUG_DRIVER("\nDigital Input LED Update\n");
        IOC_DEBUG_DRIVER_FLUSH();
    
        aui8TxBuffer[0] = DIO_OUTPUTREG_PORTTWO;
        stI2cConfig.ui8regaddr = DIO_OUTPUTREG_PORTTWO;
        stI2cConfig.vui8slaveAddress =  DI_LED_SLAVEADDRESS;
        stI2cConfig.vui8I2cBus = Board_I2C2;
        stI2cConfig.pui8txbuffer = aui8TxBuffer;
        stI2cConfig.pui8RxBuffer = aui8RxBuffer;
        stI2cConfig.vui8writeCount = 1;
        stI2cConfig.vui8readCount = 1;
        ioc_DigitalLEDI2CTransfer(&stI2cConfig);
    
        aui8TxBuffer[2] = (*((uint8_t*)stI2cConfig.pui8RxBuffer+0)) & 0xF0;
    
        channelStatus = ~channelStatus;
    
        aui8TxBuffer[1] = channelStatus & 0xFF;
        aui8TxBuffer[2] = aui8TxBuffer[2] | ((channelStatus >> 8) & 0x0F);
    
        aui8TxBuffer[0] = DIO_OUTPUTREG_PORTONE;
        stI2cConfig.ui8regaddr = DIO_OUTPUTREG_PORTONE;
        stI2cConfig.vui8slaveAddress =  DI_LED_SLAVEADDRESS;
        stI2cConfig.vui8I2cBus = Board_I2C2;
        stI2cConfig.pui8txbuffer = aui8TxBuffer;
        stI2cConfig.pui8RxBuffer = aui8RxBuffer;
        stI2cConfig.vui8writeCount = 3;
        stI2cConfig.vui8readCount = 0;
        ioc_DigitalLEDI2CTransfer(&stI2cConfig);
    

    i2cConfigbus stI2cConfig;
        uint8_t aui8TxBuffer[4];
        uint8_t aui8RxBuffer[3];
    
        /* Configuration of Digital Input LED*/
        IOC_DEBUG_DRIVER("\nDigital Input LED Update\n");
        IOC_DEBUG_DRIVER_FLUSH();
    
        aui8TxBuffer[0] = DIO_OUTPUTREG_PORTTWO;
        stI2cConfig.ui8regaddr = DIO_OUTPUTREG_PORTTWO;
        stI2cConfig.vui8slaveAddress =  DI_LED_SLAVEADDRESS2;
        stI2cConfig.vui8I2cBus = Board_I2C2;
        stI2cConfig.pui8txbuffer = aui8TxBuffer;
        stI2cConfig.pui8RxBuffer = aui8RxBuffer;
        stI2cConfig.vui8writeCount = 1;
        stI2cConfig.vui8readCount = 1;
        ioc_DigitalLEDI2CTransfer(&stI2cConfig);
    
        aui8TxBuffer[2] = (*((uint8_t*)stI2cConfig.pui8RxBuffer+0)) & 0xF0;
    
        channelStatus = ~channelStatus;
    
        aui8TxBuffer[1] = channelStatus & 0xFF;
        aui8TxBuffer[2] = aui8TxBuffer[2] | ((channelStatus >> 8) & 0x0F);
    
        aui8TxBuffer[0] = DIO_OUTPUTREG_PORTONE;
        stI2cConfig.ui8regaddr = DIO_OUTPUTREG_PORTONE;
        stI2cConfig.vui8slaveAddress =  DI_LED_SLAVEADDRESS2;
        stI2cConfig.vui8I2cBus = Board_I2C2;
        stI2cConfig.pui8txbuffer = aui8TxBuffer;
        stI2cConfig.pui8RxBuffer = aui8RxBuffer;
        stI2cConfig.vui8writeCount = 3;
        stI2cConfig.vui8readCount = 0;
        ioc_DigitalLEDI2CTransfer(&stI2cConfig);
    

    其中

    #define DI_LED_SLAVEADDRESS 0x27
    #define DI_LED_SLAVEADDRESS2 0x26

    驱动第二组 LED 的代码中是否有任何错误?

    此致、

    Kiran

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    中断处理程序现在在这个示例中工作,而且在我工作的项目中,我有2个中断处理程序(对应于2个 IO 扩展器)也在工作。

    尊敬的 Kiran:

     也许您可以解释一下为什么它现在可以工作、因为我们已经花了很多时间来调试这个问题。 您做了哪些更改才能使其正常工作?

    在我的原理图中、我有2个 IO 扩展器、分别用于数字输入(0-11)和数字输入(12-23)、从而分别导致中断1个和2个以及其他2个 IO 扩展器、用于对应于应用数字输入的相应 LED (0-11)和 LED (12-23)。

    数字输入 IO 扩展器的 I2C 线路为 I2C9 (具有不同的地址0x27和0x26)、而2个 LED IO 扩展器的 I2C 线路为 I2C2 (具有不同的地址0x27和0x26)。

    [/报价]

    我对你的系统仍然不是很清楚。 我有一些问题。

     -您的设计上有多少 IO 扩展器(TCA9555)? 是2个还是4个? 在我看来、您使用 I2C9连接两个 DI IO 扩展器、并使用 I2C2连接 LED 的另两个 IO 扩展器。  

     -对于用于连接两个 DI IO 扩展器的 I2C9 ,有两个中断连接到 PF0和 PQ1。 是这样吗?

     -对于用于连接两个 LED IO 扩展器的 I2C2、您使用了什么中断通道? 两个 LED IO 扩展器中断连接到了哪些 GPIO 输入?

     -对于两个 DI IO 扩展器,您将 IO 配置为输入,正确吗?

     -对于两个 LED IO 扩展器,您将 IO 配置为输出,正确吗? 对于如何将 LED 连接到  TCA9555、我不是很清楚。

    以下是我针对 I2C 信号到2个不同中断处理程序中的数字输入 IO 扩展器1 (和2)与 LED IO 扩展器1 (和2)的观察结果(示波器捕获):

    你总共有2个中断处理程序还是4个中断处理程序? 我知道、至少您有两个 PF0和 PQ1。 我不确定 LED IO 扩展器的情况。 请澄清。  

    在第3和第4种情况中,可以观察到第二个 LED IO 扩展器(12-23个 LED)在从任何一个中断处理程序单独运行时无法正常工作。

    在第1种和第2种情况下、您可以点亮第二个 LED 扩展器(12-23)、这意味着您提供了正确的地址(0x26)。 我不知道为什么在第3和第4种情况中它不起作用。 您可以从总线上暂时移除第一个 LED 扩展器吗? 需要知道总线上是否存在某种类型的冲突、因为两个 LED 扩展器共享同一条总线。 调试操作也会更容易。  

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

    尊敬的 Charles:

    也许你可以解释为什么它现在工作了,因为我们花了很多时间来调试问题。 您做了哪些更改才能使其正常工作?

    未在触发点启用中断、

    [报价 userid="93620" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1266080/tm4c1294ncpdt-rtos-i2c-driver-need-to-use-a-different-i2c-bus-other-than-defined-in-enum/4811713 #4811713"]您的设计中有多少 IO 扩展器(TCA9555)? 是2个还是4个? 在我看来、您使用 I2C9连接两个 DI IO 扩展器、并使用 I2C2连接 LED 的另两个 IO 扩展器。  [/报价]

    是的、您了解正确

     -对于用于连接两个 DI IO 扩展器的 I2C9,有两个中断连接至 PF0和 PQ1。 这是否正确?

     -对于用于连接两个 LED IO 扩展器的 I2C2,您使用的中断通道是什么? 哪些 GPIO 输入是连接到的两个 LED IO 扩展器中断?

    由于两个 LED IO 扩展器仅驱动输出(来自 PF0、PQ1 ISR)、并且没有输入、因此在这种情况下、中断不会受到影响。

    -对于两个 DI IO 扩展器,您将 IO 配置为输入,正确吗?

    -对于两个 LED IO 扩展器,您将 IO 配置为输出,是否正确? 这个问题我不是很清楚您是如何将 LED 连接到  TCA9555的。

    是 IO 配置为输出。 请参阅此演示的原理图

                 

    您总共有两个中断处理程序还是四个中断处理程序? 我知道、至少您有两个 PF0和 PQ1。 我不确定 LED IO 扩展器的情况。 请澄清

    PF0和 PQ1只有2个中断处理程序、不适用于 LED IO 扩展器

    在第1和第2种情况下,您可以点亮第二个 LED 扩展器(12-23),这意味着您提供了正确的地址(0x26)。 我不知道为什么在第3和第4种情况中它不起作用。 您可以从总线上暂时移除第一个 LED 扩展器吗? 需要知道总线上是否存在某种类型的冲突、因为两个 LED 扩展器共享同一条总线。 调试操作也会更容易。  [/报价]

    当两个:LED IO 扩展器同时从单个中断处理程序开启时 (ISR1或 ISR2),所有 LED 都会开启,但当一个 LED IO 扩展器通过一个 ISR 时,第二个设置(12-23个 LED)不起作用。 我将尝试做实验。

    如果有任何其他基于上述观察的建议,请告诉我。

    谢谢。

    Kiran

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

    当两个:LED IO 扩展器同时从单个中断处理程序开启时 (ISR1或 ISR2),所有 LED 都会开启,但当一个 LED IO 扩展器通过一个 ISR 时,第二个设置(12-23个 LED)不起作用。 我将尝试做实验。

    如果有任何其他基于上述观察的建议,请告诉我。

    [/报价]

    请告诉我您的实验结果。

    我还建议您放大案例1和案例2、将命令发送到第二个 IO 扩展器并查看 SDA 引脚上的数据。 请将其与情况3和4进行比较。 第3种和第4种情况下发送到第2个 LED 扩展器的数据是否与第1种和第2种情况下的数据相同? 您的屏幕截图是不会显示细节的缩小镜头。  

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

    尊敬的 Charles:

    以下是4个案例的范围缩放图:

    情形1:

    ISR1

          

           

    情形2:

    ISR 2:  

                   

                        

    情形3:

    ISR1:

          

         

    ISR2:

                 

      

    情形4:

    ISR1:

           

    ISR2:

                 

    如何从一个 LED IO 扩展器上移除 I2C 线路? 在 PCB 中装配时、是否应该移除第一个 IO 扩展器 IC?

    此致、

    Kiran

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何从一个 LED IO 扩展器中删除 I2C 线路? 由于它装配在 PCB 中、我是否应该移除第一个 IO 扩展器 IC?

    我知道改变 PCB 比进行软件更改要困难得多。 这是我建议您在拆下第一个 LED 扩展器之前进行的操作。  

     -不要使用 ISR1或 ISR2写入第二个 LED 扩展器来打开 LED。 只需使用 I2C2将命令直接写入到第二个 LED 扩展器 n 您的 main()或某个位置。 您是否会打开 LED (13-24)?

     -返回到您的原始方法。 我假设在 ISR1或 ISR2中、您首先向第一个 LED 扩展器发送命令、然后向第二个 LED 扩展器发送命令、对吗? 为什么不撤消订单? 尝试先向第2个 LED 扩展器(13-24)发送命令、然后向第1个扩展器发送命令。 您会看到不同的结果吗?

     -如果软件实验不起作用,然后以某种方式从总线上移除第一个 LED 扩展器。  

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

    尊敬的 Charles:

    回到您的原始方法。 我假设在 ISR1或 ISR2中、您首先向第一个 LED 扩展器发送命令、然后向第二个 LED 扩展器发送命令、对吗? 为什么不撤消订单? 尝试先向第2个 LED 扩展器(13-24)发送命令、然后向第1个扩展器发送命令。 您是否会看到不同的结果?

    我已经展示了此实验的结果、在同一 ISR 中开启两个 LED 扩展器会开启所有 LED、这不会造成任何问题。

    我会尝试你建议的其他东西。

    我也在尝试 UART 打印方法(在 ISR 中),以便 在 ISR1中使用命令 IOC_UartPrint ("\nDig1 \n");调试问题。

    和  IOC_UartPrint ("\n ISR2 \n"); 在 ISR2中。 并且仅' 数字1 '  并且在第二个中断处理程序中、所有初始化消息 都会再次打印并且系统挂起、但当我注释它时、系统不会挂起。

    void ioc_UartPrint( const char *fmt, ... )
    {
    	Semaphore_pend(Sem_Uart_Handle, BIOS_WAIT_FOREVER);
        uint32_t viIntValue;  /* Used to store any int arguments. */
        char cCharValue;
        uint32_t viStrLength;
        char *piStringTemp;
        char aicBuffer[20];
        va_list vaArgs;  /* Used as a pointer to the next variable argument. */
    
        va_start( vaArgs, fmt );  /* Initialize the pointer to arguments. */
    
        while (*fmt)
        {
            if ('%' == *fmt)
            {
                fmt++;
                switch (*fmt)
                {
                     case 'd':
                         viIntValue = va_arg( vaArgs, int);
                         ioc_Itoa(viIntValue, aicBuffer, 10);
                         viStrLength = strlen(aicBuffer);
                         UARTUtils_devicewrite(UART_DEIVCE, aicBuffer,
                                               viStrLength);
                         break;
    
                     case 'x':
                    	  viIntValue = va_arg( vaArgs, int);
                    	  ioc_Itoa(viIntValue, aicBuffer, 16);
                    	  viStrLength = strlen(aicBuffer);
                    	  UARTUtils_devicewrite(UART_DEIVCE, aicBuffer,
                    	                        viStrLength);
    					  break;
    
                     case 'c':
    					  cCharValue = va_arg( vaArgs, char);
    					  UARTUtils_devicewrite(UART_DEIVCE, &cCharValue, 1);
    					  break;
    
                     case 's':
                    	  piStringTemp = va_arg(vaArgs , char *);
                    	  viStrLength = strlen(piStringTemp);
                    	  UARTUtils_devicewrite(UART_DEIVCE, piStringTemp,
                    	                        viStrLength);
                    	  break;
    
                 }
            }
            else
               /* Not a format character, copy it to output. */
    
            UARTUtils_devicewrite(UART_DEIVCE, fmt, 1);
            fmt++;
        }
        va_end( vaArgs );
        Semaphore_post(Sem_Uart_Handle);
    }
    

    能否使用其他 printf 方法进行调试?

    此致、

    Kiran

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

    我不建议在 ISR 中插入 printf 或 UARTprintf 类型的日志记录。 您处于实时操作中。 您应该能够快速进出 Hwi/中断。 当您插入 C 样式 printf 或 UARTprintf 时、  只要 UART 处于进行中、就会一直保留在 ISR 中。 HWI/中断具有比您的任一用户任务更高的优先级。 您在 ISR 处理程序中停留的时间越长、要打印出来的消息就越长。 这将使其他任务无法运行。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经展示了此实验的结果,在同一个 ISR 中同时打开两个 LED 扩展器将所有 LED 打开,这不存在问题。

    是有区别的。 在 ISR 中、必须先向 LED 扩展器地址0x27发送一条命令、然后再向扩展器地址0x26发送另一条命令、对吗? 我是说颠倒顺序。 首先向扩展器地址0x26发送命令、然后向扩展器地址0x27发送命令。 除非您已经这么做。  

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

    尊敬的 Charles:

    我们有2个具有相同 I2C 线(I2C2)的电路板、驱动3个 LED IO 扩展器(两个在一个板上、另一个板上有一个)、因此我尝试使用第三个中断处理程序来驱动另一个板上唯一只有1个 LED IO 扩展器(地址为0x24)的 LED IO 扩展器 (具有第三个数字 IO 扩展器的 INT3)。

    以下是示波器捕获:

                       

                         

    但 LED 不会亮起。

    您能引导我错了吗?

    此致、

    Kiran

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

    我认为您的 SDA 上存在干扰。 虽然您写入地址0x24、从器件可能已经解释了不同地址的地址字节、因此没有对其做出反应。 您使用的上拉电阻器值是多少?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的上拉电阻器值是什么?

    请参阅以下内容:

    如有任何意见、请告知我们。

    谢谢。

    Kiran

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

    没关系。 再次查看示波器、我不认为干扰发生在地址上、而是发生在 第9位、即 ACK 上。 由于主器件正在从从器件接收正确的 ACK、因此应该不会出现问题。  

    我不太了解  TCA9555。 第3次捕捉和第4次捕捉之间的区别是什么?  

    在第3次捕获中、我看到24Wa -> 03a -> S24Ra -> FFA。

    在第4次捕获中、我看到了24Wa -> 02a -> FFA -> FFA

    就像在捕获3中一样、读取的是寄存器地址0x3、而读回的是值0xFF。 在捕获4中、您将值0xFF 写入寄存器地址0x2。 这些命令会对 IO 扩展器产生什么影响? 当您从寄存器0x3读取时、捕获3中预期返回的值是多少?

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

    尊敬的 Charles:

    这是基于 DI IO 扩展器上应用的数字输入通道的通道状态来驱动 LED (IO 扩展器)的现有工作项目中的代码。 下面是代码片段。

        aui8TxBuffer[0] = DIO_OUTPUTREG_PORTTWO;
        stI2cConfig.ui8regaddr = DIO_OUTPUTREG_PORTTWO;
        stI2cConfig.vui8slaveAddress =  DI_LED_SLAVEADDRESS;
        stI2cConfig.vui8I2cBus = Board_I2C2;
        stI2cConfig.pui8txbuffer = aui8TxBuffer;
        stI2cConfig.pui8RxBuffer = aui8RxBuffer;
        stI2cConfig.vui8writeCount = 1;
        stI2cConfig.vui8readCount = 1;
        ioc_DigitalLEDI2CTransfer(&stI2cConfig);
    
        aui8TxBuffer[2] = (*((uint8_t*)stI2cConfig.pui8RxBuffer+0)) & 0xF0;
    
        channelStatus = ~channelStatus;
    
        aui8TxBuffer[1] = channelStatus & 0xFF;
        aui8TxBuffer[2] = aui8TxBuffer[2] | ((channelStatus >> 8) & 0x0F);
    
        aui8TxBuffer[0] = DIO_OUTPUTREG_PORTONE;
        stI2cConfig.ui8regaddr = DIO_OUTPUTREG_PORTONE;
        stI2cConfig.vui8slaveAddress =  DI_LED_SLAVEADDRESS;
        stI2cConfig.vui8I2cBus = Board_I2C2;
        stI2cConfig.pui8txbuffer = aui8TxBuffer;
        stI2cConfig.pui8RxBuffer = aui8RxBuffer;
        stI2cConfig.vui8writeCount = 3;
        stI2cConfig.vui8readCount = 0;
        ioc_DigitalLEDI2CTransfer(&stI2cConfig);
    

    它在现有工作项目中工作、与在另一个 IO 扩展器(对应数字输入)上施加数字输入的通道编号相同的 LED 亮起。

    此致、

    Kiran

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

    这是现有工作项目中的代码,用于根据 DI IO 扩展器上应用的数字输入通道的通道状态驱动 LED (IO 扩展器)。 以下是代码片段。

    如果您的代码在  另一个板上适用、则我不会在您的代码上看到问题。 您还没有回答我的问题。 您是否在总线上看到您打算写入和读取的内容? 当您读回0xFF 时、这是预期结果吗? 当您将两个0xFF 写入寄存器0x2时、这是您尝试写入的内容吗? 如果你认为你正在将正确的命令写入到  TCA9555并且总线确认正确的波形、那么我建议你打开一个器件型号为 TCA9555的新线程。 在新线程中显示您发送的命令和捕获的波形。 我希望支持 TCA9555的专家 可以就如何诊断问题提供一些意见。  

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

    尊敬的 Charles:

    我不确定现有项目的预期。 我认为我需要更深入地理解这本书、以便理解回读的价值观。

    我创建了一个新帖子:

    (+) TCA9555:接口论坛-接口论坛-接口- TI E2E 支持论坛

    也请在该处分享您的评论。

    谢谢。

    Kiran

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

    我建议您更新新帖子、重点关注您当前的问题 、并公平地对待那里的专家、这样他们就不需要阅读此主题中数周的帖子。 您解决的某些问题与 TCA955无关。 例如、我们花了几周时间来仅解析 PQ1上的中断。 他们不需要阅读这些内容。 如果你让他们阅读他们的话,他们将会失去并踢线。  

    正如我提到过的、仅显示您的最新问题。 展示了您要发送以开启 LED 的命令和波形。 如果您认为命令已正确发送并在波形上进行了验证、为什么 LED 不打开?

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

    尊敬的 Charles:

    我已经在该帖子中发布了我当前问题的详细信息。 目前、我面临一个仅启用第三个中断处理程序的问题(即仅初始化第三个数字输入 IO 扩展器和第三个 LED IO 扩展器、从 PCB 上移除前两个 LED IO 扩展器)。 在这种情况下、并非所有 LED 都会亮起、但设置中的随机 LED 很少会亮起。

    但在第三个 IO 扩展器上施加数字输入后、数字输入 IO 扩展器的 I2C 时钟线变为低电平。 请参阅下面的示波器捕获。

    在上面的示波器捕获中、 蓝色线是数字输入 I2C SCL、粉色线是数字输入 I2C SDA。

    绿色和黄色分别是 LED I2C SDA 和 SCL。

    您能说出为什么会变成低电平吗? 也许这就是 LED 没有正确响应的原因。

    此外、在 TCA9555接口论坛中、他们编写了以下响应。

    您的 μ I²C 库能否启动多个 μ I²C 事务吗? 如果没有,则对 IOC_DigitalLED2CTransfer()的第二次(和第三次)调用将中止前一个调用。 (这与 TCA9555本身无关、应在 TM4C 论坛中讨论。)

    您能分享您对此的反馈吗?

    谢谢。

    Kiran

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但是在第三个 IO 扩展器上应用数字输入后,数字输入 IO 扩展器的 I2C 时钟线变为低电平

    如果时钟处于低电平、则表示主器件处于突发的中间。 有关说明、请参阅以下应用手册。 与您的代码相对应的波形是什么? 是否有可能在您的代码中您没有提供突发操作中的所有数据? 请注意、TI-RTOS I2C 驱动程序是一个使用 TivaWare I2C driverlib 来处理 I2C 事务的抽象层。  

    https://www.ti.com/lit/pdf/spma073

    您的 μ I²C 库是否能够启动多个 μ I²C 事务? 如果没有,则对 IOC_DigitalLED2CTransfer()的第二次(和第三次)调用将中止前一个调用。 (这与 TCA9555本身无关、应在 TM4C 论坛中讨论。)

    不符合您之前提供的范围、其中表明主器件发送一个三字节突发(0x2、0xFF 和0xFF)。 这三个字节形成连续突发。 这不是三个单独的单个 I2C 事务。  

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

    尊敬的 Charles:

    在中断处理程序中、正在从 IO 扩展器读取数据。 所以,这是可能的 hy iadata 没有被读取?

    但为什么会发生这种情况呢?

    此致、

    Kiran

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

    您能否在中断处理程序中展示您的代码是如何读取 IO 扩展器的? 还提供了一个放大图、显示了主器件向从器件发送的命令序列。 检查波形是否与您的预期操作相符。  

    还要与您在中断处理程序中说可以成功开启两个 LED 扩展器的其他电路板进行比较。 它们有何不同?

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

    您能否在中断处理程序中展示您的代码是如何读取 IO 扩展器的? 还提供了一个放大图、显示了主器件向从器件发送的命令序列。 检查波形是否与您的预期操作相符。  

    还要与您在中断处理程序中说可以成功开启两个 LED 扩展器的其他电路板进行比较。 它们有何不同?

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

    尊敬的 Charles:

    我将在中断处理程序中执行以下操作。 请参阅以下代码片段

    void DigitalInputISRHandler3()
    {
        I2cStructType stI2cData;
        int Key;
    
        GPIO_disableInt(BOARD_PORTP_PIN3);
        GPIO_clearInt(BOARD_PORTP_PIN3);
    
        stI2cData.ui32I2cBus = I2C5_BASE;
        stI2cData.i2cSlaveAddress = DI_SLAVEADDRESS;
        stI2cData.ui32TxCount = 1;
        
        stI2cData.ui32RxCount = 2;
        stI2cData.pui8DataRx = ui8DiRxBuf;
        ui8DiTxBuf[0] = 0x00;
        stI2cData.pui8DataTx = ui8DiTxBuf;
    
        /* Read DI Status */
        DiI2cRead(&stI2cData);
        pui8DiRawStatus3 = (uint8_t*)stI2cData.pui8DataRx;
    
        /*Schedule Even Post to process the digital input status */
        Event_post(Event_Digital_Input_Handler, Event_Id_04);
        GPIO_enableInt(BOARD_PORTP_PIN3);
    }

    另外、我还捕获了中断引脚和数字输入 I2C 线路的示波器捕获、即 SCL 和 SDA 信号。 请参阅下面的  

               

    黄色的是中断线、蓝色是数字输入时钟、粉色是 I2C 数据。

    请分享您的评论。

    谢谢。

    Kiran

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

    您好!

     首先、我认为您不在使用 TI-RTOS I2C 驱动程序。 是这样吗? 您的代码与 TI-RTOS I2C 驱动程序不符。 也许您可以用自己的自定义层包装 TI-RTOS 驱动程序。 是这样吗?

    https://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/tirtos/2_14_04_31/exports/tirtos_full_2_14_04_31/docs/doxygen/html/_i2_c_8h.html

    - ui8DiTxBuf 是否等于0x0 ?

    -看你的代码和波形,你试图先写一个数据,然后读两个数据。 是这样吗?

    -写入数据为0x0 ,这是您要读取的寄存器地址,正确吗?

    从寄存器0x0读回的数据是0x1和0xF0。 0x1和0xF0是您所期望的正确数据吗? 如果这不是预期值、则需要咨询 TCA9555专家。 我不知道该器件是否注释应该读回哪些值。  

    在波形中,在一次写入和两次读取后, SCL 变为高电平,这意味着 I2C 事务完成。 我看不出问题。 您之前说 SCL 仍然保持低电平。 它在哪儿?

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

    尊敬的 Charles:

    以下是用于中断处理程序的 i2cread 代码:

    void DiI2cRead(I2cStructType *pI2cData)
    {
        uint32_t ui32Index = 0;
        uint32_t ui32ErrCount;
    
        I2CMasterEnable(pI2cData->ui32I2cBus);
    
        /*if true - 400Khz, False - 100Khz */
        I2CMasterInitExpClk(pI2cData->ui32I2cBus, 120000000, true);
    
        I2CMasterSlaveAddrSet(pI2cData->ui32I2cBus,
                                             pI2cData->i2cSlaveAddress, false);
    
        I2CMasterBurstLengthSet(pI2cData->ui32I2cBus, pI2cData->ui32TxCount);
    
        I2CMasterControl(pI2cData->ui32I2cBus,
                                    I2C_MASTER_CMD_FIFO_BURST_SEND_START);
        for(ui32Index = 0; ui32Index < pI2cData->ui32TxCount; ui32Index++)
        {
    
            I2CFIFODataPut(pI2cData->ui32I2cBus,
                                           *(pI2cData->pui8DataTx+ui32Index));
        }
    
        while(I2CMasterBusy(pI2cData->ui32I2cBus))
        {
    
        }
    
        ui32ErrCount = I2CMasterErr(pI2cData->ui32I2cBus);
        if(ui32ErrCount != I2C_MASTER_ERR_NONE)
        {
            Event_post(Event_Fault_Handler, Event_Id_00);
        }
        I2CMasterDisable(pI2cData->ui32I2cBus);
    
        I2CMasterEnable(pI2cData->ui32I2cBus);
    
        /*if true - 400Khz, False - 100Khz */
        I2CMasterInitExpClk(pI2cData->ui32I2cBus, 120000000, true);
    
        I2CMasterSlaveAddrSet(pI2cData->ui32I2cBus,
                                             pI2cData->i2cSlaveAddress, true);
        I2CMasterBurstLengthSet(pI2cData->ui32I2cBus, pI2cData->ui32RxCount);
    
        I2CMasterControl(pI2cData->ui32I2cBus,
                         I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE);
    
        while(I2CMasterBusy(pI2cData->ui32I2cBus))
        {
    
        }
        ui32ErrCount = I2CMasterErr(pI2cData->ui32I2cBus);
        if(ui32ErrCount != I2C_MASTER_ERR_NONE)
        {
            Event_post(Event_Fault_Handler, Event_Id_00);
        }
        for(ui32Index = 0; ui32Index < pI2cData->ui32RxCount; ui32Index++)
        {
    
            *(pI2cData->pui8DataRx+ui32Index) =
                                         I2CFIFODataGet(pI2cData->ui32I2cBus);
        }
        I2CMasterDisable(pI2cData->ui32I2cBus);
    }
    

    查看您的代码和波形时,您尝试先写入一个数据,然后读取两个数据。 是否正确?

    是的、实际上这就是工作项目中第一个中断处理程序发生的情况。 我只是为其他中断处理程序复制了它。

    user4441152 说:
    写入数据为0x0,这是您要读取的寄存器地址,正确吗?

    是的、基本而言、从两个输入端口寄存器0x00和0x01 (aoto-inc增量)读取

    您从寄存器0x0读回的数据是0x1和0xF0.

    我们在第一个引脚上应用输入、因此0x1正确。 需要查询0xF0值。

    在波形中,在一次写入和两次读取后, SCL 变为高电平,表示 I2C 事务已完成。 我看不出问题。 您之前说 SCL 仍然保持低电平。 这是在哪里?

    但这次我没有通过该中断处理程序在 LED IO 扩展器上观察到任何 I2C 事务(我正在检查此中断处理程序中发布的事件以使 LED 发光)

    有什么建议为什么会发生这种情况?

    谢谢。

    Kiran

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

    您好!

     我有一些注释、也看到了您的代码有几个问题。 请仔细阅读。  

    -似乎您使用的不是 TI-RTOS I2C 驱动程序、而是本机 TivaWare I2C driverlib。 我认为这是一个很好的开始、因为我更熟悉 TivaWare 而不是 TI-RTOS。

     -在您的代码中,您将 TX 计数设置为1  ,如 stI2cData.ui32TxCount = 1 ,然后调用 DiI2cRead。 现在看看你的代码在  DiI2cRead ().  在第16行中、您可以通过调用 I2CMasterControl (pI2cData->ui32I2cBus、I2C_MASTER_CMD_FIFO_BURST_SEND_START)来启动 I2C 事务;这将是一个问题。 由于 txcount 为1、您会将 I2C 模块置于不会完成的突发操作中。 要完成突发事务,需要使用 I2C_MASTER_CMD_FIFO_BURST_SEND_FINISH 调用 I2CMasterControl () 。  I2C_MASTER_CMD_FIFO_BURST_SEND_FINISH 将在总线上发送一个停止位。 利用现在所拥有的功能、I2C 总线在发送数据的第一个字节后、SCL 将保持低电平、因为它处于突发操作的中间。 您绝不会使用 I2C_MASTER_CMD_FIFO_BURST_SEND_FINISH 来结束突发操作。 在您的代码中,如果 txcount > 1 ,您只会继续发送超过 FIFO 的内容。  

    -当您执行 I2CMasterDataPut()时,只会将数据放入缓冲区。 它不会引起总线事务。 它是 导致总线事务的 I2CMasterControl()。 请仔细阅读 API。  

     -请参阅 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl-boostxl-senshub\HUMIDITY_sht21_simple 有关 何时使用 I2C_MASTER_CMD_SINGLE_SEND   、I2C_MASTER_CMD_RECEST_RECEIVE_START、I2C_MASTER_CMD_BURST_RECEST_RECEST_COMPST_COMPRESS 和 I2C_RECEST_COMPRESS 的示例 。  

    -请参阅这个非常有用的应用说明如何使用各种标志。  https://www.ti.com/lit/pdf/spma073

     -您的读取操作也有问题。 将 ReadCount 设置为 stI2cData.ui32RxCount = 2。 但是、在第46行中、您使用的是 I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE、这只能读取一个数据、然后在总线上使 STOP 位生效。 同样、请阅读应用手册以完全了解要使用哪种标志进行您想要使用的操作类型。 "我不知道你在想什么。"  

     这一个非常重要。  

    替换代码中的所有位置:

    while (I2CMasterBusy (pI2cData->ui32I2cBus)
    {

    复选框。  

    while (! I2CMasterBusy (pI2cData->ui32I2cBus) //您必须使用此行才能解决某些已知问题(由于某些竞争)

                                          //硬件中的条件。
    {

    while (I2CMasterBusy (pI2cData->ui32I2cBus)
    {

    -你正在尝试使用 FIFO ,但我看不到你的代码中的任何地方,你将 FIFO 分配给主机进行传输和接收操作。 通常,您可以 调用 I2CTxFIFOConfigureSet ()为 主机或从机分配 FIFO,并设置中断的 FIFO 触发电平。 话虽如此、我认为在漫长的调试过程中、我强烈建议您不要使用 FIFO。 如果您的问题与 FIFO 设置有关、则在没有 FIFO 的情况下调试问题会简单得多。 我有以下建议。  

     a.将所有 FIFO 调用(例如 I2C_MASTER_CMD_FIFO_BURST_SEND_START)替换为 I2C_MASTER_CMD_BURST_SEND_START、以下命令也是如此。  

     b.注释掉 I2CMasterBurstLengthSet。

    -我真的要求你们查看应用手册,以便对如何使用 API 来执行各种操作有一个清晰的了解。 同样、您可以从非 FIFO 代码开始工作、然后再进行更高级的 FIFO 操作。  

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

    尊敬的 Charles:

    非常感谢 您的详细评论,我会按照您的建议进行更改。 实际上,这个函数是工作项目中的 i2c 驱动程序文件,我没有在其中做任何更改。 我按原样使用它、假设它是正确且有效的(我不知道它以前是如何工作的)。

    但我想我现在将为所有事务编写我自己的 i2c 驱动程序库文件。 我也将非常详尽地阅读应用手册。

    我请求您是否也可以在此 i2c 驱动程序库文件中检查其他函数。 我会在私人邮件中发送给您、因为我无法公开发布它们。

    您的读取操作也有问题。 将 ReadCount 设置为 stI2cData.ui32RxCount = 2。 但是、在第46行中、您使用的是 I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE、这只能读取一个数据、然后在总线上使停止位生效。

    然后、我如何读取2个字节?

    此致、

    Kiran

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

    基本上、如果要读取一个数据、就会使用 I2C_MASTER_CMD_SINGLE_RECEIVE。

    如果要连续读取两个数据、则将使用 I2C_MASTER_CMD_BURST_RECEIVE_START 进行第一次读取、然后使用 I2C_MASTER_CMD_BURST_RECEIVE_FINISH 进行第二次读取。 当然、如果您进行了两个单独的  I2C_MASTER_CMD_SINGLE_RECEIVE、但您需要检查从器件是否可以进行读取。 这是因为、如果您调用两个单独的 I2C_MASTER_CMD_SINGLE_RECEIVE、会在两者之间插入一个停止位。

    如果您有 N 个字需要读取、则将调用 I2C_MASTER_CMD_BURST_RECEIVE_START 来启动突发。 对于从1到 N-1的字、您将调用 I2C_MASTER_CMD_BURST_RECEIVE_CONT、对于最后一个字、您将调用  I2C_MASTER_CMD_BURST_RECEIVE_FINISH 以完成突发、以便置位停止位。  

    按照我的建议阅读应用手册、其中有非常清晰的说明。  

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

    尊敬的 Charles:

    我将代码更改如下

    void ioc_DiI2cRead(I2cStructType *pI2cData)
    {
        uint32_t ui32Index = 0;
        uint32_t ui32ErrCount;
    
        I2CMasterEnable(pI2cData->ui32I2cBus);
    
        //if true - 400Khz, False - 100Khz
        I2CMasterInitExpClk(pI2cData->ui32I2cBus, 120000000, true);
    
        I2CMasterSlaveAddrSet(pI2cData->ui32I2cBus,
                                             pI2cData->i2cSlaveAddress, false);
    
       // I2CMasterBurstLengthSet(pI2cData->ui32I2cBus, pI2cData->ui32TxCount);
    
       // I2CMasterControl(pI2cData->ui32I2cBus,
         //                           I2C_MASTER_CMD_FIFO_BURST_SEND_START);
        I2CMasterControl(pI2cData->ui32I2cBus,
                                        I2C_MASTER_CMD_BURST_SEND_START);
        for(ui32Index = 0; ui32Index < pI2cData->ui32TxCount; ui32Index++)
        {
            I2CFIFODataPut(pI2cData->ui32I2cBus,
                                           *(pI2cData->pui8DataTx+ui32Index));
        }
    
    //    while(I2CMasterBusy(pI2cData->ui32I2cBus))
      //  {
    
        //}
    
        while(!I2CMasterBusy(pI2cData->ui32I2cBus))
        {
    
        }
    
        ui32ErrCount = I2CMasterErr(pI2cData->ui32I2cBus);
        if(ui32ErrCount != I2C_MASTER_ERR_NONE)
        {
            Event_post(Event_Fault_Handler, Event_Id_00);
        }
        I2CMasterDisable(pI2cData->ui32I2cBus);
    
        I2CMasterEnable(pI2cData->ui32I2cBus);
    
        /*if true - 400Khz, False - 100Khz */
        I2CMasterInitExpClk(pI2cData->ui32I2cBus, 120000000, true);
    
        I2CMasterSlaveAddrSet(pI2cData->ui32I2cBus,
                                             pI2cData->i2cSlaveAddress, true);
       // I2CMasterBurstLengthSet(pI2cData->ui32I2cBus, pI2cData->ui32RxCount);
    
        I2CMasterControl(pI2cData->ui32I2cBus,  I2C_MASTER_CMD_SINGLE_RECEIVE);
    //                     I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE);
    
        //while(I2CMasterBusy(pI2cData->ui32I2cBus))
        //{
    
        //}
    
        while(!I2CMasterBusy(pI2cData->ui32I2cBus))
        {
    
        }
        ui32ErrCount = I2CMasterErr(pI2cData->ui32I2cBus);
        if(ui32ErrCount != I2C_MASTER_ERR_NONE)
        {
            Event_post(Event_Fault_Handler, Event_Id_00);
        }
        for(ui32Index = 0; ui32Index < pI2cData->ui32RxCount; ui32Index++)
        {
            *(pI2cData->pui8DataRx+ui32Index) =
                                         I2CFIFODataGet(pI2cData->ui32I2cBus);
        }
        I2CMasterDisable(pI2cData->ui32I2cBus);
    }
    

    以下是范围结果

    这之后我从

    /* for (ui32Index = 0;ui32Index < pI2cData->ui32TxCount;ui32Index++)
    {
    I2CFIFODataPut (pI2cData->ui32I2cBus、
    *(pI2cData->pui8DataTx+ui32Index);
    }*/

    至  I2CMasterDataPut (I2C0_BASE、pI2cData->pui8DataTx);

    void ioc_DiI2cRead(I2cStructType *pI2cData)
    {
        uint32_t ui32Index = 0;
        uint32_t ui32ErrCount;
    
        I2CMasterEnable(pI2cData->ui32I2cBus);
    
        //if true - 400Khz, False - 100Khz
        I2CMasterInitExpClk(pI2cData->ui32I2cBus, 120000000, true);
    
        I2CMasterSlaveAddrSet(pI2cData->ui32I2cBus,
                                             pI2cData->i2cSlaveAddress, false);
    
       // I2CMasterBurstLengthSet(pI2cData->ui32I2cBus, pI2cData->ui32TxCount);
    
       // I2CMasterControl(pI2cData->ui32I2cBus,
         //                           I2C_MASTER_CMD_FIFO_BURST_SEND_START);
        I2CMasterControl(pI2cData->ui32I2cBus,
                                        I2C_MASTER_CMD_BURST_SEND_START);
        //specify register to be read
        I2CMasterDataPut(I2C0_BASE, pI2cData->pui8DataTx);
    
    /*    for(ui32Index = 0; ui32Index < pI2cData->ui32TxCount; ui32Index++)
        {
            I2CFIFODataPut(pI2cData->ui32I2cBus,
                                           *(pI2cData->pui8DataTx+ui32Index));
        }*/
    
    //    while(I2CMasterBusy(pI2cData->ui32I2cBus))
      //  {
    
        //}
    
        while(!I2CMasterBusy(pI2cData->ui32I2cBus))
        {
    
        }
    
        ui32ErrCount = I2CMasterErr(pI2cData->ui32I2cBus);
        if(ui32ErrCount != I2C_MASTER_ERR_NONE)
        {
            Event_post(Event_Fault_Handler, Event_Id_00);
        }
        I2CMasterDisable(pI2cData->ui32I2cBus);
    
        I2CMasterEnable(pI2cData->ui32I2cBus);
    
        /*if true - 400Khz, False - 100Khz */
        I2CMasterInitExpClk(pI2cData->ui32I2cBus, 120000000, true);
    
        I2CMasterSlaveAddrSet(pI2cData->ui32I2cBus,
                                             pI2cData->i2cSlaveAddress, true);
       // I2CMasterBurstLengthSet(pI2cData->ui32I2cBus, pI2cData->ui32RxCount);
    
        I2CMasterControl(pI2cData->ui32I2cBus,  I2C_MASTER_CMD_SINGLE_RECEIVE);
    //                     I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE);
    
        //while(I2CMasterBusy(pI2cData->ui32I2cBus))
        //{
        //}
    
        while(!I2CMasterBusy(pI2cData->ui32I2cBus))
        {
    
        }
        ui32ErrCount = I2CMasterErr(pI2cData->ui32I2cBus);
        if(ui32ErrCount != I2C_MASTER_ERR_NONE)
        {
            Event_post(Event_Fault_Handler, Event_Id_00);
        }
        for(ui32Index = 0; ui32Index < pI2cData->ui32RxCount; ui32Index++)
        {
            *(pI2cData->pui8DataRx+ui32Index) =
                                         I2CFIFODataGet(pI2cData->ui32I2cBus);
        }
        I2CMasterDisable(pI2cData->ui32I2cBus);
    }

    我获得了以下示波器捕获

    然后我改变了  

    /* for (ui32Index = 0;ui32Index < pI2cData->ui32RxCount;ui32Index++)
    {
    *(pI2cData->pui8DataRx+ui32Index)=
    I2CFIFODataGet (pI2cData->ui32I2cBus);
    }*/

    至  

    *(pI2cData->pui8DataRx)= I2CMasterDataGet (pI2cData->ui32I2cBus);

    void ioc_DiI2cRead(I2cStructType *pI2cData)
    {
        uint32_t ui32Index = 0;
        uint32_t ui32ErrCount;
    
        I2CMasterEnable(pI2cData->ui32I2cBus);
    
        //if true - 400Khz, False - 100Khz
        I2CMasterInitExpClk(pI2cData->ui32I2cBus, 120000000, true);
    
        I2CMasterSlaveAddrSet(pI2cData->ui32I2cBus,
                                             pI2cData->i2cSlaveAddress, false);
    
       // I2CMasterBurstLengthSet(pI2cData->ui32I2cBus, pI2cData->ui32TxCount);
    
       // I2CMasterControl(pI2cData->ui32I2cBus,
         //                           I2C_MASTER_CMD_FIFO_BURST_SEND_START);
        I2CMasterControl(pI2cData->ui32I2cBus,
                                        I2C_MASTER_CMD_BURST_SEND_START);
        //specify register to be read
        I2CMasterDataPut(I2C0_BASE, pI2cData->pui8DataTx);
    
    /*    for(ui32Index = 0; ui32Index < pI2cData->ui32TxCount; ui32Index++)
        {
            I2CFIFODataPut(pI2cData->ui32I2cBus,
                                           *(pI2cData->pui8DataTx+ui32Index));
        }*/
    
    //    while(I2CMasterBusy(pI2cData->ui32I2cBus))
      //  {
    
        //}
    
        while(!I2CMasterBusy(pI2cData->ui32I2cBus))
        {
    
        }
    
        ui32ErrCount = I2CMasterErr(pI2cData->ui32I2cBus);
        if(ui32ErrCount != I2C_MASTER_ERR_NONE)
        {
            Event_post(Event_Fault_Handler, Event_Id_00);
        }
        I2CMasterDisable(pI2cData->ui32I2cBus);
    
        I2CMasterEnable(pI2cData->ui32I2cBus);
    
        /*if true - 400Khz, False - 100Khz */
        I2CMasterInitExpClk(pI2cData->ui32I2cBus, 120000000, true);
    
        I2CMasterSlaveAddrSet(pI2cData->ui32I2cBus,
                                             pI2cData->i2cSlaveAddress, true);
       // I2CMasterBurstLengthSet(pI2cData->ui32I2cBus, pI2cData->ui32RxCount);
    
        I2CMasterControl(pI2cData->ui32I2cBus,  I2C_MASTER_CMD_SINGLE_RECEIVE);
    //                     I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE);
    
        //while(I2CMasterBusy(pI2cData->ui32I2cBus))
        //{
        //}
    
        while(!I2CMasterBusy(pI2cData->ui32I2cBus))
        {
    
        }
        ui32ErrCount = I2CMasterErr(pI2cData->ui32I2cBus);
        if(ui32ErrCount != I2C_MASTER_ERR_NONE)
        {
            Event_post(Event_Fault_Handler, Event_Id_00);
        }
      /*  for(ui32Index = 0; ui32Index < pI2cData->ui32RxCount; ui32Index++)
        {
            *(pI2cData->pui8DataRx+ui32Index) =
                                         I2CFIFODataGet(pI2cData->ui32I2cBus);
        }*/
        *(pI2cData->pui8DataRx) =   I2CMasterDataGet(pI2cData->ui32I2cBus);
    
        I2CMasterDisable(pI2cData->ui32I2cBus);
    }
    

    示波器捕获如下:

    但 LED IO 扩展器未运行(即使是基于首次更改的 SCL 或 SDA 无 SCL 或 SDA)。

    您能分享您的反馈吗?

    谢谢。

    Kiran