请问,我用LPC2220的一个I2C口模拟I2C时序控制CH452和24C512
怎么在读写512后,键盘操作命令就无效,而且键盘偶尔会死机,请问都是什么原因造成的
同时我开启返回应答命令后,写命令进去后读取应答包操作,就不能操作键盘.
还有就是只用452键盘功能的情况下,452的功耗是多大,我写命令进入休眠模式,电流好象并没有减小,同时进入休眠模式后不能唤醒.我使用的批号是 202705071
请问,我用LPC2220的一个I2C口模拟I2C时序控制CH452和24C512
怎么在读写512后,键盘操作命令就无效,而且键盘偶尔会死机,请问都是什么原因造成的
同时我开启返回应答命令后,写命令进去后读取应答包操作,就不能操作键盘.
还有就是只用452键盘功能的情况下,452的功耗是多大,我写命令进入休眠模式,电流好象并没有减小,同时进入休眠模式后不能唤醒.我使用的批号是 202705071
相关程序如下: static void CH452_WriteCommand(uint16 cmd) { Start_I2C(); //启动总线 Writebyte_I2C((uint8)(cmd>>7)&CH452_MASK|CH452_ADDR); //if(Cack_I2C() == 0) //{ Writebyte_I2C((uint8)cmd); //Stop_I2C(); //} Stop_I2C(); //停止总线
}
static uint8 CH452_ReadKey(void) { uint8 keycode = 0xFF; Start_I2C(); //启动总线 Writebyte_I2C((uint8)(CH452_GET_KEY>>7)&CH452_MASK|CH452_ADDR|0x01); Cack_I2C(); //接收应答信号 返回1 keycode = Readbyte_I2C();
Nack_I2C(); //不产生应答 Stop_I2C(); //停止总线 return(keycode); }
static uint8 Cack_I2C(void) { uint8 F0; IIC_Delays(DELEYTIME); //延时 EROM_SDA_H(); IIC_Delays(DELEYTIME); //延时 EROM_SCL_H(); IIC_Delays(DELEYTIME); //延时 if(EROM_SDA_STATUS() ==0) { F0 = 0; } else { F0 = 1; } EROM_SCL_L(); IIC_Delays(DELEYTIME); //延时 return(F0); } void CH452_Init(void) { EINT2_Init(); //Start_I2C(); //启动总线 //Writebyte_I2C((uint8)(CH452_RESET>>7)&CH452_MASK|CH452_ADDR); //Writebyte_I2C((uint8)CH452_RESET); //Stop_I2C(); //停止总线 //Start_I2C(); //启动总线 //Writebyte_I2C((uint8)(CH452_ACK>>7)&CH452_MASK|CH452_ADDR); //Writebyte_I2C((uint8)CH452_ACK); //Stop_I2C(); //停止总线 CH452_WriteCommand(CH452_RESET); //芯片复位 CH452_WriteCommand(CH452_ACK); //开ACK功能 CH452_WriteCommand(CH452_SYSON); //开键盘扫描功能 //Start_I2C(); //启动总线 //Writebyte_I2C((uint8)(CH452_SYSON>>7)&CH452_MASK|CH452_ADDR); //Writebyte_I2C((uint8)CH452_SYSON); //Stop_I2C(); //停止总线 }
有个问题不明白 为什么我写命令的时候 都已经开启了有返回应答包命令 确不能读应答包
而在读取键值的时候确要读取一个应答 是不是我的延时有问题??
我一个 IIC_Delays(DELEYTIME); 延时大概有100多US
CH452_WriteCommand(CH452_RESET); //芯片复位 这条命令不要发,试一下。
CH452_WriteCommand(CH452_SYSON); //开键盘扫描功能 命令后量DIG0脚上有没有脉冲,有脉冲才表示这条命令发送成功。
CH452_WriteCommand(CH452_ACK); //开ACK功能 这条命令后应答才使能。 之后 CH452_WriteCommand(CH452_SYSON); //开键盘扫描功能 可以读到应答。
谢谢回复
没怎么明白您的意思
我看你们DEMO程序 是写完开ACK功能的高字节后就能读取应答包的
static void CH452_WriteCommand(uint16 cmd) { Start_I2C(); //启动总线 Writebyte_I2C((uint8)(cmd>>7)&CH452_MASK|CH452_ADDR); if(Cack_I2C() == 0) { Writebyte_I2C((uint8)cmd); //Stop_I2C(); } Stop_I2C(); //停止总线
} void CH452_Init(void) { EINT2_Init(); //CH452_WriteCommand(CH452_RESET); //芯片复位 CH452_WriteCommand(CH452_ACK); //开ACK功能 CH452_WriteCommand(CH452_SYSON); //开键盘扫描功能 }
上面这样操作总线命令就没有写进去
如果写命令的时候不读取应答包,操作就是正确的,
还有两个问题 1、写进入休眠模式后,是否通过按键直接唤醒还是在唤醒前要有什么命令操作,我写进入休眠模式后,按键按下都没反应 2、我与24C512功用一个总线 都用模拟方式操作 ,怎么读写512后键盘就死机,是否可以共总线操作452
Start_I2C(); //启动总线 CH452_WriteCommand(CH452_SYSOFF); //关键盘扫描功能 CH452_WriteCommand(CH452_SLEEP); //进入睡眠模式
进入睡眠后,SEG3~SEG0上的按键可以唤醒睡眠,有效按键代码是40H 到5FH;接收到单片机发出的操作命令(通常是空操作命令),或者SCL引脚的电平变化都可以唤醒睡眠。
可以共总线操作452,只要共总线的芯片命令不重叠就可以了。 读写512后键盘就死机,你量一下452的INT#脚,看这个脚是不是变为低电平。只有CH452Read(读按键命令)这个操作成功后INT#脚才会恢复为高电平。