您好!
I2C 现在可以操作寄存器、但按下一次键时无法检测到下拉信号。 理论上、应该有一个下拉电阻器。 可能的原因是什么?
是否必须从外部拉取不同的 KPCOL、或者寄存器是否配置为高电平? 不同的 KROW 是否只影响他? 哪些寄存器设置会影响他?
谢谢!
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.
Neal、
您能否提供原理图?
您能否提供器件配置方式的寄存器值?
"是否必须从外部拉取不同的 KPCOL、或者是否将寄存器配置为高电平?"
如果将列设置为键盘模式、则该列可以是高阻态(扫描模式、在该模式下它将选通至高阻态)或接地(GND)、具体取决于模式(主动扫描或空闲)。
"不同的 KROW 是否只影响他?"
行是键盘模式下的输入、由100k 上拉电阻器拉高。
"哪些寄存器设置会影响他?"
0x1D-0x1F 设置 KP 模式或 GPIO。 上电时、器件是一个 GPIO、全部在内部通过100k 上拉电阻器上拉高。
-Bobby
您好,
让我重新描述一下这个问题。
目前、我们的芯片通常可以写入寄存器的值、测量电平的信号会生效、但无法正确读取。
我们已将从地址配置为0x34、将寄存器0x01设置为0x19、将0x1d、0x1E、0x1f 配置为 KP 矩阵、
当我们按键时、中断为低电平以读取状态寄存器0x02值、始终为0。 读取0x04寄存器始终为0x80。 我们测量了波形
如附件中所示、从机执行了反馈0、我想问为什么按键、中断被触发、寄存器
读取的值是错误的、是否需要配置任何其他寄存器才能使芯片正常工作。
谢谢!
您好,
让我重新描述一下这个问题。
目前、我们的芯片通常可以写入寄存器的值、测量电平的信号会生效、但无法正确读取。
我们已将从地址配置为0x34、将寄存器0x01设置为0x19、将0x1d、0x1E、0x1f 配置为 KP 矩阵、
当我们按键时、中断为低电平以读取状态寄存器0x02值、始终为0。 读取0x04寄存器始终为0x80。 我们测量了波形
如附件中所示、从机执行了反馈0、我想问为什么按键、中断被触发、寄存器
读取的值是错误的、是否需要配置任何其他寄存器才能使芯片正常工作。
谢谢!
您的波形显示您的 I2C 总线很难跟上您当前设置的时钟频率。 您可以看到时钟高电平周期永远不会接近 Vcc、我认为您甚至可能无法达到 Vcc 的70%。 我想您现在违反了 I2C 上升时间、这可能会导致信号完整性问题。
我推荐将 SDA/SCL 上的上拉电阻器更改为至少电流值的一半或甚至更多。 作为参考、400kHz 时的 I2C 上升时间需要为300ns、从 Vcc 的30%到70%进行测量。
我建议您执行 I2C 写入、然后在每次寄存器写入后立即执行 I2C 读取、以确保您实际写入您认为是的寄存器。
尝试首先将寄存器0x01h 设置为0x81h
立即读取以查看0x01h 是否设置为0x81h <-- AI enable,密钥事件生成 INT
然后转至寄存器0x03h 并写入0x00h <--我们希望确保未启用键盘锁定
读取0x03h 寄存器以确保位7设置为0
下一次写入寄存器0x1Dh 数据:0xFFh、0xFFh、0x03h [在一个事务中完成此操作]
这应使寄存器0x1D-0x1F 成为键盘矩阵的一部分(请记住、我们将寄存器0x01h 中的自动增量设置为要设置)
在发出停止条件之前、读取寄存器并读取全部3个字节、并确保获得0xFFh、0xFFh、0x03h
现在按键(或 GND 任何行)
这应该会生成一个中断(INT 现在应该从高电平变为低电平)
读取寄存 器0x03h、您应该看到0x01h 表示发生了1个事件。如果您按下并释放按钮、则应看到2个事件表示为0x02h。
现在读取寄存器0x04h、这应该会告诉您哪个行/Col 被驱动为低电平。
如果在按照这些说明操作后仍有问题、则可以上传的写入 和读取序列
"尝试先将寄存器0x01h 设置为0x81h、然后立即读取以查看0x01h 是否设置为0x81h"
^(此事务的范围截屏)^
我们可以逐步调试这个
谢谢、
-Bobby
您好!
很抱歉、直到现在、我才看到您回复并重新打开此主题。
要验证,您是否能够在一次按一个键时正常地读取按键操作?
当您快速按多个键时、寄存器0x03h 的读数是多少?
"这是因为扫描需要20ms、我们的间隔时间小于20ms 吗?"
扫描需要25毫秒、但它需要2次扫描才能实际确认按钮按压操作(这是器件的内置检查)。 最坏的情况是扫描 col 后立即按下按钮。 这意味着您需要在将按钮识别为按下之前的50ms 内保持按下按钮。 最短时间是在扫描 col 之前立即按下按钮、则只需等待约25毫秒即可识别按钮按压操作。 如果您的快速印刷时间少于50ms、那么您可能会错过印刷机、但实际上、人很难这么快地输入(印刷和发布)。
"当我们快速滑动一行按键时、我们将丢失大量的按键值"
FIFO 存储10个事件或5个按键按下(一个用于按下、一个用于释放)。 如果您读取 FIFO 的速度不够快、则会溢出。
-Bobby
你(们)好
没问题、感谢您的回复。
每次只按一个键时、我可以得到正常的键值。 正常使用没有问题。
当我快速按多个键时、寄存器0x03h 的最大值为10。我们不会测试多个键。因为我们的产品很少使用此功能。
当我快速滑动钥匙时、我将不会中断地丢失钥匙。 在0x03寄存器中读取的值为1。 实际上、只需按一次键、但间隔时间非常短。 因此,怀疑内部扫描时间比按键的间隔时间长。 由于我们测试了快速幻灯片、有10个键幻灯片、扫描时间为50ms、因此必须缺少一个键。
如果器件的内部扫描规格为50ms、则无法优化此问题、因为我们可以确认间隔时间小于50ms。
谢谢。
"当我快速滑动钥匙时、我将不会中断地丢失钥匙。 在0x03寄存器中读取的值为1。 实际上、只需按一次键、但间隔时间非常短。 因此,怀疑内部扫描时间比按键的间隔时间长。 由于我们测试了快速幻灯片、有10个键幻灯片、扫描时间为50ms、因此必须缺少一个键。
如果器件的内部扫描规格为50ms、则无法优化此问题、因为我们可以确认间隔时间小于50ms。"
如果 FIFO 中仍有数据、您仍应看到 INT。 INT 将保持置为低电平、直到 FIFO 被清除。 通过将位4设置为= 0、可以选择使寄存器0x01h 中的 INT 暂时取消置位(它将使 INT 切换)。 还请确认寄存器0x01h 位0设置为"1"
如果您使用的是非 E 版本的 TCA8418、您可能还需要查看涉及溢出勘误表的数据表第8.1.4节。
-Bobby