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**** 2933120 points

Other Parts Discussed in Thread: TCA8418, TCA8418E

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/736002/tca8418-tca8418-concurrent-key-presses-losing-one-of-the-presses

器件型号:TCA8418

一次按多个键时出现问题。  始终可以完全检测到按任何1键的情况。  如果我按2、3或更多键、如果它们都同时出现(与我的手同时按下它们一样近)、有时1个或更多的键不会注册下降。  当我也松开键时也是如此。

虽然我的矩阵确实有1n4148个二极管、但我能够将我的设计缩减为仅启用3个键即可看到此行为、它们已完全接管第4、5和6列。

因此、为了确保并禁用所有其他行/列、我将其放置如下:

writeI2C8 (FD_Panel、0x1D、0x00);//设置 KEYSCAN 的行部分(R0-R4)
writeI2C8 (FD_Panel、0x1E、0x00);//设置 KEYSCAN 的行部分(C0-C3、C7)
writeI2C8 (FD_Panel、0x1F、0x00);//设置 KEYSCAN 的行部分(C8-C9)
将 I2C8 (FD_Panel、0x20、0x00);// ROW5 GPIO 写入 FIFO


将 I2C8 (FD_Panel、0x21、0x70);// COL456 GPIO 写入 FIFO

我已经将信号范围限定在4 5和6上、它们看起来很棒。  不会看到任何电容下降或过度振铃。

我知道唯一不是100%正确的事情是第6行和第7行是悬空的、因为它们未在任何配置中使用。  但是、如果没有按钮掉下来、不管怎样、行都是打开的、我认为这不会导致任何问题。

