2024年5月16日发(作者:后飞昂)
PS2键盘与鼠标的接口定义
针脚定义:
原理
PS/2鼠标接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一
位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制鼠标的发送。方法是把时钟线一直
拉低,鼠标就不能产生时钟信号和发送数据。在两个方向的传输中,时钟信号都是由鼠标产生,即主机不产
生通信时钟信号。
如果主机要发送数据,它必须控制鼠标产生时钟信号。方法如下:主机首先下拉时钟线至少100μs
抑制通信,然后再下拉数据线,最后释放时钟线。通过这一时序控制鼠标产生时钟信号。当鼠标检测到这个
时序状态,会在10ms内产生时钟信号。如图3中 A 时序段。主机和鼠标之间,传输数据帧的时序如图2、
图3所示。2.2 数据包结构在主机程序中,利用每个数据位的时钟脉冲触发中断,在中断例程中实现数据位
的判断和接收。在实验过程中,通过合适的编程,能够正确控制并接收鼠标数据。但该方案有一点不足,由
于每个CLOCK都要产生一次中断,中断频繁,需要耗用大量的主机资源。
PS/2鼠标的四种工作模式是:Reset模式,当鼠标上电或主机发复位命令 0xFF给它时进入这种模
式;Stream模式鼠标的默认模式,当鼠标上电或复位完成后,自动进入此模式,鼠标基本上以此模式工
作;Remote模式,只有在主机发送了模式设置命令 0xF0后,鼠标才进入这种模式;Wrap模式,这种模式只用
于测试鼠标与主机连接是否正确。
PS/2鼠标在工作过程中,会及时把它的状态数据发送给主机。发送的数据包格式如表1所示。
Byte1中的Bit0、Bit1、Bit2分别表示左、右、中键的状态,状态值0表示释放,1表示按下。Byte2和
Byte3分别表示X轴和Y轴方向的移动计量值,是二进制补码值。Byte4的低四位表示滚轮的移动计量值,
也是二进制补码值,高四位作为扩展符号位。这种数据包由带滚轮的三键三维鼠标产生。若是不带滚轮的
三键鼠标,产生的数据包没有Byte4 其余的相同。
一.PS/2 鼠标键盘协议
PC 键盘可以有6 脚的mini-DIN 或5 脚的DIN 连接器如果你的键盘是6 脚的mini-DIN 而你的计
算机是5 脚的DIN 或者相反这两类连接器可以用上面提到的适配器来兼容具有6 脚mini-DIN 的键盘
通常被叫做PS/2 键盘而那些有5 脚DIN 叫做AT 设备XT 键盘也使用5 脚DIN 但它们非常古老并且多
年前就不生产了所有现代的为PC 建造的键盘不是PS/2,AT 就是USB 的这篇文章不适用于USB 设备它
们使用了一种完全不同的接口。
每种连接器的引脚定义如下所示
在刚才提到连接器上有四个有趣的管脚电源地5V 数据和时钟host 计算机提供5V 并且键盘/鼠
标的地连接到host 的电源地上数据和时钟都是集电极开路的这就意味着它们通常保持高电平而且很容
易下拉到地逻辑0 任何你连接到PS/2 鼠标键盘或host 的设备在时钟和数据线上要PS/2 技术参考 著
Adam Chapweske 译Roy Show第4 页共4 页 02-11-22发布有一个大的上拉电阻置0 就把线拉低置1
就让线上浮成高电平参考图1 中数据和时钟线的一般接口结构注意如果你打算使用象PIC 这样的微控
制器由于它们的I/O 管脚是双向的你可以跳过晶体管和缓冲门并且通用同一个管脚进行输入和输出在
这种组态情况下要设置管脚为输入就写入1 使得电阻上拉线上的电平要改变管脚为输出就写入0 到那
个管脚把线路下拉到地。)
PS/2 鼠标和键盘履行一种双向同步串行协议。换句话说每次数据线上发送一位数据并且每在时钟
线上发一个脉冲就被读入。键盘/鼠标可以发送数据到主机,而主机也可以发送数据到设备,但主机总
是在总线上有优先权,它可以在任何时候抑制来自于键盘/鼠标的通讯,只要把时钟拉低即可。
从键盘/鼠标发送到主机的数据在时钟信号的下降沿当时钟从高变到低的时候被读取从主机发送
到键盘/鼠标的数据在上升沿(当时钟从低变到高的时候)被读取;不管通讯的方向怎样键盘/鼠标总是
产生时钟信号如果主机要发送数据它必须首先告诉设备开始产生时钟信号这个过程在下一章节中被描
述)。最大的时钟频率是33kHz ,而且大多数设备工作在10 20kHz 。如果你要制作一个PS/2 设备。我
推荐你把频率控制在15kHz 左右。这就意味着时钟应该是高40 微秒低40 微秒。
所有数据安排在字节中,每个字节为一帧,包含了11-12 个位。这些位的含义如下:
如果数据位中包含偶数个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
每位在时钟的下降沿被主机读入,如图2 和3 所示
时钟频率为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) 输出校验位 / 这说明主机要放弃这次
10) 延迟30 毫秒 (=50 微秒 from the tim传送
9) 输出停止位 (1) e Clock is released in sending the stop bit)
按如下的过程发送单个位:
1) Set/Reset Data
2) Delay 20 microseconds
3) Bring Clock low
4) Delay 40 microseconds
5) Release Clock
6) Delay 20 microseconds
1) 设置/复位数据
2) 延迟20 微秒
3) 把时钟拉低
4) 延迟40 微秒
5) 释放时钟
6) 延迟20 微秒
主机到设备的通讯
被发送的包有点不同于主机到设备通讯过程。首先,PS/2 设备总是产生时钟信号。如果主机要发
送数据,它必须首先把时钟和数据线设置为‘请求
发送’状态,如下示:
通过下拉时钟线至少100 微秒来抑制通讯。
通过下拉数据线来应用‘请求发送’,然后释放时钟。
设备应该在不超过10 毫秒的间隔内就要检查这个状态。当设备检测到这个状态,它将开始产生
时钟信号,并且时钟脉冲标记下输入八个数据位和一个停止位。主机仅当时钟线为低的时候改变数据线,
而数据在时钟脉冲的上升沿被锁存。这在发生在设备到主机通讯的过程中正好相反。
在停止位发送后,设备要应答接收到的字节,就把数据线拉低并产生最后一个时钟脉冲。如果主
机在第11 个时钟脉冲后不释放数据线,设备将继续产生时钟脉冲直到数据线被释放(然后设备将产生
一个错误)。
主机可以在第11 个时钟脉冲(应答位)前中止一次传送,只要下拉时钟线至少100 微秒。
要使得这个过程易于理解,主机必须按下面的步骤发送数据到PS/2 设备:
1) 把时钟线拉低至少100 微秒
2) 把数据线拉低
3) 释放数据线
4) 等待设备把时钟线拉低
5) 设置/复位数据线发送第一个数据位
6) 等待设备把时钟拉高
7) 等待设备把时钟拉低
8) 重复 5-7 步 发送剩下的7 个数据位和校验位
9) 释放数据线
10) 等待设备把数据线拉低
11) 等待设备把时钟线拉低
12) 等待设备释放数据线和时钟线
图3 用图形表示图4 以单独的时序表示了由主机产生的信号。及由PS/2 设备产生的信号。注意应答
位时序的改变-数据改变发生在时钟线为高的时候(不同于其它11 位是当它为低的时候)。
图4 描述了两个重要的定时条件:a 和b 。a 在主机最初把书记现拉低后,设备开始产生时钟脉
冲的时间,必须步大于15ms ;b 数据包被发送的时间必须不大于2ms 。如果这两个条件不满足,主
机将产生一个错误。在包收到后,主机为了处理数据立刻把时钟线拉低来抑制通讯。如果主机发送的命
令要求有一个回应,这个回应必须在书籍释放时钟线后20ms 之内被收到。如果没有收到,则主机产生
一个错误。在设备到主机通讯的情况中,时钟改变后的5 微秒内不应该发生数据改变的情况。
如果呢要仿真一个鼠标或键盘,我推荐你按如下的过程从主机读入数据;
在你的主程序中,至少每10 毫秒检测数据线是否为低。
如果数据线已被主机拉低,则从主机读取一个字节。
1) 等待时钟线为高
2) 数据线仍然为低吗
不-有错误发生;放弃。
3) 读入8 个数据位 / 在读入这些位后
4) 读入校验位 > 测试时钟线数否被主机拉低
5) 读入停止位 / 这就意味着放弃这次传送
6) 数据线仍旧为0 吗?
是保持时钟直到数据=1 然后产生一个错误
7) 输出应答位
8) 检查校验位
如果校验位不正确则产生一个错误
9) 延迟45 微秒(给主机时间抑制下次的传送)
按如下次序读取每位(8 个数据位检验位和停止位):
1) 延迟 20 微秒
2) 把时钟拉低
3) 延迟 40 微秒
4) 释放时钟
5) 延迟20 微秒
7) 读数据线
按如下次序发送应答位:
1) 延迟15 微秒
2) 把数据线拉低
3) 延迟5 微秒
4) 把时钟线拉低
5) 延迟40 微秒
6) 释放时钟线
7) 延迟5 微秒
8) 释放数据线
PS2接口协议及代码分析
(2011-10-14 12:23:40)
转载
ps2通信
ps2协议
it
▼
标签: 分类: 嵌入式
一.电气特性
1 DATA Key Data
2 n/c Not connected
3 GND Gnd
4 VCC Power , +5 VDC
5 CLK Clock
6 n/c Not connected
二.数据格式
1个起始位
8个数据位
1个奇偶校验位
1个停止位
1个应答位
总是逻辑0
(LSB)低位在前
奇校验
总是逻辑1
仅用在主机对设备的通讯中
表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;
总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。
ps2设备的clock和data都是集电极开路的,平时都是高电平。当ps2设备等待发送数据时,它首先检
查clock是否为高。如果为低,则认为PC抑制了通讯,此时它缓冲数据直到获得总线的控制权。如果clock
为高电平,ps2则开始向PC发送数据。
一般都是由ps2设备产生时钟信号。发送按帧格式。数据位在clock为高电平时准备好,在clock下降沿被
PC读入。
数据从键盘/鼠标发送到主机或从主机发送到键盘/鼠标,时钟都是PS2设备产生.主机对时钟控制有优先
权,即主机想发送控制指令给PS2设备时,可以拉低时钟线至少100μS,然后再下拉数据线,最后释放时钟
线为高。PS2设备的时钟线和数据线都是集电极开路的,容易实现拉低电平。
PC在时钟的下降沿读取数据.
PS: ps2协议是现在大多数鼠标,键盘与PC通讯的标准协议,鼠标的通讯更为简单些,只是传送
的数据内容不一样而已。
三.数据发送时序
键盘接口时序(a) 键盘发送时序;(b) 键盘接收时序
从PS/2向PC机发送一个字节可按照下面的步骤进行:
(1)检测时钟线电平,如果时钟线为低,则延时50μs;
(2)检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1);
(3)检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向 PS
/2设备发送数据,所以PS/2设备要转移到接收程序处接收数据);
(4)延时20μs(如果此时正在发送起始位,则应延时40μs);
(5)输出起始位(0)到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确
保PC机没有抑制PS/2设备,如果有则中止发送;
(6)输出8个数据位到数据线上;
(7)输出校验位;
(8)输出停止位(1);
(9)延时30μs(如果在发送停止位时释放时钟信号则应延时50μs);
通过以下步骤可发送单个位:
(1)准备数据位(将需要发送的数据位放到数据线上);
(2)延时20μs;
(3)把时钟线拉低;
(4)延时40μs;
(5)释放时钟线;
(6)延时20μs。
PS/2设备从PC机接收一个字节
由于PS/2设备能提供串行同步时钟,因此,如果PC机发送数据,则PC机要先把时钟线和
数据线置为请求发送的状态。PC机通过下拉时钟线大于100μs来抑制通讯,并且通过下拉数据线
发出请求发送数据的信号,然后释放时钟。当PS/2设备检测到需要接收的数据时,它会产生时钟信
号并记录下面8个数据位和一个停止位。主机此时在时钟线变为低时准备数据到数据线,并在时钟上升
沿锁存数据。而PS/2设备则要配合PC机才能读到准确的数据。具体连接步骤如下:
(1)等待时钟线为高电平。
(2)判断数据线是否为低,为高则错误退出,否则继续执行。
(3)读地址线上的数据内容,共8个bit,每读完一个位,都应检测时钟线是否被PC机拉
低,如果被拉低则要中止接收。
(4)读地址线上的校验位内容,1个bit。
(5)读停止位。
(6)如果数据线上为0(即还是低电平),PS/2设备继续产生时钟,直到接收到1且产生
出错信号为止(因为停止位是1,如果PS/2设备没有读到停止位,则表明此次传输出错)。
(7 输出应答位。
(8) 检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误。
(9)延时45 μs,以便PC机进行下一次传输。
读数据线的步骤如下:
(1)延时20μs;
(2)把时钟线拉低
(3)延时40μs
(4)释放时钟线
(5)延时20μs
(6)读数据线。
下面的步骤可用于发出应答位;
(1)延时15μs; (2)把数据线拉低;(3)延时5μs;(4)把时钟线拉低;(5)延
时40μs;(6)释放时钟线;(7)延时5μs; (8)释放数据线。
四.键盘返回值介绍:
键盘的处理器如果发现有键被按下或释放将发送扫描码的信息包到计算机。扫描码有两种不同的
类型:通码和断码。当一个键被按下就发送通码,当一个键被释放就发送断码。每个按键被分配了唯一
的通码和断码。这样主机通过查找唯一的扫描码就可以测定是哪个按键。每个键一整套的通断码组成了
扫描码集。有三套标准的扫描码集:分别是第一套,第二套和第三套。所有现代的键盘默认使用第二套
扫描码。
虽然多数第二套通码都只有一个字节宽,但也有少数扩展按键的通码是两字节或四字节宽。这类的
通码第一个字节总是为E0。
正如键按下通码就被发往计算机一样,只要键一释放断码就会被发送。每个键都有它自己唯一的通
码和断码。幸运的是你不用总是通过查表来找出按键的断码。在通码和断码之间存在着必然的联系。多
数第二套断码有两字节长。它们的第一个字节是F0 ,第二个字节是这个键的通码。扩展按键的断码通
常有三个字节,它们前两个字节是E0h,F0h ,最后一个字节是这个按键通码的最后一个字节。下面列
出了几个按键的第二套通码和断码:
No.
1
2
3
4
5
KEY
通码(第二套) 断码(第二套)
1C
2E
09
F0 1C
F0 2E
F0 09
E0 F0 74
E0 F0 14
"A"
"5"
"F10"
Right Arrow E0 74
Right "Ctrl" E0 14
一个键盘发送值的例子:
通码和断码是以什么样的序列发送到你的计算机从而使得字符G 出现在你的字处理软件里的呢?
因为这是一个大写字母,需要发生这样的事件次序:按下Shift 键-按下G键-释放G 键-释放Shift 键。
与这些时间相关的扫描码如下:Shift 键的通码12h,G 键的通码34h ,G 键的断码F0h 34h ,Shift 键
的断码F0h 12h 。因此发送到你的计算机的数据应该是:
12h 34h F0h 34h F0h 12h
五:第二套扫描码:
101 102 和104 键的键盘:
KEY
通码
断码
A
B
KEY
1C F0 1C
9
32 F0 32
`
通码
46
0E
断码
F0 46
F0 0E
KEY
通码 断码
54 F0 54 [
INSERT E0 70 E0 F0 70
C 21 F0 21
-
=
BKSP
4E
55
5D
66
F0 4E
F0 55
F0 5D
F0 66
F0 29
F0 0D
F0 58
F0 12
F0 14
HOME
PG UP
DELETE
END
PG DN
E0 6C E0 F0 6C
E0 7D E0 F0 7D
E0 71 E0 F0 71
E0 69 E0 F0 69
E0 7A E0 F0 7A
D 23 F0 23
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
0
1
2
3
4
5
6
24 F0 24
2B F0 2B
34 F0 34
33 F0 33
43 F0 43
3B F0 3B
42 F0 42
4B F0 4B
3A F0 3A
31 F0 31
44 F0 44
4D F0 4D
15 F0 15
2D F0 2D
1B F0 1B
2C F0 2C
3C F0 3C
2A F0 2A
1D F0 1D
22 F0 22
35 F0 35
1A F0 1A
45 F0 45
16 F0 16
1E F0 1E
26 F0 26
25 F0 25
2E F0 2E
36 F0 36
SPACE 29
TAB
CAPS
0D
58
U ARROW E0 75 E0 F0 75
L ARROW E0 6B E0 F0 6B
D ARROW E0 72 E0 F0 72
R ARROW E0 74 E0 F0 74
NUM
KP /
KP *
KP -
KP +
KP EN
KP
KP 0
KP 1
KP 2
KP 3
KP 4
KP 5
KP 6
KP 7
KP 8
KP 9
]
;
'
,
.
77 F0 77
L SHFT 12
L CTRL 14
L GUI
L ALT
E0 1F
11
R SHFT 59
R CTRL E0 14
R GUI E0 27
R ALT E0 11
APPS E0 2F
ENTER 5A
ESC
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
PRNT
76
05
06
04
0C
03
0B
83
0A
01
09
78
07
E0 12
E0 7C
E0 F0 1F
F0 11
F0 59
E0 F0 14
E0 F0 27
E0 F0 11
E0 F0 2F
F0 5A
F0 76
F0 05
F0 06
F0 04
F0 0C
F0 03
F0 0B
F0 83
F0 0A
F0 01
F0 09
F0 78
F0 07
E0 F0
7C E0
F0 12
E0 4A E0 F0 4A
7C
7B
79
F0 7C
F0 7B
F0 79
E0 5A E0 F0 5A
71
70
69
72
7A
6B
73
74
6C
75
7D
58
4C
52
41
49
F0 71
F0 70
F0 69
F0 72
F0 7A
F0 6B
F0 73
F0 74
F0 6C
F0 75
F0 7D
F0 58
F0 4C
F0 52
F0 41
F0 49
SCRN
7
8
3D F0 3D SCROLL 7E F0,7E
E1 14 77
3E F0 3E
PAUSE E1 F0 14 -NONE-
F0 77
/ 4A F0 4A
ACPI 扫描码:
KEY
通码 断码
Power E0, 37 E0, F0, 37
Sleep E0, 3F E0, F0, 3F
Wake E0, 5E E0, F0, 5E
Windows 多媒体扫描码:
KEY
Next Track
通码 断码
E0, 4D E0, F0, 4D
Previous Track E0, 15 E0, F0, 15
Stop
Play/Pause
Mute
Volume Up
E0, 3B E0, F0, 3B
E0, 34 E0, F0, 34
E0, 23 E0, F0, 23
E0, 32 E0, F0, 32
Volume Down E0, 21 E0, F0, 21
Media Select
Calculator
My Computer
WWW Search
WWW Home
WWW Back
E0, 50 E0, F0, 50
E0, 48 E0, F0, 48
E0, 2B E0, F0, 2b
E0, 40 E0, F0, 40
E0, 10 E0, F0, 10
E0, 3A E0, F0, 3a
E0, 38 E0, F0, 38
WWW Forward E0, 30 E0, F0, 20
WWW Stop E0, 28 E0, F0, 28
WWW Refresh E0, 20 E0, F0, 20
WWW Favorites E0, 18 E0, F0, 18
2024年5月16日发(作者:后飞昂)
PS2键盘与鼠标的接口定义
针脚定义:
原理
PS/2鼠标接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一
位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制鼠标的发送。方法是把时钟线一直
拉低,鼠标就不能产生时钟信号和发送数据。在两个方向的传输中,时钟信号都是由鼠标产生,即主机不产
生通信时钟信号。
如果主机要发送数据,它必须控制鼠标产生时钟信号。方法如下:主机首先下拉时钟线至少100μs
抑制通信,然后再下拉数据线,最后释放时钟线。通过这一时序控制鼠标产生时钟信号。当鼠标检测到这个
时序状态,会在10ms内产生时钟信号。如图3中 A 时序段。主机和鼠标之间,传输数据帧的时序如图2、
图3所示。2.2 数据包结构在主机程序中,利用每个数据位的时钟脉冲触发中断,在中断例程中实现数据位
的判断和接收。在实验过程中,通过合适的编程,能够正确控制并接收鼠标数据。但该方案有一点不足,由
于每个CLOCK都要产生一次中断,中断频繁,需要耗用大量的主机资源。
PS/2鼠标的四种工作模式是:Reset模式,当鼠标上电或主机发复位命令 0xFF给它时进入这种模
式;Stream模式鼠标的默认模式,当鼠标上电或复位完成后,自动进入此模式,鼠标基本上以此模式工
作;Remote模式,只有在主机发送了模式设置命令 0xF0后,鼠标才进入这种模式;Wrap模式,这种模式只用
于测试鼠标与主机连接是否正确。
PS/2鼠标在工作过程中,会及时把它的状态数据发送给主机。发送的数据包格式如表1所示。
Byte1中的Bit0、Bit1、Bit2分别表示左、右、中键的状态,状态值0表示释放,1表示按下。Byte2和
Byte3分别表示X轴和Y轴方向的移动计量值,是二进制补码值。Byte4的低四位表示滚轮的移动计量值,
也是二进制补码值,高四位作为扩展符号位。这种数据包由带滚轮的三键三维鼠标产生。若是不带滚轮的
三键鼠标,产生的数据包没有Byte4 其余的相同。
一.PS/2 鼠标键盘协议
PC 键盘可以有6 脚的mini-DIN 或5 脚的DIN 连接器如果你的键盘是6 脚的mini-DIN 而你的计
算机是5 脚的DIN 或者相反这两类连接器可以用上面提到的适配器来兼容具有6 脚mini-DIN 的键盘
通常被叫做PS/2 键盘而那些有5 脚DIN 叫做AT 设备XT 键盘也使用5 脚DIN 但它们非常古老并且多
年前就不生产了所有现代的为PC 建造的键盘不是PS/2,AT 就是USB 的这篇文章不适用于USB 设备它
们使用了一种完全不同的接口。
每种连接器的引脚定义如下所示
在刚才提到连接器上有四个有趣的管脚电源地5V 数据和时钟host 计算机提供5V 并且键盘/鼠
标的地连接到host 的电源地上数据和时钟都是集电极开路的这就意味着它们通常保持高电平而且很容
易下拉到地逻辑0 任何你连接到PS/2 鼠标键盘或host 的设备在时钟和数据线上要PS/2 技术参考 著
Adam Chapweske 译Roy Show第4 页共4 页 02-11-22发布有一个大的上拉电阻置0 就把线拉低置1
就让线上浮成高电平参考图1 中数据和时钟线的一般接口结构注意如果你打算使用象PIC 这样的微控
制器由于它们的I/O 管脚是双向的你可以跳过晶体管和缓冲门并且通用同一个管脚进行输入和输出在
这种组态情况下要设置管脚为输入就写入1 使得电阻上拉线上的电平要改变管脚为输出就写入0 到那
个管脚把线路下拉到地。)
PS/2 鼠标和键盘履行一种双向同步串行协议。换句话说每次数据线上发送一位数据并且每在时钟
线上发一个脉冲就被读入。键盘/鼠标可以发送数据到主机,而主机也可以发送数据到设备,但主机总
是在总线上有优先权,它可以在任何时候抑制来自于键盘/鼠标的通讯,只要把时钟拉低即可。
从键盘/鼠标发送到主机的数据在时钟信号的下降沿当时钟从高变到低的时候被读取从主机发送
到键盘/鼠标的数据在上升沿(当时钟从低变到高的时候)被读取;不管通讯的方向怎样键盘/鼠标总是
产生时钟信号如果主机要发送数据它必须首先告诉设备开始产生时钟信号这个过程在下一章节中被描
述)。最大的时钟频率是33kHz ,而且大多数设备工作在10 20kHz 。如果你要制作一个PS/2 设备。我
推荐你把频率控制在15kHz 左右。这就意味着时钟应该是高40 微秒低40 微秒。
所有数据安排在字节中,每个字节为一帧,包含了11-12 个位。这些位的含义如下:
如果数据位中包含偶数个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
每位在时钟的下降沿被主机读入,如图2 和3 所示
时钟频率为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) 输出校验位 / 这说明主机要放弃这次
10) 延迟30 毫秒 (=50 微秒 from the tim传送
9) 输出停止位 (1) e Clock is released in sending the stop bit)
按如下的过程发送单个位:
1) Set/Reset Data
2) Delay 20 microseconds
3) Bring Clock low
4) Delay 40 microseconds
5) Release Clock
6) Delay 20 microseconds
1) 设置/复位数据
2) 延迟20 微秒
3) 把时钟拉低
4) 延迟40 微秒
5) 释放时钟
6) 延迟20 微秒
主机到设备的通讯
被发送的包有点不同于主机到设备通讯过程。首先,PS/2 设备总是产生时钟信号。如果主机要发
送数据,它必须首先把时钟和数据线设置为‘请求
发送’状态,如下示:
通过下拉时钟线至少100 微秒来抑制通讯。
通过下拉数据线来应用‘请求发送’,然后释放时钟。
设备应该在不超过10 毫秒的间隔内就要检查这个状态。当设备检测到这个状态,它将开始产生
时钟信号,并且时钟脉冲标记下输入八个数据位和一个停止位。主机仅当时钟线为低的时候改变数据线,
而数据在时钟脉冲的上升沿被锁存。这在发生在设备到主机通讯的过程中正好相反。
在停止位发送后,设备要应答接收到的字节,就把数据线拉低并产生最后一个时钟脉冲。如果主
机在第11 个时钟脉冲后不释放数据线,设备将继续产生时钟脉冲直到数据线被释放(然后设备将产生
一个错误)。
主机可以在第11 个时钟脉冲(应答位)前中止一次传送,只要下拉时钟线至少100 微秒。
要使得这个过程易于理解,主机必须按下面的步骤发送数据到PS/2 设备:
1) 把时钟线拉低至少100 微秒
2) 把数据线拉低
3) 释放数据线
4) 等待设备把时钟线拉低
5) 设置/复位数据线发送第一个数据位
6) 等待设备把时钟拉高
7) 等待设备把时钟拉低
8) 重复 5-7 步 发送剩下的7 个数据位和校验位
9) 释放数据线
10) 等待设备把数据线拉低
11) 等待设备把时钟线拉低
12) 等待设备释放数据线和时钟线
图3 用图形表示图4 以单独的时序表示了由主机产生的信号。及由PS/2 设备产生的信号。注意应答
位时序的改变-数据改变发生在时钟线为高的时候(不同于其它11 位是当它为低的时候)。
图4 描述了两个重要的定时条件:a 和b 。a 在主机最初把书记现拉低后,设备开始产生时钟脉
冲的时间,必须步大于15ms ;b 数据包被发送的时间必须不大于2ms 。如果这两个条件不满足,主
机将产生一个错误。在包收到后,主机为了处理数据立刻把时钟线拉低来抑制通讯。如果主机发送的命
令要求有一个回应,这个回应必须在书籍释放时钟线后20ms 之内被收到。如果没有收到,则主机产生
一个错误。在设备到主机通讯的情况中,时钟改变后的5 微秒内不应该发生数据改变的情况。
如果呢要仿真一个鼠标或键盘,我推荐你按如下的过程从主机读入数据;
在你的主程序中,至少每10 毫秒检测数据线是否为低。
如果数据线已被主机拉低,则从主机读取一个字节。
1) 等待时钟线为高
2) 数据线仍然为低吗
不-有错误发生;放弃。
3) 读入8 个数据位 / 在读入这些位后
4) 读入校验位 > 测试时钟线数否被主机拉低
5) 读入停止位 / 这就意味着放弃这次传送
6) 数据线仍旧为0 吗?
是保持时钟直到数据=1 然后产生一个错误
7) 输出应答位
8) 检查校验位
如果校验位不正确则产生一个错误
9) 延迟45 微秒(给主机时间抑制下次的传送)
按如下次序读取每位(8 个数据位检验位和停止位):
1) 延迟 20 微秒
2) 把时钟拉低
3) 延迟 40 微秒
4) 释放时钟
5) 延迟20 微秒
7) 读数据线
按如下次序发送应答位:
1) 延迟15 微秒
2) 把数据线拉低
3) 延迟5 微秒
4) 把时钟线拉低
5) 延迟40 微秒
6) 释放时钟线
7) 延迟5 微秒
8) 释放数据线
PS2接口协议及代码分析
(2011-10-14 12:23:40)
转载
ps2通信
ps2协议
it
▼
标签: 分类: 嵌入式
一.电气特性
1 DATA Key Data
2 n/c Not connected
3 GND Gnd
4 VCC Power , +5 VDC
5 CLK Clock
6 n/c Not connected
二.数据格式
1个起始位
8个数据位
1个奇偶校验位
1个停止位
1个应答位
总是逻辑0
(LSB)低位在前
奇校验
总是逻辑1
仅用在主机对设备的通讯中
表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;
总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。
ps2设备的clock和data都是集电极开路的,平时都是高电平。当ps2设备等待发送数据时,它首先检
查clock是否为高。如果为低,则认为PC抑制了通讯,此时它缓冲数据直到获得总线的控制权。如果clock
为高电平,ps2则开始向PC发送数据。
一般都是由ps2设备产生时钟信号。发送按帧格式。数据位在clock为高电平时准备好,在clock下降沿被
PC读入。
数据从键盘/鼠标发送到主机或从主机发送到键盘/鼠标,时钟都是PS2设备产生.主机对时钟控制有优先
权,即主机想发送控制指令给PS2设备时,可以拉低时钟线至少100μS,然后再下拉数据线,最后释放时钟
线为高。PS2设备的时钟线和数据线都是集电极开路的,容易实现拉低电平。
PC在时钟的下降沿读取数据.
PS: ps2协议是现在大多数鼠标,键盘与PC通讯的标准协议,鼠标的通讯更为简单些,只是传送
的数据内容不一样而已。
三.数据发送时序
键盘接口时序(a) 键盘发送时序;(b) 键盘接收时序
从PS/2向PC机发送一个字节可按照下面的步骤进行:
(1)检测时钟线电平,如果时钟线为低,则延时50μs;
(2)检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1);
(3)检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向 PS
/2设备发送数据,所以PS/2设备要转移到接收程序处接收数据);
(4)延时20μs(如果此时正在发送起始位,则应延时40μs);
(5)输出起始位(0)到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确
保PC机没有抑制PS/2设备,如果有则中止发送;
(6)输出8个数据位到数据线上;
(7)输出校验位;
(8)输出停止位(1);
(9)延时30μs(如果在发送停止位时释放时钟信号则应延时50μs);
通过以下步骤可发送单个位:
(1)准备数据位(将需要发送的数据位放到数据线上);
(2)延时20μs;
(3)把时钟线拉低;
(4)延时40μs;
(5)释放时钟线;
(6)延时20μs。
PS/2设备从PC机接收一个字节
由于PS/2设备能提供串行同步时钟,因此,如果PC机发送数据,则PC机要先把时钟线和
数据线置为请求发送的状态。PC机通过下拉时钟线大于100μs来抑制通讯,并且通过下拉数据线
发出请求发送数据的信号,然后释放时钟。当PS/2设备检测到需要接收的数据时,它会产生时钟信
号并记录下面8个数据位和一个停止位。主机此时在时钟线变为低时准备数据到数据线,并在时钟上升
沿锁存数据。而PS/2设备则要配合PC机才能读到准确的数据。具体连接步骤如下:
(1)等待时钟线为高电平。
(2)判断数据线是否为低,为高则错误退出,否则继续执行。
(3)读地址线上的数据内容,共8个bit,每读完一个位,都应检测时钟线是否被PC机拉
低,如果被拉低则要中止接收。
(4)读地址线上的校验位内容,1个bit。
(5)读停止位。
(6)如果数据线上为0(即还是低电平),PS/2设备继续产生时钟,直到接收到1且产生
出错信号为止(因为停止位是1,如果PS/2设备没有读到停止位,则表明此次传输出错)。
(7 输出应答位。
(8) 检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误。
(9)延时45 μs,以便PC机进行下一次传输。
读数据线的步骤如下:
(1)延时20μs;
(2)把时钟线拉低
(3)延时40μs
(4)释放时钟线
(5)延时20μs
(6)读数据线。
下面的步骤可用于发出应答位;
(1)延时15μs; (2)把数据线拉低;(3)延时5μs;(4)把时钟线拉低;(5)延
时40μs;(6)释放时钟线;(7)延时5μs; (8)释放数据线。
四.键盘返回值介绍:
键盘的处理器如果发现有键被按下或释放将发送扫描码的信息包到计算机。扫描码有两种不同的
类型:通码和断码。当一个键被按下就发送通码,当一个键被释放就发送断码。每个按键被分配了唯一
的通码和断码。这样主机通过查找唯一的扫描码就可以测定是哪个按键。每个键一整套的通断码组成了
扫描码集。有三套标准的扫描码集:分别是第一套,第二套和第三套。所有现代的键盘默认使用第二套
扫描码。
虽然多数第二套通码都只有一个字节宽,但也有少数扩展按键的通码是两字节或四字节宽。这类的
通码第一个字节总是为E0。
正如键按下通码就被发往计算机一样,只要键一释放断码就会被发送。每个键都有它自己唯一的通
码和断码。幸运的是你不用总是通过查表来找出按键的断码。在通码和断码之间存在着必然的联系。多
数第二套断码有两字节长。它们的第一个字节是F0 ,第二个字节是这个键的通码。扩展按键的断码通
常有三个字节,它们前两个字节是E0h,F0h ,最后一个字节是这个按键通码的最后一个字节。下面列
出了几个按键的第二套通码和断码:
No.
1
2
3
4
5
KEY
通码(第二套) 断码(第二套)
1C
2E
09
F0 1C
F0 2E
F0 09
E0 F0 74
E0 F0 14
"A"
"5"
"F10"
Right Arrow E0 74
Right "Ctrl" E0 14
一个键盘发送值的例子:
通码和断码是以什么样的序列发送到你的计算机从而使得字符G 出现在你的字处理软件里的呢?
因为这是一个大写字母,需要发生这样的事件次序:按下Shift 键-按下G键-释放G 键-释放Shift 键。
与这些时间相关的扫描码如下:Shift 键的通码12h,G 键的通码34h ,G 键的断码F0h 34h ,Shift 键
的断码F0h 12h 。因此发送到你的计算机的数据应该是:
12h 34h F0h 34h F0h 12h
五:第二套扫描码:
101 102 和104 键的键盘:
KEY
通码
断码
A
B
KEY
1C F0 1C
9
32 F0 32
`
通码
46
0E
断码
F0 46
F0 0E
KEY
通码 断码
54 F0 54 [
INSERT E0 70 E0 F0 70
C 21 F0 21
-
=
BKSP
4E
55
5D
66
F0 4E
F0 55
F0 5D
F0 66
F0 29
F0 0D
F0 58
F0 12
F0 14
HOME
PG UP
DELETE
END
PG DN
E0 6C E0 F0 6C
E0 7D E0 F0 7D
E0 71 E0 F0 71
E0 69 E0 F0 69
E0 7A E0 F0 7A
D 23 F0 23
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
0
1
2
3
4
5
6
24 F0 24
2B F0 2B
34 F0 34
33 F0 33
43 F0 43
3B F0 3B
42 F0 42
4B F0 4B
3A F0 3A
31 F0 31
44 F0 44
4D F0 4D
15 F0 15
2D F0 2D
1B F0 1B
2C F0 2C
3C F0 3C
2A F0 2A
1D F0 1D
22 F0 22
35 F0 35
1A F0 1A
45 F0 45
16 F0 16
1E F0 1E
26 F0 26
25 F0 25
2E F0 2E
36 F0 36
SPACE 29
TAB
CAPS
0D
58
U ARROW E0 75 E0 F0 75
L ARROW E0 6B E0 F0 6B
D ARROW E0 72 E0 F0 72
R ARROW E0 74 E0 F0 74
NUM
KP /
KP *
KP -
KP +
KP EN
KP
KP 0
KP 1
KP 2
KP 3
KP 4
KP 5
KP 6
KP 7
KP 8
KP 9
]
;
'
,
.
77 F0 77
L SHFT 12
L CTRL 14
L GUI
L ALT
E0 1F
11
R SHFT 59
R CTRL E0 14
R GUI E0 27
R ALT E0 11
APPS E0 2F
ENTER 5A
ESC
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
PRNT
76
05
06
04
0C
03
0B
83
0A
01
09
78
07
E0 12
E0 7C
E0 F0 1F
F0 11
F0 59
E0 F0 14
E0 F0 27
E0 F0 11
E0 F0 2F
F0 5A
F0 76
F0 05
F0 06
F0 04
F0 0C
F0 03
F0 0B
F0 83
F0 0A
F0 01
F0 09
F0 78
F0 07
E0 F0
7C E0
F0 12
E0 4A E0 F0 4A
7C
7B
79
F0 7C
F0 7B
F0 79
E0 5A E0 F0 5A
71
70
69
72
7A
6B
73
74
6C
75
7D
58
4C
52
41
49
F0 71
F0 70
F0 69
F0 72
F0 7A
F0 6B
F0 73
F0 74
F0 6C
F0 75
F0 7D
F0 58
F0 4C
F0 52
F0 41
F0 49
SCRN
7
8
3D F0 3D SCROLL 7E F0,7E
E1 14 77
3E F0 3E
PAUSE E1 F0 14 -NONE-
F0 77
/ 4A F0 4A
ACPI 扫描码:
KEY
通码 断码
Power E0, 37 E0, F0, 37
Sleep E0, 3F E0, F0, 3F
Wake E0, 5E E0, F0, 5E
Windows 多媒体扫描码:
KEY
Next Track
通码 断码
E0, 4D E0, F0, 4D
Previous Track E0, 15 E0, F0, 15
Stop
Play/Pause
Mute
Volume Up
E0, 3B E0, F0, 3B
E0, 34 E0, F0, 34
E0, 23 E0, F0, 23
E0, 32 E0, F0, 32
Volume Down E0, 21 E0, F0, 21
Media Select
Calculator
My Computer
WWW Search
WWW Home
WWW Back
E0, 50 E0, F0, 50
E0, 48 E0, F0, 48
E0, 2B E0, F0, 2b
E0, 40 E0, F0, 40
E0, 10 E0, F0, 10
E0, 3A E0, F0, 3a
E0, 38 E0, F0, 38
WWW Forward E0, 30 E0, F0, 20
WWW Stop E0, 28 E0, F0, 28
WWW Refresh E0, 20 E0, F0, 20
WWW Favorites E0, 18 E0, F0, 18