PS2协议网上的资料很多,这里不再细述,仅就通讯双方(以键盘和PC为例)交换信息的细节作分析。
1,PS2的基本常识主要包括:
1.1 PS2通信由CLK和DATA两个线构成
1.2 PS2的CLK不论PC->KeyBoard,还是PC<-KeyBoard,都是由KeyBoard提供
1.3 数据帧构成:起始位(1bit) + 数据位(8bit) + 奇校验位(1bit) + 停止位(1bit) + 应答位(1bit, 只在PC->KeyBoard中,KeyBoard产生)
1.4 CLK平时状态为高电平,低电平表示抑制通讯,说明PC现在处理不过来,需要KeyBoard将发送的数据暂时缓存
1.5 数据在CLK下降沿被采样
1.6 数据发送的时序如下:(a) 键盘发送时序;(b) 键盘接收时序
2, PC->KeyBoard中,KeyBoard怎么知道PC有数据要发给自己?
正常情况下,CLK和DATA两根线都是高电平。PC下拉CLK超过100us,再下拉DATA,然后释放CLK ; 即让KeyBoasd在CLK上升沿采样到DATA为低 。KeyBoard识别这个特征后,意识到PC有东西要传,然后主动提供时钟。
3, PC<-KeyBoard中,PC怎么知道KeyBoard有数据要发给自己?
PC等待CLK拉低,在下降沿时采样DATA 为低时 ,认为KeyBoard有数据传送。
4,PC没有作好接收的准备,怎么办?
PC如果暂时不能接收新的数据,就主动把CLK拉低了。KeyBoard看到CLK为低,会将数据暂存在buffer里的。
4,KeyBoard没有作好接收的准备,怎么办?
KeyBoard在CLK上升沿采样到DATA为高时,意识到PC有数据要发送,如果不能接收,就不提供时钟;即上升沿后的CLK为高电平,这时KeyBoard不要将CLK下拉,让PC的起始bit发不出来,使PC处理等待发送状态至直KeyBoard准备好可以接收,才提供时钟。
5,具体单片机实现代码
5.1 单片机-->PS/2键盘
5.2 单片机<--PS/2键盘
5.3 单片机中断接收PS/2键盘的消息
5.3 PS/2键盘初始化