📄 键盘编程笔记.txt
字号:
从键盘/鼠标发送到主机的数据在时钟信号的下降沿当时钟从高变到低的时候被读取;
从主机发送到键盘/鼠标的数据在上升沿当时钟从低变到高的时候被读取.
不管通讯的方向怎样,键盘/鼠标总是产生时钟信号.
如果主机要发送数据,它必须首先告诉设备开始产生时钟信号(这个过程在下一章节中被描述).
最大的时钟频率是33kHz ,而且大多数设备工作在10 ~20kHz
如果你要制作一个PS/2 设备,我推荐你把频率控制在15kHz 左右,这就意味着时钟应该是高40 微秒低40 微秒
所有数据安排在字节中每个字节为一帧包含了11 12 个位这些位的含义如下
1 start bit. This is always 0. 1 个起始位 总是为0
8 data bits, least significant bit first. 8 个数据位 低位在前
1 parity bit (odd parity). 1 个校验位 奇校验
1 stop bit. This is always 1. 1 个停止位 总是为1
1 acknowledge bit (Host-to-device communication only) 1 个应答位仅在主机对设备的通讯中
如果数据位中包含偶数个1 校验位就会置1 如果数据位中包含奇数个1 校验位就会置0 数据位中
1 的个数加上校验位总为奇数这就是奇校验这是用来错误检测
当主机发送数据给键盘/鼠标时设备回送一个握手信号来应答数据包已经收到这个位不会出现在设
备发送数据到主机的过程中
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
设备到主机的通讯过程:
数据和时钟线都是集电极开路结构,正常保持高电平.当键盘或鼠标等待发送数据时,它首先检查时
钟以确认它是否是高电平,如果不是,那么是主机抑制了通讯,设备必须缓冲任何要发送的数据直到重
新获得总线的控制权(键盘有16 字节的缓冲区,而鼠标的缓冲区仅存储最后一个要发送的数据包).如
果时钟线是高电平,设备就可以开始传送数据
设备到主机的通讯
如我在上一节提及的键盘和鼠标使用一种每帧包含11 位的串行协议这些位含义是
1 start bit. This is always 0. 1 个起始位 总是为0
8 data bits, least significant bit first. 8 个数据位 低位在前
1 parity bit (odd parity). 1 个校验位 奇校验
1 stop bit. This is always 1. 1 个停止位 总是为1
当时钟为高数据线改变状态 在时钟信号的下降沿数据被锁存
时钟频率为10 16.7kHz 从时钟脉冲的上升沿到一个数据转变的时间至少要有5 微秒.数据变化到时
钟脉冲的下降沿的时间至少要有5 微秒并且不大于25 微秒这个定时非常重要你应该严格遵循它.
主机可以在第11 个时钟脉冲停止位之前把线拉低导致设备放弃发送当前字节这是非常罕见的
在停止位发送后设备在发送下个包前至少应该等待50 毫秒这将给主机时间当它处理接收到的字节
时
抑制发送主机在收到每个包时通常自动做这个在主机释放抑制后设备至少应该在发送任何
数据前等50 毫秒
1) 等待Clock = high
2) 延时 50 微秒
3) Clock s 仍旧为 high?
No—到第1 步
4) Data = high?
No—放弃 (并且从主机读取字节)
5) 延迟 20 毫秒 (=40 微秒 to the time Clock is pulled low in sending the start bit.)
6) 输出起始位 (0) \ 在发送所有这些位的每一位后
7) 输出 8 个数据位 > 测试时钟确认主机是否把它拉低了
8) 输出校验位 / 这说明主机要放弃这次传送
9) 输出停止位 (1)
10) 延迟30 毫秒 (=50 微秒 from the time Clock is released in sending the stop bit)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主机到设备的通讯
被发送的包有点不同于主机到设备通讯过程
首先PS/2 设备总是产生时钟信号如果主机要发送数据它必须首先把时钟和数据线设置为请求
发送状态如下示
通过下拉时钟线至少100 微秒来抑制通讯
通过下拉数据线来应用请求发送然后释放时钟
设备应该在不超过10 毫秒的间隔内就要检查这个状态当设备检测到这个状态它将开始产生时钟信
号并且时钟脉冲标记下输入八个数据位和一个停止位主机仅当时钟线为低的时候改变数据线而数
据在时钟脉冲的上升沿被锁存这在发生在设备到主机通讯的过程中正好相反
在停止位发送后设备要应答接收到的字节就把数据线拉低并产生最后一个时钟脉冲如果主机在第
11 个时钟脉冲后不释放数据线设备将继续产生时钟脉冲直到数据线被释放然后设备将产生一个错
误
主机可以在第11 个时钟脉冲应答位前中止一次传送只要下拉时钟线至少100 微秒
1) 把时钟线拉低至少100 微秒
2) 把数据线拉低
3) 释放数据线
4) 等待设备把时钟线拉低
5) 设置/复位数据线发送第一个数据位
6) 等待设备把时钟拉高
7) 等待设备把时钟拉低
8) 重复 5-7 步 发送剩下的7 个数据位和校验位
9) 释放数据线
10) 等待设备把数据线拉低
11) 等待设备把时钟线拉低
12) 等待设备释放数据线和时钟线
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -