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:钥匙处于位置"20"始终发送一个钥匙事件"98"。 为什么?

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1195000/tca8418-key-in-position-20-always-also-sends-a-key-event-98-why

器件型号:TCA8418

我有一个使用 TCA8418 驱动7x10键盘矩阵的设计。 只要按下 ROW1 COL9中的键、就会出现两个关键事件:20和98。 我已确认这两个结果会导致设置 K_INT 标志、它 不是"98"事件的 GPI_INT 标志。 只有使用此键时、它才会在按下该键时100%发生。  矩阵中的任何其他密钥都不会发生这种情况。 我不明白为什么、希望有人能引导我朝着正确的方向前进。

下面是键盘矩阵的原理图:

下面是 ROW1在 PCB 上的净外观:

为了进行比较、ROW2的网络如下所示:

当我使用  AdafruIT_TCA8418库时、即使 我尝试 通过绕过库提供的友好方法设置直接注册表值来手动配置内容、也会遇到问题。 以下是初始化代码:  

 _keyMatrix = new Adafruit_TCA8418 ();

 //使用正确的行数和列数设置矩阵。
 _keyMatrix ->Begin (TCA8418_default_ADDR、&Wire);
 _keyMatrix ->writeRegister (TCA8418_REG_KP_GPIO_1、0b01111111);//为 ROW0至 ROW6启用 KP 矩阵。
 _keyMatrix ->writeRegister (TCA8418_REG_KP_GPIO_2、0b111111);//为 COL0至 COL7启用 KP 矩阵。
 _keyMatrix ->writeRegister (TCA8418_REG_KP_GPIO_3、0b00000011);//为 COL8至 COL9启用 KP 矩阵。

 //连接 Arduino 中断处理程序。
 PinMode (_interruptPin、input_pullup);
 attachInterrupt (digitalPinToInterrupt (_interruptPin)、_interruptHandler、change);

 //清除所有挂起的中断,然后启用中断发送
 _keyMatrix->flush();

 //启用密钥中断
 uint8_t config =_keyMatrix->readRegister (TCA8418_REG_CFG);
 CONFIG |= TCA8418_REG_CFG_KE_IEN;
 _keyMatrix ->writeRegister (TCA8418_REG_CFG、CONFIG);

 _currentState = DetectionState::WaitingForKey;
下面是 响应中断的代码:
 //此流程来自 TCA8418数据表第8.3.1.3节:密钥事件(FIFO)读取。
 int keyEvent;

 //步骤1:找出导致中断的原因。 除 K_INT 之外的任何内容都会被忽略。
 int interruptStatus =_keyMatrix->readRegister (TCA8418_REG_INT_STAT);
 IF (((interruptStatus && INT_STAT_K_INT_BIT)!= INT_STAT_K_INT_BIT)
 {
  _currentState = DetectionState::WaitingForKey;
  返回;
 }

 //数据表中的步骤2、读取 key_lCK_ec 以获取事件数量
 //存储似乎没有必要。

 //步骤3:读取 FIFO 队列中的待处理密钥。 返回0时的值
 //队列中没有剩余的事件。
 while (keyEvent =_keyMatrix->getEvent())
 {
  ReadKeyEvent (keyEvent);
 }

 //步骤5:复位中断标志。
 _keyMatrix ->writeRegister (TCA8418_REG_INT_STAT、INT_STAT_K_INT_BIT);

 //将状态机设置回等待密钥。
 _currentState = DetectionState::WaitingForKey;
从事件中解析密钥事件,如下所示:
我 将逻辑分析仪直接连接到按钮20、19和30、与 按钮19和30相比、没有看到按钮20的信号有任何差异(这些信号没有表现出这种行为):
如有必要、我可以提供指向 GitHub 报告的链接、其中包含整个 PCB 设计和固件的源代码。
以前是否有人看到过此问题? 有人知道地球上会有什么原因? 我完全没有想法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Neil、

    明天我将查看这个问题、并在 CST 下午5点前生成一个答案。  

    此致、

    Tyler

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

    谢谢 Tyler、谢谢!  请告诉我是否 可以提供任何其他信息。 这肯定会让我感到困惑!

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

     我记得我有一个用于此芯片的 Adafruit 分线板、因此我将其卡在带有 Raspberry Pi Pico 的试验电路板上。 我使用与 PCB 相同的配置对其进行布线、 只需使用  一组 DIP 开关 ROW1和 COL0-9即可。

    将我的代码放在 RPI 上、 将开关翻转在位置20…… 还有一个关键的98活动!

    因此 、我99%确定这不是硬件问题。  这需要了解我 是如何设置芯片还是如何处理事件的。

    相关代码:

    当我在位置20切换钥匙时、这里有一些记录:

    密钥事件计数:1.
    关键事件位:10010100
    检测到的密钥:20状态:0
    7、A、0;
    密钥事件计数:1.
    关键事件位:11100010
    检测到的密钥:98状态:0
    跳过98


    密钥事件计数:1.
    密钥事件位:00010100
    检测到的密钥:20状态:1.
    7、a、1;
    关键事件位:01100010
    检测到的密钥:98状态:1.
    跳过98

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

    请在初始化结束时读出所有配置寄存器。

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

    给你。 位7在左侧、位0在右侧:

    CFG:00000001
    INT_STAT:00000000
    Lck_EC:00000000
    DAT_STAT_1:111111
    DAT_STAT_2:11111111
    DAT_STAT_3:00000011
    KP_GPIO_1:01111111
    KP_GPIO_2:11111111
    KP_GPIO_3:00000011
    GPI_EM_1:11111111
    GPI_EM_2:11111111
    GPI_EM_3:00000011
    INT_LVL_1:00000000
    INT_LVL_2:00000000
    INT_LVL_3:00000000
    DEBOIUNCE_DIS_1:00000000
    DEBOIUNCE_DIS_2:00000000
    DEBOIUNCE_DIS_3:00000000
    GPIO_PULL_1:00000000
    GPIO_PULL_1:00000000
    GPIO_PULL_1:00000000

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

    GPIO_INT_ENx 寄存器如何? 是否有任何位被置位(尤其是 ROW7、这是不相关的、但却永远不知道)?

    为什么所有 GPI_EMx 位都被设置? 尝试清除它们。

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

    INIT 后的 GPIO_INT_ENx 状态:

    GPIO_INT_EN_1:11111111
    GPIO_INT_EN_2:11111111
    GPIO_INT_EN_3:00000011

    不知道为什么设置了 GPI_EMx。 执行了一个新的构建、其中 GPI_EMx 和 GPIO_INT_ENx 作为 INIT 的一部分被清除、并确认它们在 INIT 后被清除:

    GPI_EM_1:00000000
    GPI_EM_2:00000000
    GPI_EM_3:00000000

    GPIO_INT_EN_1:00000000
    GPIO_INT_EN_2:00000000
    GPIO_INT_EN_3:00000000

    和... 问题迎刃而解!!!  我 不知道这些是怎么被设置的,但是 在初始化时清除它们是足够的容易的。 非常感谢! 很高兴这 是一个软件问题、而不是硬件问题。

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

    跟进他们的设置方式:这是 Adafruit 库。 在库的 Begin()方法中 ,它将所有 GPIO 引脚明确添加到 FIFO 队列中,并为它们启用中断: https://github.dev/adafruit/Adafruit_TCA8418/blob/1b4c809a1311fc59e6447572427861aa4b54cfd1/Adafruit_TCA8418.cpp#L66-L86

    我不再使用此库...

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

    您好、Neil、

    如果您有任何疑问、请告诉我。

    此致、

    Tyler

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

    针对库打开的问题: github.com/.../4