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.

[参考译文] TCA8418E:TCA8418 STOP可读取键盘

Guru**** 2478645 points
Other Parts Discussed in Thread: TCA8418, TCA8418E

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/574609/tca8418e-tca8418-stop-to-read-keyboard

部件号:TCA8418E
主题中讨论的其他部件:TCA8418
TCA8418错误说明
我在同一I2C网络上有两个IC。 第一个是PCA9685 PWM控制器,另一个是TCA8418E。 如果我在上或另一个上运行代码,则没有问题。 我也可以在一种模式下运行它,当我按按钮时,我打开PWM输出,然后在嵌套计时器插槽上打开它。  
当我让它做得更好时,就会出现问题。  
计时器为10毫秒。因此当按下按键时,我将PWM切换为100 %。在5个嘀嗒信号后,我将其切换为50 % ,然后25个嘀嗒信号,我将其切换为。
我可以运行大约30-150按键,然后列进入HI imp状态
我的理论是,我必须使用I2C总线和中断FRA键。
当中断从TCA8418开始时,我只是在软件中进行了一点,然后等待网络时间标记来处理它。
停止后,我仍然可以读取TCA8418的寄存器,它们是相同的。 它只是停止读数。 如果列位于HI imp中,则不知道是否按下了A键。
以下是在未按任何键和按某个键时的外观。
通常如下所示:
示意图:
void TCA8418::initialize()
{
//初始化与TCA8.4818万
	i2c.frequency(10万);的通信
char cmd[2];
cmd[0]= REG_CFG;//指向CFG寄存器的指针字节
cmd[1]= 0x91;// CFG寄存器KE_IEN的数据设置为1
如果( i2c.write(KB _BASEADRS,cmd, 2)== I2C_ACK ){//启动写入周期并检查ACK
//在此处初始化所有来自TCA8418的寄存器
cmd[0]= REG_INT_STAT;//中断状态寄存器的指针字节
cmd[1]= 0x01;//重置KE-INT标志
I2C.WRITE (KB_BASEADRS,cmd,2);//从TCA4818写入中断状态寄存器

//将TCA8418设置为键盘模式
cmd[0]=REG_KP_GPIO1;//KP_GIO1
cmd[1]=0x0F;//设置为键盘模式
I2C.write (KB_BASEADRS,cmd,2);

cmd[0]=REG_KP_GPIO2;//KP_GIO2
cmd[1]=0xFF;//设置为键盘模式
I2C.write (KB_BASEADRS,cmd,2);

cmd[0]=REG_KP_GPIO3;//KP_GIO3
cmd[1]=0x00;//设置为键盘模式
I2C.write (KB_BASEADRS,cmd,2);

//将TCA8418设置为键盘模式
cmd[0]=REG_debounce_DIS1;//KP_GIO1
cmd[1]=0x0F;//设置为键盘模式
I2C.write (KB_BASEADRS,cmd,2);

cmd[0]=REG_debounce_DIS2;//KP_GIO2
cmd[1]=0xFF;//设置为键盘模式
I2C.write (KB_BASEADRS,cmd,2);

cmd[0]=REG_debounce_DIS3;//KP_GIO3
cmd[1]=0x00;//设置为键盘模式
I2c.write(KB _BASEADRS,cmd, 2);}

否则{
// TCA8418键盘芯片无响应
//失败=1;//打开失败指示
符}
}

字符TCA8418::Get_key()
{

// Key_LED =!Key_LED;//:切换LED 2.

char cmd[2];
//读取中断状态标志
char key_hit_ID=0;

ReadReg (REG_INT_STAT);

while (ReadReg (REG_KEY_LCK_EC)){//	读取密钥锁和事件计数
	器key_HIT_ID = int (ReadReg (REG_KEY_EVENT_A);//Keypress -->如果
	(key_HIT_ID & 0x80) release=0,则从密钥缓冲区读取数据;否则,版本=1
;}
//重置中断标志
cmd[0]= REG_INT_STAT;//中断状态寄存器的指针字节
cmd[1]= 0xFF;//重置KE-INT标志
I2c.write(KB _BASEADRS,cmd, 2);

返回key_hit_ID;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Gert:
    您能否告诉我,当输出达到高Z时,您是否能够捕捉到事件? 您是否还会在发生这种情况时捕获I2C流量?
    Francis Houde
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,I2C端没有什么问题,它读取相同的设置。 唯一不同的是,它的行为类似于未按任何键。 没有中断,fifo寄存器仍然 告诉您没有新的密钥。

    它看起来就像我的LED输出的kapacity连接,这就杀死了扫描。  不,我只使用GPIO进行"手动"扫描。