ps2.docx
- 文档编号:24296680
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:14
- 大小:174.78KB
ps2.docx
《ps2.docx》由会员分享,可在线阅读,更多相关《ps2.docx(14页珍藏版)》请在冰豆网上搜索。
ps2
2 PS/2接口硬件
2.1物理连接器
一般,具有五脚连接器的键盘称之为AT键盘,而具有六脚mini-DIN连接器的键盘则称之为PS/2键盘。
其实这两种连接器都只有四个脚有意义。
它们分别是Clock(时钟脚)、Data数据脚、+5V(电源脚)和Ground(电源地)。
在PS/2键盘与PC机的物理连接上只要保证这四根线一一对应就可以了。
PS/2键盘靠PC的PS/2端口提供+5V电源,另外两个脚Clock(时钟脚)和Data数据脚都是集电极开路的,所以必须接大阻值的上拉电阻。
它们平时保持高电平,有输出时才被拉到低电平,之后自动上浮到高电平。
现在比较常用的连接器如图1所示。
2.2电气特性
PS/2通讯协议是一种双向同步串行通讯协议。
通讯的两端通过Clock(时钟脚)同步,并通过Data(数据脚)交换数据。
任何一方如果想抑制另外一方通讯时,只需要把Clock(时钟脚)拉到低电平。
如果是PC机和PS/2键盘间的通讯,则PC机必须做主机,也就是说,PC机可以抑制PS/2键盘发送数据,而PS/2键盘则不会抑制PC机发送数据。
一般两设备间传输数据的最大时钟频率是33kHz,大多数PS/2设备工作在10~20kHz。
推荐值在15kHz左右,也就是说,Clock(时钟脚)高、低电平的持续时间都为40μs。
每一数据帧包含11~12个位,具体含义如表1所列。
表1数据帧格式说明
1个起始位
总是逻辑0
8个数据位
(LSB)低位在前
1个奇偶校验位
奇校验
1个停止位
总是逻辑1
1个应答位
仅用在主机对设备的通讯中
表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。
2.3PS/2设备和PC机的通讯
PS/2设备的Clock(时钟脚)和Data数据脚都是集电极开路的,平时都是高电平。
当PS/2设备等待发送数据时,它首先检查Clock(时钟脚)以确认其是否为高电平。
如果是低电平,则认为是PC机抑制了通讯,此时它必须缓冲需要发送的数据直到重新获得总线的控制权(一般PS/2键盘有16个字节的缓冲区,而PS/2鼠标只有一个缓冲区仅存储最后一个要发送的数据)。
如果Clock(时钟脚)为高电平,PS/2设备便开始将数据发送到PC机。
一般都是由PS/2设备产生时钟信号。
发送时一般都是按照数据帧格式顺序发送。
其中数据位在Clock(时钟脚)为高电平时准备好,在Clock(时钟脚)的下降沿被PC机读入。
PS/2设备到PC机的通讯时序如图2所示。
从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。
3.2PS/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)释放数据线。
4 用于工控机的双键盘设计
工控机通常要接标准键盘,但是为了方便操作,常常需要外接一个专用键盘。
此实例介绍了在工控PC机到PS/2总线上再接入一个自制专用键盘的应用方法。
该设计应能保证两个键盘单独工作,而且相互不能影响。
因此,不能直接把专用键盘和标准键盘一起接到工控PC的PS/2口。
鉴于这种情况,本设计使用模拟开关CD4052并通过时分复用工控PC的PS/2口,来使在同一个时刻只有一个键盘有效,从而解决上述问题。
其硬件原理图如图3所示。
其中P2口和P1口用于键盘扫描电路(图中未画出),P0.0为数据端,P0.1为时钟端,P0.2为模拟开关选通端。
由于专用键盘不需要接收工控PC机的命令,所以软件中并不需要写这部分相应的代码。
通过软件可在专用键盘复位后把P0.2清0,以使模拟开关CD4052打开相应的通道。
这时工控PC的标准键盘将开始工作。
标准键盘可以完成工控PC刚启动时对外设检测的应答。
复位后的专用键盘不停地扫描有没有按键,如果有键按下则识别按键,并且按照预先的设计进行编码,同时调用发送程序并通过PS/2口发送到工控PC。
此时模拟开关关闭相应通道(将P0.2置1),专用键盘接入工控PCPS/2口的时钟线和数据线而工作,但标准键盘被模拟开关从PS/2的时钟线和数据线中断而不工作,这样,双键盘便可时分复用同一个工控PC机的PS/2口。
相应的发送子程序如下:
#defineDATAP00用P0.0做数据线
#defineCLKP01用P0.1做时钟线
#defineINHIBITP02用P0.2做CD4052的INH端
#definePORTRP1用P1口做读入口
#definePORTWP2用P2口做写出口可以实现64个自定义键
voidsend(ucharx)/***functionforsendacharda-ta***/
{
uchari,temp,char_temp;
bitflag_check=1;
INHIBIT=1;//disablestandardkeyboard
delay_ms(3);
temp=x;
for(i=0;i<8;i++)//findthenumberof1inthisucharxisoddornot
{
char_temp=temp&0x01;
if(char_temp==0x01)
{
flag_check=!
flag_check;
}
temp=temp>>1;
}
CLK=1;//send1toP1thenreadP1
while(!
CLK)//ifCLKislowwait
{
;
}
CLK=1;DATA=1;//send1toP1thenreadP1
if(CLK==1)
{
delay_us(30);//
}
if(CLK==1&&DATA==1)//senddata
{
DATA=0;//startbit0
delay_us(10);
CLK=0;
delay_us(5);//
temp=x;
for(i=0;i<8;i++)//send8bitsLSBfirst
{
CLK=1;
delay_us(5);
char_temp=temp&0x01;
if(char_temp==0x01)
{
DATA=1;
}
else
{
DATA=0;
}
//DATA=(bit)(temp&0x01);
//LSB
delay_us(10);
CLK=0;
delay_us(5);
temp=temp>>1;
}
CLK=1;//sendcheckbit
delay_us(5);?
DATA=flag_check;
delay_us(10);?
CLK=0;
delay_us(5)
CLK=1;//sendstopbit
delay_us(5);?
DATA=1;
delayus?
10?
?
CLK=0?
delay_us(5);?
CLK=1;
delay_us(30);?
?
CLK=1;DATA=1;//send1toP1thenreadP1
if(CLK==1&&DATA==0)
{
return;//pcissendingdatatomcu,goto
receivingfunction
}
INHIBIT=0;//enablestandardkeyboard
}
电路的主体为ATMEL公司的51系列芯片ATMEL89S52(以下简称S52)和PHILIPS公司的并行传输USB接口芯片PDIUSBD12(以下简称D12)。
S52相信读者已经非常熟悉了,最高24MHz的主频,256字节的RAM,4组8位I/O口,没有什么特别的功能,一切中规中矩,本设计在此仅用到一个外部中断。
但这同时也说明,任何51内核(带总线)的单片机都可以适用。
PDIUSBD12是应用十分广泛的并行接口USB控制芯片,作为实现USB接口的标准组件,D12使设计者能够灵活选择合适的MCU,用最经济最快的方式实现USB外设的解决方案。
S52主要完成PS2接口鼠标的控制与数据获取,并通过PDIUSBD12与PC完成鼠标协议数据的传输。
为了精简电路,S52使用D12的可编程时钟源,通过编程输出高达24MHz的时钟,供S52使用;观察调试输出的Uart波特率需要为19200bps,便于快速输出信息,不耽误正常的USB枚举。
软件设计
鼠标的工作模式有四种,分别为Reset模式,Wrap模式,Remote模式和Stream模式。
前两种作为测试用,Remote模式为主机有需要时,发送命令使鼠标回送位移数据,Stream模式是上电的初始模式,每当鼠标产生位置或者按键状态的改变就自动发送数据。
显而易见,第四种模式最为合适。
正常读取鼠标数据前只需发送命令(0xF4),此命令告知鼠标,主机已经准备完毕,可以接受位移数据。
但是这样简单的初始化存在着一个显著的缺陷,就是笔者发现滚轮无法使用了。
这个问题困扰了笔者很久,原以为是软件编写出现小错误,引起鼠标能工作,但工作不正常。
后来仔细查看了相关文档才发现,鼠标的初始化远没有那么简单,有点复杂却非常有趣:
首先进行复位,这时的鼠标还是不带滚轮的,然后依次设置鼠标的采样率为200、100、80,这时候,就可以被识别为带滚轮的鼠标了,随后就根据需要,设置所需的采样率,一般默认的100即可。
PS/2鼠标与控制器间履行一种双向同步串行数据帧协议,每帧为11~12Bit,如图3所示。
按照标准的三键鼠标的数据包有效数据为3个字节,如图4所示。
读取PS/2鼠标数据后需要按照USB鼠标的格式进行转换。
USB鼠标的数据格式如图5所示:
此鼠标的重点调试重点是S52的USB控制代码。
笔者参考了PHILIPS的标准固件驱动代码,并进行了一定优化。
USB的控制代码通常由三部分组成。
(1)初始化:
初始化主要对S52以及外围电路的初始化,通过复位,初始化USB并读取D12的ChipID进行确认(D12的ChipID为0x1012);
(2)中断服务:
用于对主机的令牌包的响应,主要包括StandardDeviceReq标准请求,VendorDeviceReq用户厂商请求和ClassFunctionReq类设备请求等,其中比较重要的为标准请求。
标准请求的作用是告诉PC这是一个什么样的USB设备,包括USB类型、USB设备的描述符等;
(3)主循环处理数据:
用于对获得的USB鼠标数据的处理填充,并等待PC要求数据时将数据传送给PC。
Windows对USB设备的枚举顺序:
(1)GetDeviceDescriptor:
主机主要对Length感兴趣,即第2字节type必须为0x01,即Device,否则PC将重复2次后放弃(注意:
此步只发送前16字节设备描述符);
(2)SetAddress:
一般为02或者03;
(3)GetDeviceDescriptor:
读取全部设备描述符,一般为18字节分为2次传输,如果不正确PC重复2次后放弃(与
(1)步相比,此步发送全部的18字节设备描述符);
(4)GetConfigDescriptor:
注意第2字节一定为0x02即Config;
(5)GetStringDescriptor:
根据在设备描述符中的第15、16、17字节索引顺序而定,一般先读取LanguageID再读取ProductString读取全部ConfigDescriptor,次数根据描述符的大小决定,端点个数不同,描述符大小不同。
至此PC已经能正确识别设备并安装驱动,如果不正确PC将重复2次后放弃;
(6)SetCorfiguration、GetConfiguration和Getlnterface等调用,对设备的状态进行最后的配置即完成设备的枚举。
在编写USB固件程序时需要注意:
(1)S52的中断应设置为电平触发,中断后必须读上次传输状态寄存器命令0x40-0x45,以清除中断寄存器中的中断标志,只有这样D12的中断输出才能变回高电平;
(2)在接收到Setup包后必须调用ACKsetup命令重新使能端口0;
(3)在向IN端点写完数据后必须调用ValidateBuffer命令(0xFA)指明缓冲区中的数据有效,可以发送到主机;
(4)当读完数据后必须调用ClearBuffer命令(0xF2),以保证可以接收新的包;
(5)在调试过程中,可使用USBVIEW等工具软件,外加代码中的串口输出调试信息配合完成;
(6)在代码中涉及到鼠标报告描述符MouseReportDescriptor,可以使用HIDDescrptor
Tool工具生成。
USB鼠标的软件流程如下:
完成后的截图如图7所示。
图7为在设备管理器中看到的识别为“USB人体学输入设备”以及“HID-compliantmouse”;在“人体学输入设备”查看属性,可看到“位置0(LLH-HXY’MOUSE)”。
图8为使用USBVIEW调试工具看到的USB鼠标信息。
图9为笔者的做的实物图,正在使用中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ps2