我不知道还有什么要检查的。  我构建了2块板、它们的行为完全相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我说接管4、5和6时、每列都会转到另一侧具有接地端的按钮。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    作为测试、我重写了代码以进行强力扫描所有输入(因此我正在执行内部硬件应该执行的操作)。 我将行设置为输入、将列设置为输出、一次驱动一列、我还读取了我直接使用的 GPIO、该 GPIO 连接到接地的开关。

    这是完美的。 无论我按多少个键、速度有多快、我都没有在轮询过程中丢失一个向上或向下的键。

    因此,我真的不知道内部的间歇泉有什么问题。 我讨厌放弃 CPU 周期来执行此手动扫描。 也就是说、我只是想验证在按快速键或多个键时没有看到任何抖动或滞后问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、

    您能提供一个原理图供我查看吗? 带开关二极管的键盘矩阵的方框图对我也很有用。

    按键的时间有多长? 您是手动执行此操作、还是使用函数发生器和 FET 在您的第一篇帖子中对按键进行建模?

    您是否能够将示波器探头放置在您按下按钮的行上? 这可能有助于我们进行调试。

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

    Bobby、

    这一切都是通过电路中的瞬时压芯片实现的。  我按照 PCB 上的布局连接了电路。  SDA/SCL 来自 ARM 处理器。  电源和接地之间为100nF。  复位和 INT 上的10k 上拉电阻。

    尽管如此、为了将复杂性降低到更简单的问题、我只需设置 TCA8418来监听带有标记为 G1、G2和 G3的开关的列。  这样、只有这三个被监视、只有这三个被告知将它们的值插入到密钥缓冲区中。

    按键操作是用手完成的。  因此、如果我同时按下(并按住) 2个按钮、在某些情况下、将无法检测到其中一个按钮。

    如果我等待了一段时间、然后又完全同时释放了两者、许多时候都不会检测到其中一个离开啮合状态。  

    就好像它们同时发生时、在某些情况下看不到它们中的一个。

    如果电路只是观察分配给 G1、G2和 G3的列的变化、我不清楚它怎么看不到这些变化。

    (第5行连接到另一个接地开关、用作 GPIO、但在简单的情况下、我忽略了它、仅使用了3列)

    谢谢!
    Rick

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

    您好 Richard、

    只需确认一下、当您仅使用列时、您是否在键盘模式下使用此设备?

    谢谢、
    -Bobby

    编辑:您是否将 column3-5配置为 GPIO 或 KP 矩阵的一部分。 寄存器0x1E (KP_GPIO2)

    从您的第一个帖子中、似乎设备认为第3-5列是键盘矩阵的一部分、因为您将它们设置为与0x00h 一起使用的 KP。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我为消除有关二极管的任何问题所做的是、将二极管设置为 GPIO、然后将这3设置为在键盘缓冲区中进行更改、以限制测试。 在这些测试中、当按下这3个按钮时、只允许这3个输入接地。 也就是说、它们的行为与扫描的矩阵完全相同。 GPIO 上的2个按键同时按压、但未按一次。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、

    如果将列设置为键盘矩阵的一部分(通过 KP_GPIO2寄存器)、则当器件处于空闲模式时、列实际所做的是进入 GND 状态。 当器件检测到下降沿(在行输入端)时、它会进入扫描模式、然后将所有列设置为高阻态、同时它会在短时间内将每个列选通至 GND、以尝试检测哪个行实际变为低电平。

    这些事件记录在寄存器0x04中、FIFO 深度为10字节。 现在、这适用于键盘模式。

    "writeI2C8 (FD_Panel、0x1E、0x00);//设置 KEYSCAN 的行部分(C0-C3、C7)"
    如果您将0x00写入此地址、则0到7之间的所有列将是 GPIO、而不是键盘的一部分。

    因此、您现在将器件用作 GPIO、其中默认设置是由 GPIO_DIR2定义的输入。 然后、默认的 GPIO_PULL2寄存器将您的列3-5用作 Vcc 的内部上拉电阻100k。 我相信、在这种模式下、该列将在活动扫描模式下作为"行"运行。

    "writeI2C8 (FD_Panel、0x21、0x70);//将 COL456 GPIO 写入 FIFO "
    这是一个读取寄存器、用于指示列是否是 FIFO 事件的一部分。
    您应该读取事件寄存器以实际读取 FIFO (0x04表示事件 A 寄存器)。

    读取该寄存器直至其为空是否仍然显示只发生了一次按压事件?

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

    是的、这是我同时按下2个键时发生的情况、但并非每次都是间歇性的(或者我可能不会每次恰好同时按下它们、因为我只用两根手指按下)。

    如果我自己按下并松开每个按钮、我会在读取它们时看到0x04中的上下箭头。  如果我甚至说 A down B down A up B up 缓慢、我会看到所有这些内容。  如果我的操作速度尽可能快、按一下按钮、我绝不会错过 FIFO 中的下行和上行序列。

    但是、如果我同时按下它们(完全按照我的能力)并且我查看 FIFO 中的内容、我将其中一个向下、而不是另一个向下。  我们不是在时间上、假设它错过了50%的时间。

    我一直从 FIFO 拉取、直到它返回0。

    我甚至只是不断从 FIFO 中拉取数据、而只是在它不为零时打印出来、 只是为了查看它是否在那里、但在某种程度上是在一个零返回后。

    它就像某种方式、当我同时按下两个按钮时、一个按钮将屏蔽另一个按钮。  (现在让我们忘记 keysscan 模式、只需将我告诉它在 FIFO 中记录其更改的3个 GPIO 作为焦点)。

    当我将一个示波器连接到开关以查看反弹看起来是什么时、非常干净的边沿。  

    似乎没有很多其他设置可以尝试更改。

    Rick

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

    您好 Richard、

    我订购了该器件的一些 EVM、并将其发货给我。 我将尝试看看我是否也能再现您看到的内容。

    本周我还需要做很多工作、因此当 EVM 到达时、我可能无法立即设置 EVM、但我会尝试(可能是星期五)。

    您可以尝试在您的列(大约10k Ω)上添加一个外部上拉电阻器到 Vcc、并重复多次按压测试。 如果添加电阻器会改变结果、请告诉我。

    谢谢、

    -Bobby

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

    您好、Bobby、

    对于 C4、C5和 C6列、我将一个12k (我拥有的全部)电阻器连接到 VCC (3.3V)、然后仅对这3个按钮重新进行测试(每个列都将自己的12k 连接到 VCC)。  性能无变化。  按下多个按钮仍会导致 FIFO 中的事件丢失。

    Rick

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

    嗨、Rick、

    验证您是否正确写入了内部寄存器。 您能读取0x1E 和0x21的寄存器吗? 我想在 I2C 线路(SDA/SCL)上的读取事务示波器截图中看到这一点。

    我还有一名系统工程师在 TCA8418中进行了一些测试、他同意尝试重新创建您看到的问题、因为我现在有点超载。 我相信他明天会研究这个问题,所以我会在明天结束时告诉你他的发现。

    谢谢、

    -Bobby

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

    工程师无法尝试在今天重新创建此内容、并说他应该能够在明天完成此操作。

    很抱歉给您带来不便、
    -Bobby
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没问题。  下面是一些示波器捕获。  请记住、现在我已设置为只查看通过 FIFO 的 C4、C5和 C6、因此当我读取这些值(使用 i2cget)时、我确实会得到0x1E=0x00和0x21=0x70。  我反复地这样做是为了确保我从未得到错误的结果、但我没有得到错误的结果。  这与我的手动扫描结果一致。  请注意、我在400k 和1M (当前为)处尝试了 I2C、只是为了确保它不会出现通信问题。

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

    您好 Richard、

    我是 Bobby 帮我解决这个问题的人。 我已经设置了 TCA8418e EVM。 由于我无法完成您的确切设置、因此我尽可能地对其建模。 我将 COL0、col1和 col2短接在一起、这样任何单次按压操作都将完全同时触发全部3行。 我已将所有行设置为 GPIO 输出、输出低电平、因此它们接地。 我已将所有列设置为写入事件 FIFO。 我一次只按1个按钮、因此实际上看起来好像同时按了3列。

    当我按下按钮时、我会在事件 FIFO 中看到所有3个按钮都已注册/检测到。 我还检查列状态寄存器、发现所有3个按钮都读作低电平。 当我释放时、我看到同样的情况、所有3个都可以在没有问题的情况下检测到。

    您是否可以尝试将列按钮短接在一起、以便单次按下即可保证同时按下全部3个按钮、并查看它是否会改变您的故障机制? 我想知道这样做是否会使您错过按键操作或完全释放时间。

    您是否为列按钮启用了中断? 去抖电路怎么样?它写入1 (去抖禁用)还是0 (去抖启用)?

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

    当我在第4列、第5列和第6列焊接了一根导线(并验证了连接是否正常)时、当我触发按钮的任何1个按钮时、C4和 C6寄存器按钮会上下移动、但 C5显示没有显示任何内容。  如果没有导线、只要我一次按下一个按钮、C5就能工作。

    对于仍连接的其他按钮、如果我同时按下它们、有时会发生 C5与其他按钮一起注册、但 C4和 C6不会显示。  当然、在这种情况下、按钮会卡住。

    无论 I 抽头(或长按)多快、C4和 C6始终检测到正确、C5始终不显示任何内容。

    去抖已开启(但我两种方法都尝试过)

    writeI2C8 (FD_Panel、0x01、0x11);//CFG
    
    writeI2C8 (FD_Panel、0x1D、0x1F);//设置 KEYSCAN 的行(R0-R4)
    writeI2C8 (FD_Panel、0x1E、0x8F);//设置 KEYSCAN 的行部分(CYC、0x4
    
    
    ) 0x70、C8 (C8F
    )、写入 eFIFO 的行;0xC8 (C8、0xC8、0xC8、0xC8、0xC8、0xC8、0xC8、C8、C8、C8、C8)写入面板(C1F
    
    //writeI2C8 (FD_Panel、0x01、0x95);//配置设置
    writeI2C8 (FD_Panel、0x0E、0x00);//将 ULOCK 计时器设置为零,以便禁用
    写入 eI2C8 (FD_Panel、0x0F、0x00);//将 ULOC8键1设置为零
    ,以禁用0x10,0C8 (FD_Panel);//将 ULOC8设置为零(禁用写入0x10、0x00)
    
    writeI2C8 (FD_Panel、0x02、0xFF);//重置所有中断 

    我已经尝试了许多不同的设置组合、这就是我用于此测试的设置方法。

    这是我用来检查内容的最后一个例程:

    int ScanPanel (char* keyArray){
    uint8_t int_stat = readI2C8 (FD_Panel、0x02);
    if (int_stat&0x01){
    //键盘事件
    uint8_t key_lck_EC = readI2C8 (FD_Panel、0x03);
    uint8_t EVENT_COUNT = 0xF&key_lck_EC;
    if (event_count>0){
    uint8_t key_event = readI2C8 (FD_Panel、0x04);
    while (key_event!= 0){
    uint8_t key_state = key_event&0x80?1:0;
    uint8_t key_val = key_event&0x7F;
    key_event = readI2C8 (FD_Panel、0x04);
    if (key_state){
    KeyArray[key_val]=1;
    } 否则{
    KeyArray[key_val]=0;
    }
    
    }
    
    }
    writeI2C8 (FD_Panel、0x02、0x01);
    } 

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

    感谢您的反馈。 我想知道它是否特定于列和行。

    我将连接第4、5和6项、并准确使用您的端口配置来查看这是否会改变行为。

    听起来、一旦您将它们焊接在一起、您就会发现此故障100%的时间、对吧? 因此、至少现在它是一致的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经复制了您的代码/配置、并正在尝试在 COL4、5和6上执行此操作。 无论按下还是释放、我始终会显示全部3个键。

    您提到过、您在多个电路板上看到了这一点吗? 您是否在每块电路板上都看到过这种情况? 还是只是一些?

    我还有一个想法、我将尝试复制您的问题(使用相同的封装)、以查看是否存在任何差异。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    要回答您的第一个问题、是的、现在始终保持一致、当我将所有3个按钮连接在一起时、C5永远不会出现。

    关于您的第二个问题、我们构建了2个我们将在年底之前交付的产品原型。  两者的行为完全相同。  我想我可能收到了一批坏的芯片。  似乎不太可能、但这就是我所能想到的。  两个电路板的运行方式相同。  

    我的内部2层是电源平面和接地平面、因此我认为电源不会是问题。  电源通过 MCP1700T3302驱动该平面。  当我按键时、我不会看到任何压降或任何情况发生。

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

    Richard、

    只需进行更新。 我们内部没有任何用于 RTW 封装的板(借出它们、再也不会将它们退回)。 我尝试修改另一个电路板、但未成功。 我们订购了新电路板来焊入 RTW。

    我开始怀疑 TCA8418可能有什么特别之处。 此器件有2种型号。 TCA8418和 TCA8418E。 E 是一款增强型器件、此器件改进了 ESD 保护并且 TCA8418中的错误是固定的。

    我一直在对 E 变体进行测试、以尝试查看它是否是软件配置问题。 遗憾的是、我们在几天内不会使用该板。 如果您发现任何可能有助于我们重现此问题的新问题、请告知我们。

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

    让我看看我是否也能找到 E 部件。

    现在、这里是我从 Mouser 使用的器件:

    595-TCA8418RTWR
    Mfg 器件型号:TCA8418RTWR
    德州仪器(TI)低电压16B I2C 和/接口-专用
    美国 HTS:8542390001 ECCN:EAR99 COO:MY
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有意识到这只是一个 BGA 封装、它不会在这个电路板上工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这就是我在尝试测试 QFN 时遇到问题的原因。 目前只有 BGA 板。

    它们具有相同的寄存器集和配置、E 变体只是提高了性能、但仅采用 BGA 封装。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Rick、

    我们昨天收到了 QFN 转 DIP 适配器板、今天我提交了这些板供实验室技术人员焊接。 我希望他们将在今天或明天下午结束时完成。

    当我们开始测试它们时、如果我们发现您在器件上看到的问题、我会告诉您。

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

    嗨、Rick、

    我获得了我们的 TCA8418 (非 E 修订版)并于今天开始测试。

    我刚刚使用连接到 NFET 漏极的第4列5和第6列运行了程序。 源连接到 GND。 当我将 NFET 栅极从低电平拉至高电平并返回低电平时、我能够检测到所有3个引脚变为低电平并变为高电平。

    下面是我通过 I2C 编程的串行监视器以及我读取的内容。

    最初、我们认为 E 版本和非 E 版本不同、当设置为输入时、同时按下多个按钮可能会导致非 E 出现潜在错误。 但在这里、情况似乎并非如此。

    这让我相信问题可能与布局/焊接/代码有关?

    我们可能需要后退一步、首先看一下布局、然后再继续。 也许可以检查焊接连接是否良好。

    -Bobby