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.

[参考译文] TCA9555:接口论坛

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1272231/tca9555-interface-forum

器件型号:TCA9555

您好!

在我的原理图中、我准备了一组应用数字输入的 IO 扩展器、并正在读取这些 IO 扩展器的中断输出、然后根据这些中断、驱动另一组相应的 IO 扩展器、在这些扩展器上 打开或关闭 LED。

请参阅我的帖子:TM4C1294NCPDT:RTOS I2C 驱动程序:需要使用不同的 I2C 总线(枚举中未定义)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

以了解该问题的详细信息。

如果有什么我可以尝试使它工作、或者您还有什么要问的东西、请提供建议。

此致、

Kiran

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

    目前尚不清楚 TCA9555的问题是什么。

    您是否设置了配置寄存器?

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

    尊敬的 Kiran:

    这是您在上一个线程中看到的主要问题吗?  

    您已将12个 P 端口设置为输入、无法读取中断。 是这样吗?  

    您可以读取所有寄存器吗?  

    此致、

    泰勒

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

    你好、Clemens 和 Tyler、

    我们的电路板具有一组三个 IO 扩展器、可在这些扩展器上应用数字输入、并分别处理三个中断处理程序。  以及一组三个 IO 扩展器、通过这些扩展器可从这些中断内驱动相应的 LED。 它们共享通用的 I2C 线路但地址不同。

    您已将12个 p 端口设置为输入,无法读取中断。 这是否正确?

    我们可以读取中断、但无法通过这些中断驱动所有三个 IO 扩展器上的 LED。  

    目前尚不清楚 TCA9555的问题是什么。

    您是否设置了配置寄存器?

    [/报价]

    是的、我要设置配置寄存器、请参阅下面的代码。

     stI2cData.ui32I2cBus = I2C2_BASE;
        stI2cData.i2cSlaveAddress = LEDONE_SLAVEADDRESS;
        stI2cData.ui32TxCount = 3;
        stI2cData.ui32RxCount = 0;
        stI2cData.pui8DataRx = ui8RxBuf;
        ui8TxBuf[0] = 0x06;
        ui8TxBuf[1] = 0x00;
        ui8TxBuf[2] = 0x00;
        stI2cData.pui8DataTx = ui8TxBuf;
        i2cTivaLibTransfer(&stI2cData);
        ui8TxBuf[0] = 0x02;
        ui8TxBuf[1] = 0xFF;
        ui8TxBuf[2] = 0xFF;
        stI2cData.pui8DataTx = ui8TxBuf;
        i2cTivaLibTransfer(&stI2cData);
        SysCtlDelay(1000);
    
        /* Configuring Digital output LED as Output pins */
        stI2cData.ui32I2cBus = I2C2_BASE;
        stI2cData.i2cSlaveAddress = LEDTWO_SLAVEADDRESS;
        stI2cData.ui32TxCount = 3;
        stI2cData.ui32RxCount = 0;
        stI2cData.pui8DataRx = ui8RxBuf;
        ui8TxBuf[0] = 0x06;
        ui8TxBuf[1] = 0x00;
        ui8TxBuf[2] = 0x00;
        stI2cData.pui8DataTx = ui8TxBuf;
        i2cTivaLibTransfer(&stI2cData);
        ui8TxBuf[0] = 0x02;
        ui8TxBuf[1] = 0xFF;
        ui8TxBuf[2] = 0x0F;
        stI2cData.pui8DataTx = ui8TxBuf;
        i2cTivaLibTransfer(&stI2cData);
        SysCtlDelay(1000);
    
        stI2cData.ui32I2cBus = I2C2_BASE;
        stI2cData.i2cSlaveAddress = LEDTHREE_SLAVEADDRESS;
        stI2cData.ui32TxCount = 3;
        stI2cData.ui32RxCount = 0;
        stI2cData.pui8DataRx = ui8RxBuf;
        ui8TxBuf[0] = 0x06;
        ui8TxBuf[1] = 0x00;
        ui8TxBuf[2] = 0x00;
        stI2cData.pui8DataTx = ui8TxBuf;
        i2cTivaLibTransfer(&stI2cData);
        ui8TxBuf[0] = 0x02;
        ui8TxBuf[1] = 0x00;
        ui8TxBuf[2] = 0x00;
        stI2cData.pui8DataTx = ui8TxBuf;
        i2cTivaLibTransfer(&stI2cData);
    

    #define LEDONE_SLAVEADDRESS               0x27
    #define LEDTWO_SLAVEADDRESS               0x26
    #define LEDTHREE_SLAVEADDRESS             0x24

    下图是 LED IO 扩展器和数字输入 IO 扩展器的原理图。

                         

    在我的所有中断处理程序中、一组 LED 正常亮起、但单独驱动时第2组或第3组 LED 未正常亮起、但当与同一中断处理程序中的第一组 LED 结合使用时、它们仍亮起。

    请说明可能的原因。

    此致、

    Kiran

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

    尊敬的 Kiran:

    我明天会回复您。  

    此致、

    泰勒

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

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

    在另一篇文章中有许多示波器轨迹、但它们很难与您的代码关联。 未能使其 LED 亮起的 I/O 扩展器的地址是24/26/27? 您是否在示波器上看到了对该地址(在正确的总线上)的写入事务?

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

    您好、Clemens:

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

    如何检查此情况?

    目前、我面临一个仅启用第三个中断处理程序的问题(即仅初始化第三个数字输入 IO 扩展器和第三个 LED IO 扩展器、从 PCB 上移除前两个 LED IO 扩展器)。 并非所有 LED 都会按预期发光、但组中的随机 LED 很少会发光。

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

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

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

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

    谢谢。

    Kiran

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

    捕获显示读取事务从未完成。 我猜微控制器实际上还没有读取该字节。

    器件24的两个写入事务仅写入寄存器编号、而不写入寄存器值。

    这些看起来像是软件错误。 我对您的 μ I²C 库的了解不够、不足以帮助您。

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

    尊敬的 Kiran:

    我很难从示波器捕获中看出这一点、因为我无法在 SDA 上看到单个位、但您是否遵循了数据表中关于向 TCA9555的内部寄存器写入/读取/读取的指导原则?  

    寄存器寻址的格式可在数据表中找到。  

    例如、从寄存器读取:

    这要求首先发送器件地址、然后是选择要寻址的内部寄存器(即输入端口寄存器)的命令字节、最后是从该寄存器读取的相应数据。  

    对于写入:

    采用类似的方式、但使用写入位、器件地址、命令字节地址、然后将数据写入寄存器。  

    TCA9555还支持寄存器对中的自动递增。 例如、如果您正在从端口0读取、在成功的 ACK 之后、接下来读取的信息将来自端口1。 它会自动递增 I2C 状态机中的指针以自动从下一个端口#读取数据、从而减少读取所有16位所需发送的字节数、最终节省了 I2C 总线的带宽。  

    此致、

    泰勒

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

    你好、Clemens 和 Tyler、

    感谢您的答复。

    如果从寄存器读取数据、I2C 事务的突发计数(或 Tx 以及 Rx 字节计数)应该是多少? Tx 计数应该为3、而 Rx 字节计数应该为1?

    谢谢。

    Kiran

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

    为寄存器地址写入一个字节、为寄存器值读取一个字节。 (写入多个字节会写入寄存器。)

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

    尊敬的 Kiran:

    看起来您要写入3个 Tx 字节和1个 Rx 字节来从端口寄存器读取数据。 但它可以是任意数量的 Rx、因为该器件具有自动递增功能、允许您以重复的启动条件从端口0和端口1连续读取。  

    此致、

    泰勒

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

    您好!

    我从 IO 扩展器/示波器读取后得到以下示波器捕获

    当我们在第一个引脚上应用输入时, 0x1似乎正确,但最后4个 MSB 位被配置为输出,即 P.14-17。

    那么、下一个字节是否正确读取?

    此致、

    Kiran

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

    寄存器0/1中的位始终显示引脚的当前状态。 P14…P17位为1、如果将它们配置为高输出、则正确。

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

    您好、Clemens:

    感谢您的答复。

    我对 I2C 线路的上拉电阻有一个疑问。

    如前所述、我们对共享同一条 I2C 线的 LED 使用三个 IO 扩展器。 我们将4.7K 用于上拉电阻。

    请参阅以下内容:

    IO 扩展器数据表中还有一条注意事项。 SLVA689

    上拉电阻的大小将影响 I2C 线路的电容。

    以及用于3 IO 扩展器的一条公共 I2C 线路。 是否应该更改上拉电阻值?

    此外、请分享您对这些要点的评论。

    此致、

    Kiran

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

    电容不仅取决于器件的数量、还取决于布线长度。

    在示波器迹线中、上升沿足够快、但几乎没有变化。 (如果时钟脉冲永远不会真正到达 VCC、将会出现问题。) 因此您的上拉电阻是可以的。 如果你希望安全的话、你可以把它们减少为3.3 kΩ 或2.2 kΩ。

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

    尊敬的 Kiran:

    上拉电阻的大小将影响 I2C 线路的电容。

    以及用于3 IO 扩展器的一条公共 I2C 线路。 是否应该更改上拉电阻值?

    此外、请分享您对这些要点的评论。

    [/报价]

    首先、更改上拉电阻当然不会改变 I2C 线路上的寄生电容。 上拉电阻器强度的变化将影响 RC 时间常数、从而影响上升时间。 正如 Clemens 建议的那样、将上拉电阻值从3.3k 降至2.2k、可增加上拉强度、从而缩短上升时间。 这也会影响电路的 VOL、也需要考虑这一点。  

    我附上了一份应用手册、其中介绍了如何在设定的总线电容和数据速率下计算有效的最小和最大上拉电阻。  

    https://www.ti.com/lit/an/slva689/slva689.pdf?ts = 1695396308449&ref_url=https%253A%252F%252Fwww.google.com%252F

    此致、

    泰勒

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

    您好!

    I2C 通信正常。 我需要帮助解决另一个问题。

    在我的原理图中、我有一个拉电流/灌电流逻辑 GPIO 引脚、IO 扩展器的极性基于该引脚相反。  

    因此、已解决的读取操作问题是针对 受电方 逻辑的。  在我的 接收器 逻辑中、I2C 读取操作和工程(LED 和通过 GUI 进行数据通信)可以很好地工作。 请参阅下面的灌电流逻辑示波器捕获

                       

        第1个中断处理程序(0-11个数字 输入)                                           第2个中断处理程序(12-23个数字输入)

    但在 源 逻辑中、读取的 I2C 值与预期值不同(应该与在源逻辑中读取的值相反、因为我正在设置 TCA9555的内部极性反转寄存器中的极性反转位)。 但是、当我向数字输入 IO 扩展器的所有12位提供输入时(采用与上述 Source 逻辑情况类似的方式)、读取的值(反相极性后)应该为00 F0 (根据 ME)。 但范围结果如下:

                 

      第1个中断处理程序(应用0-11个输入时)                                   第1个中断处理程序(删除0-11个输入后)

                           第2个中断处理器(应用12-23个输入时)                           第2个中断处理程序(删除12-23个输入后)         

    如果我在 IO 扩展器的输入位上应用极性反转、那么它对从输入寄存器(0x00和0x01)端口0和端口1读取的值有什么影响? 换句话说、在哪里可以看到极性反转的效果?

    设置了12个输入位极性反转的代码片段:

    aui8txBuffer[1] = 0;
        aui8txBuffer[2] = 0;
        stI2cConfig.vui8I2cBus = Board_I2C9;
        stI2cConfig.vui8slaveAddress = 0x27;
        stI2cConfig.ui8regaddr = 0x04;//polarity inversion register
        stI2cConfig.vui8writeCount = 3;
        stI2cConfig.vui8readCount = 0;
        stI2cConfig.pui8RxBuffer = aui8rxBuffer;
        aui8txBuffer[0] = 0x04;
    
        if ((Source_Sink_Sel1 >> 1) & 0x01)//if source
        {
           aui8txBuffer[1] = aui8txBuffer[1] | 0xFF;
           aui8txBuffer[2] = aui8txBuffer[2] | 0x0F;
        }

    请指导 源代码逻辑的问题在哪里。

    谢谢。

    Kiran

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

    尊敬的 Kiran:

    我明天必须在 CST 中午之前回到您的身边。

    此致、

    泰勒

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

    尊敬的 Kiran:

    我还在关注这个问题、而且必须在星期一与您联系。  

    此致、

    泰勒

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

    尊敬的 Kiran:

    [报价 userid="532865" url="~/support/interface-group/interface/f/interface-forum/1272231/tca9555-interface-forum/4834496 #4834496"]如果我对 IO 扩展器的输入位应用极性反转,那么它对从输入寄存器(0x00和0x01)端口0和端口1读取的值有什么影响? 换言之,在哪里可以看到极性反转的影响?

    将寄存器4和5 (极性反转寄存器)中的位置位时、会反转配置寄存器定义为输入的引脚的极性。 所有 P 端口在上电复位时都是默认输入、为特定端口中的特定位(从0到1)设置极性反转寄存器将使输入逻辑反相。 因此、例如、如果 P00被外部设置为1 (逻辑高电平)、当您读取输入端口寄存器时、您应该为输入端口寄存器中的该位读取逻辑0、因为极性是反转的。  

    (第1个中断处理程序0-11数字输入)-在此示波器捕获中、正在读取 TCA9555输入端口寄存器0和1。 所有输入为逻辑高电平(全部为1)。  

    (第2个中断处理程序12-23个数字输入)-在本范围内、我看到从机地址发生了变化。 这是总线上的另一个 TCA9555吗、或者 I2C 地址是否在 A0位更改时更改? 该示波器显示了对设置为逻辑高电平(全1)的所有输入的输入端口寄存器0和1的数字读取。  

    (应用0-11输入时的第1个中断处理程序)-示波器似乎显示对输入端口寄存器0的读取、P06 (引脚10) 显示逻辑高电平。 两个输入端口寄存器的其余输入均为低逻辑。  

    (删除0-11个输入后的第1个中断处理程序)-对输入端口寄存器0和1的读取显示 P00、P17、P16、P15、P14为逻辑低电平、而其余输入为逻辑高电平。  

    (输入12-23时的中断处理程序)-示波器显示了一个不同的从机地址。 0100110 (0x26十六进制)是另一个 TCA9555还是要更改地址? 从输入端口寄存器0开始进行读取。 P06读取逻辑高电平(1)、其余输入为逻辑低电平(0)。  

    (删除12-23个输入后的第2个中断处理程序)-再次使用从器件地址0x26。 数据现在在输入端口0和1上发生变化。 P03为逻辑低电平、而输入端口0的其余部分为逻辑高电平。 P12、P11、P10为逻辑高电平、而其余输入为逻辑低电平。  

    您是否确认了极性反转寄存器中的位符合您的预期? 您是否有示波器捕获来显示极性反转寄存器位、哪些位已设置、哪些位未设置?  

    示波器上正在读取的数据对我来说并没有太多了解。 您需要读取哪些数据? 数据似乎不一致。 我不知道输入端口寄存器读取是否正确。  

    好消息是、数据正在正确读取/写入、主器件和从器件都已正确确认、并且数据格式看起来正确。 总线上是否有两个不同的 TCA9555、或者您是否通过更改 A0来进行动态寻址?  

    此致、

    泰勒

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

    您好、Tyler:

    感谢您的答复。

    我还有一个与此相关的问题。

    在第三个电路板中、我有2个数字输入 IO 扩展器(1个有12个输入、第二个有4个数字输入)、1个 LED IO 扩展器有16个 LED、对应于上述两个 IO 扩展器的数字输入。

                  

                                            2个数字 IO 扩展器

                       LED IO 扩展器(对应于上述2个 IO 扩展器的16个数字输入)

    对于 LED 更新、由于2个数字输入 IO 扩展器的通道状态、我已经为发光 LED (在单个 IO 扩展器上)编写了以下代码

    void DILEDUpdate5(uint16_t channelStatus)
    {
        i2cConfigbus stI2cConfig;
        uint8_t aui8TxBuffer[4];
        uint8_t aui8RxBuffer[3];
    
        /* Configuration of Digital Input LED*/
        DEBUG_DRIVER("\nDigital Input LED Update\n");
        DEBUG_DRIVER_FLUSH();
    
        channelStatus = ~channelStatus;
    
        //aui8TxBuffer[1] = aui8TxBuffer[2] | ((channelStatus << 12) & 0xC0);
        aui8TxBuffer[1] = (channelStatus | 0xFF00 );
        aui8TxBuffer[2] = (channelStatus | 0x00FF );
    
        aui8TxBuffer[0] = DIO_OUTPUTREG_PORTONE;
        stI2cConfig.ui8regaddr = DIO_OUTPUTREG_PORTONE;
        stI2cConfig.vui8slaveAddress =  DI_LED_SLAVEADDRESS3;
        stI2cConfig.vui8I2cBus = Board_I2C2;
        stI2cConfig.pui8txbuffer = aui8TxBuffer;
        stI2cConfig.pui8RxBuffer = aui8RxBuffer;
        stI2cConfig.vui8writeCount = 3;
        stI2cConfig.vui8readCount = 0;
        DigitalLEDI2CTransfer(&stI2cConfig);
    
    }

    其中 channelStatus 是从两个数字输入 IO 扩展器的输入寄存器读取的16位值。

    我将分别从第1个和第2个中断处理程序的2个事件调用、如下所示:

    IoC_DILEDUpdate5(ui16RawChannelStatus4);

    其中

    ui16RawChannelStatus3 =(*(pui8DiRawStatus3 + 0)和0xFFFF)|
    ((*(pui8DiRawStatus3 + 1)<< 8)和0xFFFF);

    ui16RawChannelStatus4 =(*(pui8DiRawStatus4 + 0)& 0x000F);

    此外、  

    pui8DiRawStatus3 =(uint8_t*) stI2cConfig.pui8RxBuffer;//从第一个 dig 输入 IO 扩展器的输入寄存器端口0读取数据

    pui8DiRawStatus4 =(uint8_t*) stI2cConfig.pui8RxBuffer;//从 第二个 dig 输入 IO 扩展器的输入寄存器端口0读取数据

    但在最后4个输入时没有 LED 亮起、开始的8个 LED 会跟随活动的数字输入通道亮起。

    要读取的 DIG 输入和写入 LED IO 扩展器的数据的示波器捕获为:

    DIG IO 扩展器数据读取

     \

    LED IO 扩展器(输出)

    因此、根据该信息、只有一个输出将在 LED IO 扩展器中发光、但没有 LED 亮起

    如果需要更改 LED 代码中的任何内容、请提供指南。

    此致、

    Kiran

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

    尊敬的 Kiran:

    我对你想要实现的目标感到非常困惑。 您希望从 LED 输出中看到什么? 您能否具体说明您希望输出哪个 IO 以使 LED 亮起、以及您希望输出哪个 IO 以使 LED 熄灭? 从这里、我可以更好地分析示波器捕获、以获取正确的信息。  

    我无法真正分析代码以检查其是否正确、因为我不知道您要使用 LED 实现什么目标。 请告诉我您的目标、然后我会相应回复。

    如果不得不猜、似乎您已正确连接 IO 扩展器、但 LED 输出不符合预期。 因此、我认为这是软件问题。  

    此致、

    泰勒