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.

[参考译文] TCA8418:TCA8418关键问题

Guru**** 2451970 points
Other Parts Discussed in Thread: TCA8418

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/611019/tca8418-tca8418-key-issue

器件型号:TCA8418

大家好、

客户正在使用 TCA8418。 附件中提供了原理图及其代码。 请检查附件。

其设计如下:

(1)。 COL0-COL4和 ROW0-Row3 组合为4*5键盘;

(2)。  ROW4-ROW6和 COL7-COL8是 GPI。  
(3)。 ROW7、COL5和 COL6是 GPO。 未使用 COL9。
2.他们的软件设计:
(1)。 初始化配置(void TCA8418_init (void))。
(2)。  读取密钥事件并清除 TCA8418关联的标志(void hand_TCA8418_event (void)。  void hand_TCA8418_event (void)函数
在 MCU  外部中断函数中调用。
3.问题:
Q1:当 RoW4为高电平然后跳转到低电平时、INT 引脚会下拉至低电平、INT 引脚会保持低电平、这是不可能的  
跳至高电平。 然后  、TCA8418不工作、无法生成正常中断信号来通知 MCU。  
代码中间件未收到密钥消息。  客户的要求是 将 ROW4引脚 初始化为低电平、如果检测到该引脚、则进行初始化
然后、在循环之后、将其设置为高电平。 原因是什么?
Q2:当 INT 引脚下拉至低电平时、读取所有 寄存 器、INT_STAT 和 GPIO_INT_STAT1寄存器值不是0。
然后清除 INT_STAT 和 GPIO_INT_STAT1寄存器值、然后将 INT 引脚上拉为高电平。 则 TCA8418可以正常工作。
   当 INT 引脚下拉至低电平时、为什么 INT_STAT 和 GPIO_INT_STAT1寄存器值不为0?

祝你一切顺利、
张美键
亚洲客户支持中心
应用工程师

 e2e.ti.com/.../1452.code.txt

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

    Mickey、您好!

    我没有足够的时间来回答您的问题和编写代码。 明天我会收到你的回复。  很抱歉耽误你的时间。

    -弗朗西斯·胡德

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

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

    您好、fhude、

    你有更新吗? 客户正在等待我的回复。

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

    Mickey、您好!

    Q1: 我认为他们不会向 INT_STAT 寄存器中的 K_INT 位写入1以清除 INT 引脚。

    问题2: 我对这个问题有点困惑。  当 INT 引脚变为低电平 时、器件的运行方式与此类似、这意味着发生了某种情况、某个位的状态发生了变化(生成中断)、并且 INT 状态标志从0更改为1。  如果清除 INT_STAT 位、则会释放 INT 引脚并进入高电平状态。

    他们是否看到了不需要的中断????  如果是、他们可以发送什么寄存器设置、以便我确认他们已正确设置了该设置吗?

    -弗朗西斯·胡德

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mickey 和 Houde 您好:
    这是我的问题。 这就是代码。
    void IIC_delay (void)

    unsigend char DelayTime = 125;
    while (DelayTime--);


    空 TCA8418_RESET (空)

    GPIO_ResetBits (GPIOC、GPIO_PIN_10);//拉低reset引脚
    IIC_DELAY();
    IIC_DELAY();
    IIC_DELAY();
    IIC_DELAY();
    GPIO_SetBits (GPIOC、GPIO_PIN_10);//拉高reset引脚


    sendbyteTO_TCA8418 (xxx、xx);//向xxx寄存器中写入xx数据
    readbytefin_TCA8418 (xxx);//读取xxx寄存器的值


    void TCA8418_init (void)

    TCA8418_RESET ();
    IIC_DELAY();
    IIC_DELAY();
    IIC_DELAY();
    IIC_DELAY();
    sendbyteTO_TCA8418 (KP_GPIO1、0x0F);//向KP GPIO1寄存器写入0x0F μ s_k Ω、
    IIC_DELAY();
    sendbyteto_TCA8418 (KP_GPIO2、0x1F);
    IIC_DELAY();

    sendbyteTO_TCA8418 (GPIO_DIR1、0x80);
    IIC_DELAY();
    sendbyteTO_TCA8418 (GPIO_DIR2、0x60);
    IIC_DELAY();

    sendbyteTO_TCA8418 (GPIO_INT_EN1、0x70);
    IIC_DELAY();
    sendbyteTO_TCA8418 (GPIO_INT_EN2、0x80);
    IIC_DELAY();
    sendbyteTO_TCA8418 (GPIO_INT_EN3、0x01);
    IIC_DELAY();

    sendbyteTO_TCA8418 (GPIO_DAT_OUT1、0x00);
    IIC_DELAY();
    sendbyteTO_TCA8418 (GPIO_DAT_OUT2、0x00);
    IIC_DELAY();
    sendbyteTO_TCA8418 (GPIO_DAT_OUT3、0x00);
    IIC_DELAY();

    sendbyteTO_TCA8418 (CFG、0x53);//CFG = 0x01
    IIC_DELAY();



    void hand_TCA8418_event (void)

    unsigned char int_stat = 0x00;
    unsigned char key_lck_EC = 0x00;
    unsigned char key_event_a = 0x00;
    unsigned char temp = 0x00;
    unsigned char temp_cycle = 0x00;
    INT_STAT = readbytefin_TCA8418 (INT_STAT);//读取INT STAT寄存器的值 μ s_k Ω
    if (0x01 == int_stat)

    key_lck_EC = readbytefin_TCA8418 (key_lCK_EC);
    temp = key_lck_EC &0x0F;
    if (0x01 == temp)

    key_event_a = readbytefin_TCA8418 (key_event_a);
    MSG_DRV_SEND (MOD_KEY_ID、KEY_EVENT_A);//向中间件发送按键事件与参数

    其他

    如果(温度>10)
    温度= 10;
    for (temp_cycle = 0;temp_cycle <temp;temp_cycle++)

    readbytefin_TCA8418 (key_event_a);



    否则、if (0x02 == int_stat)

    temp = readbytefute_TCA8418 (GPIO_INT_STAT1);
    if (0x10 == temp)

    temp = readbytefin_TCA8418 (GPIO_INT_LVL1);
    if (0x10 == temp)

    MSG_DRV_SEND (MOD_KEY_ID、0x65);
    set_low_extio0_int();




    其他


    MSG_DRV_SEND (MOD_KEY_ID、0x65|0x80);
    set_high_extio0_int();










    readbytefin_TCA8418 (GPIO_DAT_STAT1);
    readbytefin_TCA8418 (GPIO_DAT_STAT1);

    readbytefin_TCA8418 (GPIO_DAT_STAT2);
    readbytefin_TCA8418 (GPIO_DAT_STAT2);

    readbytefin_TCA8418 (GPIO_DAT_STAT3);
    readbytefin_TCA8418 (GPIO_DAT_STAT3);







    其他





    sendbyteTO_TCA8418 (INT_STAT、0x1F);



    unsigned char ext_status = 0x00;

    void set_high_extio0_int (void)

    EXT_STATUS |= 0x10;
    sendbyteTO_TCA8418 (GPIO_INT_LVL1、外部状态);







    void set_low_extio0_int (void)

    EXT_STATUS &= 0xef;
    sendbyteTO_TCA8418 (GPIO_INT_LVL1、外部状态);






    我已经完成了一些测试,并在 IIC 正确发送0x1f 后,每次 INT_STAT 为0x00时获得 conclusion.not。
    为什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、user5053238、

    您使用的是什么微控制器?  如果您使用的是 TI 器件、最好让它们支持您的代码调试。  我在此为您的硬件调试提供支持、但如果看不到信号进入器件、就很难知道器件实际发生了什么。  

    -弗朗西斯·胡德

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Hude
    微控制器为 stm32f103vgt6。 我已经完成了一些测试,并在 IIC 正确发送0x1f 后,每次 INT_STAT 为0x00时获得 conclusion.not。
    为什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Hude
    请帮我找出此问题的原因。 我正在等待您的回复和解决方案,我的团队也在等待。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、user5053238、

    您可能会说、有时在您将0x1F 发送到 INT_STAT (0x02)然后您转到读取 INT_STAT 之后、您有时会遇到除0x00以外的其他情况。  

    查看代码后、我认为您正在启用 GPIO_INT_EN2和 GPIO_INT_EN3位、但您从未读取或清除它们。  

    您似乎只读取 GPIO_INT_STAT1、而不是 STAT2和 STAT3。  

    您需要读取 GPIO_INT_STAT2和 GPIO_INT_STAT3并清除(向 每个寄存器写入 FF、0x12和0x13) 它们、前提是它们是触发该 INT 的事件。  

    -弗朗西斯·胡德

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Hude
    我已经更改了我的代码作为您进行测试的建议。但您的建议未能解决我的问题、我认为测试结果似乎是这样。
    测试过程是在接通硬件电源后,MCU 和外设完成初始化,l 仅将引脚 RoW4下拉至低电平,然后将引脚 RoW4上拉至高电平,再按此循环。 INT 引脚将被下拉至低电平,并且始终为低电平,不能上拉至高电平(正常情况是 INT 引脚是负加号。 )。然后、我读取所有寄存器。INT_STAT 寄存器是0x02.in 代码、我已清除 INT_STAT 寄存器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、user5053238、

    发生这种情况时、从 INT_STAT (寄存器地址0x02)、GPIO_INT_STAT1 (寄存器地址0x11)、GPIO_INT_STAT2 (寄存器地址0x12)、GPIO_INT_STAT3 (寄存器地址0x13)读取的是十六进制值?  

    INT 引脚通常为高电平、直到 发生中断事件、然后被拉至低电平。  它将保持低 电平、直到您通过向触发四个寄存器(INT_STAT、GPIO_INT_STAT1、GPIO_INT_STAT2、GPIO_INT_STAT3)中的中断事件的位写入1来释放它。  

    您是否有原理图、以便我可以验证器件是否正确连接。  

    您是否在所有这些事件上都有示波器/逻辑分析仪波形。  您是否有一种方法来记录从编程到启动中断事件的整个过程中的 I2C 事务?

    -弗朗西斯·胡德

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Hude
    发生这种情况时,这四个寄存器中每个寄存器的十六进制值为,INT_STAT (寄存器地址0x02)为0x02,GPIO_INT_STAT1 (寄存器地址0x11)为0x10,GPIO_INT_STAT2 (寄存器地址0x12)为0x00,GPIO_INT_STAT3 (寄存器地址0x13)为0x00。


    在原理图中,RoW4连接到阵列焊盘和二极管(正极连接到 GND,负极连接到 RoW4)。当耳机连接到阵列焊盘时,该焊盘将下拉至低电平,当耳机断开到阵列焊盘时,该焊盘将悬空。

    您是否对 I2C 事务有疑问?

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

    您好、user5053238、

    最好使用示波  器验证 I2C 事务、以查看您是否存在完整性问题或确认驱动器正在执行您所期望的操作。  让我看一下寄存器设置、如果看到任何内容、我将返回。  如果可以、请向我发送原理图。  如果这是个问题、我可以通过离线方式接收它。  请告诉我。  您可以单击我的帐户名称"fhoude"、然后单击"连接"按钮。  

    然后向我发送您的电子邮件或联系信息、我可以向您发送我的电子邮件地址。

    -弗朗西斯·胡德

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、user5053238、
    您是否将0xFF 写入 INT_STAT 和 GPIO_INT_STAT_1? 如果是、则应清除该引脚并释放 INT 引脚。
    -弗朗西斯·胡德