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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1250314/tca9555-getting-heating-issue-after-interface-with-rotary-switch

器件型号:TCA9555

您好!  

下面是 IO 扩展器与旋转开关连接的原理图。  

IC 仅放置在 PCB 板的底部。

最初、所有旋转开关都处于0位置、IC 主体温度为28摄氏度(通过万用表测量)。 当我们将旋转开关位置的设置从0更改为1时、温度每变化约增加10度。 W 逐个更改旋转开关位置。

当所有旋转开关都处于1位置时、IC 车身的温度为49摄氏度。

此温度变化位是否与 IC 和 IC 功能有关?

请分享您的评论和建议。

此致、

基兰吉特     

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

    原理图中没有位置"0"。

    TCA9555的配置寄存器的值是什么?

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

    您好、Clemens:

    原理图中没有位置"0"

    下面是开关和真值表的图像:

    TCA9555的配置寄存器的值是什么?

    能否谈谈温度问题? 这种加热效应是否正常?  

    请分享一些意见以解决此问题。

    谢谢。

    Kiran  

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

    尊敬的 Kiran:

    一般而言、芯片的表面温度表明芯片消耗的电流过大(导致过热)、或者芯片在重负载下工作。  

    确保不会损坏芯片的方法是获取表面温度、计算器件的结温并将其与数据表中的绝对最大条件进行比较。  

    TCA9555的绝对最大结温为100°C。 任何高于此值的结温、TI 无法再保证器件性能、也无法保证器件不会受到任何永久性损坏。  

    其中、

    TJ =结温

    Tc =最高外壳温度(在中间测量的 IC 表面)  

    ψJT =结至顶部特征参数

    功率=芯片的总功率耗散

    从您的意见中、我不知道系统的确切功率耗散、但如果我们要使用最大条件计算、我们会得出

    (TJ (max)-   ψJT)/Δ t = POWER (max)  

    (100C - 49C)/ 11.1 C/W = 4.595瓦。  

    因此、系统中使用的 IC 在采用 TSSOP 封装时、在49C 的温度下最高可消耗4.595瓦的功率、而不会损坏器件。 如果功耗超过计算值、则可能会因超出绝对最大值条件而损坏 IC。  

    我猜测其中一个 GPIO 引脚已配置为输出、并且某处存在一个输出、用于将高电压驱动至输出端和旋转开关之间的 GND。 我假设旋转开关的导通状态电阻有点小、对 GND 的负载较大。 对于输入、这是可以的、但对于输出、这会消耗大量电流、以至于您见证了可能影响 IC 的表面温度。  

    请查看 Clemens 对寄存器状态的评论。 如果您可以读取该器件、那么寄存器0x00 - 0x03会从该器件读回什么内容?  

    此致、

    泰勒

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

    从器件地址看起来是正确的。 但我不明白命令字节的值0x8C;唯一的有效值是0…7。 请显示初始化 TCA9555寄存器的代码。

    像 Tyler 一样、我怀疑引脚被配置为输出一个高电平信号、当线路从外部短接至 GND 时会产生大电流。 请读取所有八个寄存器的值。

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

    您好、Clemens:

    所有引脚目前都被配置为输入。 我也不清楚值0x8C、因为这是一个参考代码、但我会尝试将其更改为配置寄存器的地址、看看是否有差异。

    如果我读回这些寄存器、它们会描述什么?

    如何在终端窗口中显示这些读取值?

    此致、

    Kiran

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

    尊敬的 Kiran:

    我同意克莱门斯的观点。 当 A2/A1/A0 = H 时、从器件地址看起来是正确的、如原理图中所示。  

    0x8C 不是配置寄存器的正确地址。 若要访问端口0和1的配置寄存器、需要按照数据表中所述将命令字节设置为0x06和0x07。

    读取输入端口寄存器(0x00/0x01)将反映引脚的输入逻辑电平、与配置寄存器将引脚定义为输入还是输出无关。  

    读取输出端口寄存器(0x02/0x03)将反映控制输出选择的触发器内部的值。 而非实际引脚值。  

    读取极性反转寄存器(0x04/0x05)将显示极性反转寄存器(默认值为0x00)的内容、  

    读取配置寄存器(0x06/0x07)将显示配置寄存器内的内容、告诉用户将哪些 P 端口配置为输出或输入。 如果是输出、那么相应的位将读为"0"、如果相应的位是输入、读取将产生"1"。

    在没有任何器件配置的情况下、在上电时读取配置寄存器应读取值0xFF、因为 p 端口的默认状态是在成功上电复位条件时输入的。

    此致、

    泰勒

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

    请显示初始化 TCA9555寄存器的代码。

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

    你好、Clemens 和 Tyler、

    很抱歉回复延迟。  

    我们在硬件和固件级别调查了此问题。

    原理图如下所示:

    突出显示的绿色端口用作输出端口、其余端口用作输入端口。

    我们有两块设计相同的 PCB 板。 但一个板具有 TCA9555 IO 扩展器、另一个板具有 CAT9555FYI。

    我们在对两个板进行热分析时看到的结果。

    1. TCA9555 IC 加热到61度。
    2. CAT9555 IC 仅加热到41度。

    请提供您对以下要点的评论:

    1.为什么会得到 TCA9555和 CAT9555之间的温差? 但两者使用的设计是相同的吗?

    2.  Onsemi (CAT9555)和 TI (TCA9555)之间是否存在可能导致这种发热的规格和/或操作差异?

    此致、

    Kiran

    3. TCA9555 I2C 扩展器能够同时支持输入和输出而不会产生发热效应?

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

    我想 TCA9555具有更高的驱动强度、因此在其输出短路时会产生更大的电流。

    请读取所有八个寄存器的值、并显示初始化寄存器的代码。

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

    您好、Clemens:

    感谢您的答复!!

    以下是 TCA9555的热分布。

    附加代码:  

    #include "ioc_main.h"
    #include <stdio.h>
    #include <string.h>
    #include <stdbool.h>
    #include <ti/drivers/GPIO.h>
    #include "driverlib/sysctl.h"
    #include <ti/sysbios/knl/Task.h>
    #include <xdc/runtime/System.h>
    #include "ioc_debug.h"
    #include "drivers/i2c/ioc_i2c.h"
    #include "drivers/led/ioc_led.h"
    #include "Board.h"
    #include "../ioc_config.h"
    
    #define LEDONE_SLAVEADDRESS             0x27
    #define LEDTWO_SLAVEADDRESS             0x26
    
    uint8_t ui8TxBuf[3], ui8RxBuf[3];
    
    volatile bool bModuleLedFlag;
    
    /**
     *******************************************************************************
     * @file 		ioc_led.c
     * @ingroup     led
     *
     * @function	StatusLEDConfig()
     *
     * @brief
     *      		This function will be used for configuring digital IO LED's
     * *
     * @param       Null
     *
     * @return      Null
     *
     ******************************************************************************/
    void StatusLEDConfig()
    {
    #if(defined USE_DI && defined USE_DO)
        SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2);
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
    
        GPIOPinConfigure(GPIO_PP5_I2C2SCL);
        GPIOPinConfigure(GPIO_PN4_I2C2SDA);
    
        GPIOPinTypeI2CSCL(GPIO_PORTP_BASE, GPIO_PIN_5);
        GPIOPinTypeI2C(GPIO_PORTN_BASE, GPIO_PIN_4);
    
        I2cStructType stI2cData;
        /* Configuring Digital input LED as Output pins */
        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] = 0xCF;
        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);
    #endif
    }
    

    #define LED_NETWORKRED                  0x0110
    #define LED_NETWORKGREEN                0x0120
    #define LED_NETWORKAMBER                0x0130
    
    #define LED_MODULERED                   0x0140
    #define LED_MODULEGREEN                 0x0180
    #define LED_MODULEAMBER                 0x01C0
    
    /*#define MOD_RED     0x40
    #define MOD_GREEN   0x80
    #define MOD_AMBER   0xC0
    
    #define NET_RED     0x10
    #define NET_GREEN   0x20
    #define NET_AMBER   0x30
    */
    
    #define MOD_RED     0x20
    #define MOD_GREEN   0x80
    #define MOD_AMBER   0xA0
    
    #define NET_RED     0x10
    #define NET_GREEN   0x40
    #define NET_AMBER   0x50
    
    #define DI_LED_SLAVEADDRESS             0x27
    #define DO_LED_SLAVEADDRESS             0x26
    
    #define CONFIG_DIGITALINPUTLED          0xF000
    #define CONFIG_DIGITALOUTPUTLED         0xFFFF
    
    
    
    /* LED Configuration data Marcos */
    #define LED_CONFIG_COMMANDBYTE         0xBC
    #define LED_CONFIG_DATAVALUE                   0x00
    #define LED_SLAVEADDRESS                       0x27
    #define LED_CONFIG_WRITECOUNT          4
    #define LED_CONFIG_READCOUNT           0
    
    /* LED Output Register/ Status Read Data Macros */
    #define LED_OUTPUTREG_COMMANDBYTE             0x84
    #define LED_UPDATE_WRITECOUNT           1
    #define LED_UPDATE_READCOUNT            3
    

    请浏览上述信息、如果您有任何其他需要、请告诉我。

    提前感谢。

    此致、

    Kiran

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

    显然、代码会混淆输出端口寄存器(2、3)和配置寄存器(6、7)。

       stI2cData.pui8DataRx = ui8RxBuf;
       ui8TxBuf[0]= 0x06;
       ui8TxBuf[1]= 0x00;
       ui8TxBuf[2]= 0x00;
       stI2cData.pui8DataTx = ui8TxBuf;
       i2cTivaLibTransfer (&stI2cData);

    这样可以将所有十六个引脚配置为输出。 但是、您要成为输入的引脚必须配置为1位:

       ui8TxBuf[0]= 0x06;
       ui8TxBuf[1]= 0xFF
       ui8TxBuf[2]= 0x0F

    (第二个文件中的符号实际上不会被使用。 您应该清理它们。)

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

    您好、Clemens:

    抱歉、参考中使用了之前的代码片段、请找到目前正在使用的初始配置的以下代码片段  


    #define ROTARY_CONFIG_COMMANDBYTE       0x06
    #define ROTARY_CONFIG_DATAVALUE         0xFF
    
    #define ROTARY_SLAVEADDRESS				0x27
    #define ROTARY_I2CBUS                   1
    #define ROTARY_CONFIG_WRITECOUNT        3
    #define ROTARY_CONFIG_READCOUNT         0
    
    /* Rotary Input register Data Macros */
    #define ROTARY_INPUTREG_COMMANDBYTE 	0x00
    #define ROTARY_INPUTREG_WRITECOUNT		1
    #define ROTARY_INPUTREG_READCOUNT    	2
    

    void ioc_RotaryWriteConfiguration()
    {
    	i2cConfigbus stI2cConfig;
        uint8_t aui8TxBuffer[ROTARY_CONFIG_WRITECOUNT];
        uint8_t aui8RxBuffer[ROTARY_CONFIG_READCOUNT];
    
        aui8TxBuffer[0] = ROTARY_CONFIG_COMMANDBYTE;
        aui8TxBuffer[1] = ROTARY_CONFIG_DATAVALUE;
        aui8TxBuffer[2] = 0x0F;
    
    	stI2cConfig.pui8txbuffer = aui8TxBuffer;
    	stI2cConfig.vui8I2cBus = Board_I2C1;
    	stI2cConfig.vui8writeCount = ROTARY_CONFIG_WRITECOUNT;
    	stI2cConfig.vui8readCount  = ROTARY_CONFIG_READCOUNT;
    	stI2cConfig.pui8RxBuffer = aui8RxBuffer;
    	stI2cConfig.vui8slaveAddress = ROTARY_SLAVEADDRESS;
    
    	ioc_I2cWrite(&stI2cConfig);
    }

    请分享您的评论/建议。

    此致、

    基兰吉特

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

    这段代码看起来是正确的。

    但为了安全起见、请读回所有八个寄存器。

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

    您好、Clemens:

    我将读回内部寄存器、但如何/如何打印读取的值?

    此致、

    基兰吉特

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

    尊敬的 Kiranjit:

    在编码 IDE 中,是否可以将读取值存储在变量或 int 中,然后读取 IDE 中的存储容器?  

    此外、该线程将沿不同的方向运行。  

    为了解决61C 的问题、它仍处于 TA 温度之下。 只要考虑到 ICC 电流或通过 GPIO 的最大输出电流、此温度对于器件是可以的。 需要注意的主要是电流消耗、并且不会超过绝对值。 条件。  

    与 ONSEMI 的 CAT9555器件相比、TCA9555可能只是输出强度差异、裸片差异、对于电流消耗为何不同、没有一个明确的答案、除了它们是具有不同设计和相似功能的不同器件。  

    TCA9555芯片的温度是否对您的系统产生了负面影响、或者您是否只是想知道温度高于 ONSEMI 器件的原因?  

    此致、

    泰勒

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

    您好、Tyler:

    感谢您的答复。

    在编码 IDE 中,可以将读取值存储在变量或 int 中,然后读取 IDE 中的存储容器吗?  [/报价]

    我会努力的。

    TCA9555芯片的温度是否对您的系统产生了负面影响、或者您是否只是想知道温度高于 ONSEMI 器件的原因?  

    >>如果在较高温度下持续工作、则可能会缩短 IC 寿命并降低功能。

    以下是温度 IC 相对于旋转开关位置的变化。 (原理图本身已经共享。)

    两个电路板设计相同、仅具有不同的 IO 扩展器 IC。

    请分享您的意见、以确定此发热问题的根本原因。

    此致、

    基兰吉特  

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

    尊敬的 Kiranjit:

    我没有确切的方法来确定这种发热问题的根本原因。 可能是 CAT9555的器件设计更好、且比 TCA9555的散热更好。 如果此问题是由同一器件但导致不同 IC 温度的两个 TCA9555器件引起的问题、我想知道发生这种情况的原因。  

    因为它涉及两个不同的厂商生产的两个芯片、所以除了 CAT9555可能是更好的散热设计外、我不确定导致的发热结果。  

    只需快速了解一下 ABS。 最大规格的规格。 CAT9555的额定温度为150C、TCA9555的额定温度为100C ABS。 最大 除此之外、我相信会导致 ABS 的两款器件之间存在重大内部差异。 最大结温比 TI 器件高50C。  

    我唯一的建议是使用负载较弱的开关。 旋转开关在某些位置似乎消耗了过多的电流。  

    此致、

    泰勒