PS2鼠标接口程序设计总结

更新时间:2024-01-21 06:45:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章

1.1 PS/2鼠标接口简介

PS2鼠标接口程序设计总结

标准的PS/2鼠标,支持下面的输入X(左右)位移、Y(上下)位移、左键、中键和右键鼠标以一个固定的频率读取这些输入,并更新不同的计数器,然后标记出反映的移动和按键状态。 标准的鼠标有两个计数器,保持位移的跟踪,X位移计数器和Y位移计数器。可存放9位的2进制补码,并且每个计数器都有相关的溢出标志,它们的内容连同三个鼠标按钮的状态一起以三字节移动数据包的形式发送给主机。位移计数器表示从最后一次位移数据包被送往主机后,有位移量发生。

当鼠标读取它的输入的时候,它记录按键的当前状态,然后检查位移,如果位移发生它就增加(对正位移)或减少(对负位移)X和/或Y位移计数器的值。如果有一个计数器溢出了就设置相应的溢出标志。 1.1.1 输入分辨率和缩入比例

决定位移计数器增减数量的参数叫分辨率,缺省的分辨率为4个计数单位/毫米,主机可以用设置分辨率0xE8命令改变这个值。

有一个参数不影响位移计数器的值,但是影响这些计数器报告的值。这个参数就是缩放比 例,缺省情况下鼠标使用1:1比例。因此对报告的鼠标位移没有影响,但是主机可以用设置比例2:1(0xE7)命令选择2:1比例。如果启用了2:1比例,鼠标在发数据给主机前采用如表1.1的算法运算计数器内容。

表1.1 缩放比例算法运算表 位移增量值 0 1 2 3 4 5 N>5 报告值 0 1 1 3 6 9 2*N 1.1.2 位移数据包

标准的PS/2鼠标,发送位移和按键信息给主机采用如表1.2的3字节数据包格式。

Byte1 Byte2 Byte3 D7 D6 Y X overflow overflow 表1.2 3字节数据包格式 D5 D4 D3 Y X Always1 sign bit sign bit X Movement Y Movement D2 Middle Btn D1 Right Btn D0 Left Btn 位移计数器是一个9位2进制的补码整数。它的最高位作为符号位出现,在位移数据包的第一个字节里,这些计数器在鼠标读取输入发现有位移时被更新。这些值是自从最后一次发送位移数据包给主机后位移的累计量(即最后一次数据包发给主机后位移计数器被复位)。位移计数器可表示的值的范围是-255 到+255。如果超过了范围,相应的溢出位就被设置,并且在复位前计数器不会增减。一旦位移数据包成功地发送给主机,位移计数器就会复位,同样鼠标在收到主机不是“Resend” 0xFE命令外的其他命令计数器也会复位。 1.1.3 Intelimouse的扩展

对标准的PS/2 鼠标的一个流行的扩展是微软的Intellimouse。它包括支持五个鼠标按键和三个位移轴(左右上下和滚轮)。这些附加特征要求使用4字节的位移数据包,而不是标准3 字节包,因为标准PS/2 鼠标驱动不认识这个数据包的格式,因此微软的Intellimouse要求严格按

照标准PS/2 鼠标来操作。除非它知道驱动程序支持扩展数据包格式,如果微软的Intellimouse用于一台只支持标准PS/2 鼠标的计算机它依然是有功能的,只是滚轮和第4 5 个按键不起作用。

微软的Intellimouse工作起来象标准的PS/2 鼠标,(也就是使用3 字节位移数据包,和标准PS/2 鼠标一样回应所有命令报告设备ID 0x00)。

要进入滚轮模式,主机应该发送如下的命令序列: 设置采样速率 200 设置采样速率 100 设置采样速率 80

要进入滚轮+5键模式,主机应该发送如下的命令序列: 设置采样速率 200 设置采样速率 200 设置采样速率 80

主机然后应该发布“获得设备ID” 命令0xF2并等待回应,如果安装的是是标准PS/2 鼠标非Intellimouse,它回应设备ID0x00。在这种情况下主机会辨认出实际这个鼠标没有滚轮并继续把它当作是标准PS/2 鼠标。但是如果安装的是微软的Intellimouse它返回的ID是0x03。这就告诉主机挂接的定点设备有滚轮,并且主机认为鼠标使用4 字节的位移数据包,如表1.3所示: Byte1 Byte2 Byte3 Byte4 D7 Y overflow D6 X overflow 表1.3 4字节数据包格式 D5 D4 D3 Y sign bit X sign bit Always1 X Movement Y Movement Z Movement D2 Middle Btn D1 Right Btn D0 Left Btn Z 位移是2的补码,表示滚轮自上次数据报告以来的位移,有效值的范围在-8 到+7 这意味着数值实际只有低四位高四位仅用作符号扩展位。

主机接着发布“获得设备ID” 命令(0xF2)并等待回应,微软的Intellimouse用0x04 这样设备ID 应答并且使用如下的4 字节位移数据包,如表1.4所示: Byte1 Byte2 Byte3 Byte1 D7 Y overflow D6 X overflow 表1.4 五键4字节数据包格式 D5 D4 D3 D2 Y sign bit X sign bit Always1 Middle Btn X Movement Y Movement 5th Btn 4th Btn Z3 Z2 D1 Right Btn D0 Left Btn Always0 Always0 Z1 Z0 Z0-Z3是2的补码,用于表示从上次数据报告以来滚轮的位移量,有效范围从-8 到+7。 第4键:1=第4键按下了;0=第4键没有按下。 第5键:1=第5键按下了;0=第5键没有按下。

1.2 操作模式

根据鼠标工作的模式来处理的数据报告有四种标准的工作模式。

●Reset——鼠标在上电或收到“Reset”(0xFF)命令后进入Reset 模式

●Stream——这是缺省模式在Reset执行完成后,也是多数软件使用鼠标的模式。如果主机先前把鼠标设置到了Remote模式,那它可以发送Set Stream Mode(0xEA)命令给鼠标,让鼠标重新进入Stream模式。

●Remote——在某些情况下Remote模式很有用可以通过发送Set Remote Mode(0xF0)命令进入。

●Wrap——除了为测试鼠标和它的主机之间的连接外这个模式不是特别地有用。Wrap模式可以通过发送Set Wrap Mode(0xEE)命令给鼠标来进入,要退出Wrap 模式主机必须发

布Reset(0xFF)命令或Reset Wrap Mode(0xEC)命令。如果Reset(0xFF)命令收到了,鼠标将进入Reset 模式。如果收到的是Reset Wrap Mode(0xEC)命令鼠标将进入Wrap 模式前的那个模式。

(注意鼠标同样可以进入extended操作模式,正如本文后面所述但是这不是标准PS/2 鼠标的 特征。) 1.2.1、Reset模式

鼠标在上电后或应答“Reset”(0xFF)命令就进入reset模式。进入这个模式后鼠标执行象前面提到的BAT (基本保证测试)一样的自检并设置如下的缺省值:

●采样速率100 采样点/秒 ●分辨率4 个计数值/毫米 ●缩放比例1:1 ●数据报告被禁止

然后发送BAT完成代码,这个代码不是0xAA(BAT 成功)就是0xFC(错误)如果主机收到了不是0xAA的回应,它可能重新给鼠标供电,这样来引起鼠标复位并重新执行BAT。接着BAT完成代码(0xAA 或0xFC)的后面鼠标发送它的设备ID 0x00。 这个ID 用来区别设备是键盘还是处于扩展模式中的鼠标(从发复位命令到鼠标发送它的设备ID时间大概为360mS)。在一些文件中说主机在没收到设备ID 前不会假定发送任何数据。但有些BIOS 在上电复位并收到0xAA 后立刻发送“Reset”(0xFF) 命令。鼠标发送自己的设备ID 给主机后它就进入了Stream 模式。注意鼠标设置的一个缺省值之一是数据报告被禁止,这就意味着鼠标在没收到“使能数据报告”(0xF4)命令之前不会发送任何位移数据包给主机。 1.2.2、Stream模式

在Stream 模式中,一旦鼠标检测到位移或发现一个或多个鼠标键的状态改变了就发送位移数据包。数据报告的最大速率被认为是采样速率。参数的范围从10 采样点/秒到200 采样点/秒,这个参数的缺省值是100采样点/秒。主机可以用设置采样速率(0xF3)命令来改变它。Stream 模式是操作的缺省模式。 1.23、Remote模式

在这个模式下鼠标以当前的采样速率读取输入,并更新它的计数器和标志。但是它只在主机请求数据的时候才报告给主机位移和按键状态。主机通过“读数据”(0xEB)命令来获得数据,在收到命令后鼠标发送位移数据包并复位它的位移计数器 1.24、Wrap模式

这是一个回声模式,鼠标收到的每个字节都会被发回主机,甚至收到的是一个有效的命令鼠标都不会应答这条命令,它只把这个字节回送给主机。但是有两个例外“Reset”(0xff)命令和“Reset Wrap Mode” (0xEC)命令鼠标认为这两条命令是一有效的命令,并且不会回送它们到主机。

1.3 初始化

下面是在计算机运行Win98SE 和鼠标之间的通讯。启动的时候插有一个PS/2 鼠标,PS/2 鼠标的初始化过程相当的典型。如果你要仿真一个PS/2 鼠标必须至少能支持如下的命令序列:

上电复位

Mouse: AA 自我测检通过 Mouse: 00 鼠标ID

Host: FF 主机发送复位命令 Mouse: FA 鼠标应答 Mouse: AA 自我测检通过 Mouse: 00 鼠标ID

Host: FF 主机发送复位命令 Mouse: FA 鼠标应答 Mouse: AA 自我测检通过 Mouse: 00 鼠标ID

Host: FF 主机发送复位命令 Mouse: FA 鼠标应答 Mouse: AA 自我测检通过 Mouse: 00 鼠标ID

Host: F3 设置采样速率,识别鼠标是否带滚轮 Mouse: FA 鼠标应答

Host: C8 采样速率 200点/秒 Mouse: FA 鼠标应答

Host: F3 设置采样速率 Mouse: FA 鼠标应答

Host:64 采样速率 100点/秒 Mouse: FA 鼠标应答

Host: F3 设置采样速率 Mouse: FA 鼠标应答

Host:50 采样速率 80点/秒 Host: F2 获取设备ID Mouse: FA 鼠标应答

Mouse: 00 鼠标ID,如果回应的是03带滚轮的三键鼠标

//-------------------------------此段不知有何作用------------- Mouse: FA 鼠标应答

Host: F3 设置采样速率 Mouse: FA 鼠标应答

Host:0A 采样速率 10点/秒 Mouse: FA 鼠标应答

Host: F2 获取设备ID Mouse: FA 鼠标应答 Mouse: 00 鼠标ID

//---------------------------------------------------------------------

Host: E8 设置分辨率 Mouse: FA 鼠标应答

Host: 03 8个计数值/毫米

Mouse: FA 鼠标应答

Host: E6 缩放比例1:1 Mouse: FA 鼠标应答

Host: F3 设置采样速率 Mouse: FA 鼠标应答

Host28 采样速率 40点/秒 Mouse: FA 鼠标应答

Host: F4 使能数据报告 Mouse: FA 鼠标应答

初始化完成

1.4 命令集

下面列出的是仅可发送给鼠标的命令,如果鼠标工作在Stream模式,主机在发送任何其他命令之前,要先禁止数据报告(命令0xF5)。

● 0xFF (Reset)——鼠标用应答0xFA,回应这条命令并进入Reset模式 ● 0xFE (Resend)——只要从鼠标收到无效数据,主机就发送这条命令,鼠标的回应是重新发送它最后发

给主机的数据包。如果鼠标用了另外一个非法的包来回应主机,要么发布另一条Resend 命令,要么发布Error命令要么让鼠标重新上电来复位它,或者禁止通讯把时钟线拉低,采取什么样的动作取决于主机。

● 0xF6 (Set Defaults)——鼠标用应答0xFA来回应,然后载入如下的值:采样率=100,分

辨率 = 4个值/毫米、比例1 :1禁止数据报告,接着鼠标清空它所有的位移计数器,并进入stream 模式。

● 0xF5 (Disable Data Reporting)——鼠标用应答0xFA回应命令,然后禁止数据报告,并复位它的位移计数器。这仅对Stream模式下的数据报告有效。并且它不能禁止采样。禁止的stream模式功能与remote 模式相同。

● 0xF4 (Enable Data Reporting)——鼠标用应答0xFA回应命令,然后使能数据报告,并复位它的位移计数器。这条命令可以对在Remote模式或Stream模式下的鼠标发布。但只对Stream模式下的数据报告有效。

● 0xF3 (Set Sample Rate)——鼠标用应答0xFA 回应命令,然后从主机读入一个或更多字节。鼠标保留这个字节作为新的采样速率在收到采样速率后,鼠标再次用应答0xFA 回应,并复位它的位移计数器。有效的采样速率是10、20、40 、60、80、100和200 采样点/秒。

● 0xF2 (Get Device ID)——鼠标用应答0xFA 回应命令,后面跟着它的设备ID,对标准PS/2 鼠标来说是0x00;鼠标同样会复位它的位移计数器。

● 0xF0(Set Remote Mode)——鼠标用应答0xFA回应,然后复位它的位移计数器并进入盘Remote模式。

● 0xEE(Set Wrap Mode)——鼠标用应答0xFA回应,然后复位它的位移计数器并进入wrap模式。

● 0xEC(Reset Wrap Mode)——鼠标用应答0xFA回应,然后复位它的位移计数器并进入wrap模式之前的那个模式(stream模式或remote模式)。

● 0xEB(Read Data)——鼠标用应答0xFA 回应,然后发送位移数据包。这是在remote模式中读数据的唯一方法,在数据包成功地被发送后,鼠标将复位它的位移计数器。

● 0xEA (Set Stream Mode)——鼠标用应答0xFA 回应,然后复位它的位移计数器并进入stream模式。

● 0xE9 (Status Request)——鼠标用应答0xFA 回应,然后发送如表1.5,3个字节的状态包, 然后复位它的位移计数器。

Byte1 Byte2 Byte3 Always0 Mode Enable 表1.5 鼠标状态包格式 Scaling Always0 Left Btn 分辨率 采样速率 Middle Btn Right Btn 右键、中键、左键 =1,表示键被按下;=0 ,表示键没有按下。 Scaling = 1缩放比例位2:1; =0,比例为1 :1;见命令0xE7和0xE6。

Enable = 1表示数据报告被使能;=0,示数据报告被禁止;见命令0xF5和0xF4。

Mode = 1表示remote 模式被使能;=0,表示stream模式被使能;见命令0xF0和0xEA。

● 0xE8 (Set Resolution )——鼠标用应答0xFA 回应,然后从主机读取一个字节,并再次

用鼠标用应答0xFA应然回应,然后复位它的位移计数器,从主机读入的字节决定了分辨率如表1.6所示:

表1.6 鼠标位移分辩率对应表 主机发过来的数据 分辨率 0x00 1 计数值/毫米 0x01 2 计数值/毫米 0x02 4 计数值/毫米 0x03 8 计数值/毫米

● 0xE7 (Set Scaling 2:1)——鼠标用应答0xFA回应,然后使能2:1比例。

● 0xE6 (Set Scaling 1:1)——鼠标用应答0xFA回应,然后使能1:1比例。

对于标准鼠标而言,只有(Resend )0xFE和(Error) 0xFC 命令会发送给主机。这两条命令的工作情况和主机到设备间的命令一样。

注:

1、2 :1比例仅适用于Stream模式的自动数据报告中,对于回应Read Data 0xEB命令的报告数据是无效的。 2、鼠标和主机不缓冲Resend 0xFF 命令,这意味着0xFE 绝不会作为Resend 命令的回应来发送。 3、一个数据包可以是3字节的位移数据包,或4字节的位移数据包,Intellimouse的或3 字节的状态包Status Request 0xE9命令或2字节的完成代码ID包,0xAA 、0x00或0xFC、0x00或1字节的命令回应。

4、当PS/2数据线常置零时,PS/2鼠标将不断产生时钟脉冲。

1.5 PS/2通讯协议

PS2通讯协议是一种双向同步串行通讯协议。通讯的两端通过Clock(时钟脚)同步,并通过Data(数据脚)交换数据。任何一方如果想抑制另外一方通讯时,只需要把clock(时钟脚)拉到低电平。如果是PC机和PS2键盘间的通讯,则PC机必须做主机,也就是说,PC机可以抑制PS2键盘发送数据,而PS2键盘则不会抑制PC机发送数据, 也即主机总是在总线上有优先权。一般两设备间传输数据的最大时钟频率是33KHz,大多数PS2设备工作在10~20KHz。推荐值在15KHz左右,也就是说,clock(时钟脚)高、低电平的持续时间都为40μs。每一数据帧包含11~12个位,具体含义如表1.7所列。

表1.7 PS/2通讯数据帧格式 1个起始位 总是逻辑0 8个数据位 (LSB)低位在前 1个奇偶校验位 1个停止位 1个应答位 奇校验 总是逻辑1 仅用在主机对设备的通讯中 表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。 1.5.1、PS/2设备到主机的通讯

时钟频率为10-16.7kHz 。从时钟脉冲的上升沿到一个数据转变的时间至少要有5微秒。数据变化到时钟脉冲的下降沿的时间至少要有5 微秒,并且不大于25微秒。这个定时非常重要你应该严格遵循它。主机可以在第11个时钟脉冲停止位之前把线拉低,导致设备放弃发送当前字节,这是非常罕见的。在停止位发送后设备在发送下个包前至少应该等待50微秒。这将给主机时间,当它处理接收到的字节时抑制发送(主机在收到每个包时通常自动做这个)。在主机释放抑制后,设备至少应该在发送任何数据前等50微秒。其通讯时序图如图1.1所示。

从PS2向PC机发送一个字节可按照下面的步骤进行: 1) 检测时钟线电平,如果时钟线为低,则延时50μs;

2) 检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1);

3) 检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向PS2设备发送数据,所以PS2设备要转移到接收程序处接收数据); 4) 延时20μs(如果此时正在发送起始位,则应延时40μs);

5) 输出起始位(0)到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确保PC机没有抑制PS2设备,如果有则中止发送; 6) 输出8个数据位到数据线上; 7) 输出校验位; 8) 输出停止位(1);

9) 延时30μs(如果在发送停止位时释放时钟信号则应延时50μs);

按如下的过程发送单个位 1) 设置/复位数据 2) 延迟20微秒 3) 把时钟拉低 4) 延迟40微秒 5) 释放时钟 6) 延迟20微秒

图1.1 设备到主机的通讯

1.5.2、主机到PS/2设备的通讯

首先PS/2 设备总是产生时钟信号,如果主机要发送数据它必须首先把时钟和数据线设置为请求。发送状态如下示

● 通过下拉时钟线至少100微秒来抑制通讯

● 通过下拉数据线来应用请求,发送然后释放时钟

设备应该在不超过10 毫秒的间隔内就要检查这个状态。当设备检测到这个状态,它将开始

产生时钟信号,并且时钟脉冲标记下输入八个数据位和一个停止位。主机仅当时钟线为低的时候改变数据线而数据在时钟脉冲的上升沿被锁存,当发生在设备到主机通讯的过程中时正好相反。

在停止位发送后,设备要应答接收到的字节,就把数据线拉低并产生最后一个时钟脉冲,如果主机在第11 个时钟脉冲后不释放数据线,设备将继续产生时钟脉冲直到数据线被释放然后设备将产生一个错误。通讯时序图如图1.2、1.3所示。

主机可以在第11 个时钟脉冲应答位前中止一次传送,只要下拉时钟线至少100微秒。

主机必须按下面的步骤发送数据到PS/2设备 1) 把时钟线拉低至少100微秒 2) 把数据线拉低 3) 释放时钟线

4) 等待设备把时钟线拉低

5) 设置/复位数据线发送第一个数据位 6) 等待设备把时钟拉高 7) 等待设备把时钟拉低

8) 重复 5-7步发送剩下的7个数据位和校验位 9) 释放数据线

10) 等待设备把数据线拉低 11) 等待设备把时钟线拉低

12) 等待设备释放数据线和时钟线

图1.2 主机到设备的通讯

图1.3 主机到设备通讯的详细过程

图1.3描述了两个重要的定时条件:a和b。a在主机最初把数据线拉低后,设备开始产生时钟脉冲的时间,必须不大于15ms;b数据包被发送的时间,必须不大于2ms 。如果这两个条件不满足,主机将产生一个错误。在包收到后,主机为了处理数据立刻把时钟线拉低来抑制通讯,如果主机发送的命令要求有一个回应,这个回应必须在主机释放时钟线后20ms之内被收到。如果没有收到则主机产生一个错误,在设备到主机通讯的情况中,时钟改变后的5微秒内不应该发生数据改变的情况。

1.6 方案设计

1.6.1、设计思想

针对FPGA做时序控制不方便的缺点,本设计简化了通讯协议,对PS2鼠标的操作只用了一条指令,使能数据报告(0xF4)。利用鼠标上电自动复位并进入Stream模式后,送使能数据报告

指令(0xF4),便完成对鼠标的初使化。之后便可以接收PS2鼠标发送过来的数据包。该方案的优点是简化程序,节省资源;缺点是不能软复位,即鼠标由于出现异常情况而不正常工作,不能用软件复位,只能重新插拔鼠标。但出现异常状况的情况比较少,所以总来的该方案是比较合理的。

1.6.2、接口与控制

● Clock(input)——系统时钟,默认为48MHz,如要改为其它频率,需要改动如下几个参数:

parameter WATCHDOG_TIMER_VALUE = 19200; //看门狗计时器,400uS

parameter WATCHDOG_TIMER_BITS = 15; //400uS计时器所需计数器位数 parameter TIMER_5US_VALUE = 240; // 5uS计数值

parameter TIMER_5US_BITS = 8; // 5uS计时器所需计数器位数

● reset(input)——复位信号,高电平有效。复位时不会向PS/2鼠标发送复位命令,只向鼠

标发送数据使能报告。

● ps2_clk(bidir)——PS/2时钟线,为双向端口,外围电路需加上拉电阻。 ● ps2_data(bidri)——PS/2数据线,为双向端口,外围电路需加上拉电阻。 ● left_button(output)——左键标志位,高电平表示左键按下。 ● right_button(output)——右键标志位,高电平表示右键按下。 ● middle_button(output)——中键标志位,高电平表示中键按下。

● x_increment[8..0](output)——X轴增量,为9位二进制补码,最高位为符位。鼠标左移,位移增量为负;右移,位移增量为正。

● y_incremetn[8..0](output)——Y轴增量,为9位二进制补码,最高位为符位。鼠标上移,位移增量为负;下移,位移增量为正。

● data_ready(output)——高电平表示有新数据输出。输出为一个时钟脉冲。

1.7 调试总结

在调试过程中,最大的问题就是PS2时钟、数据线采集的同步问题。刚开始没有意识到这个问题,导致发送的指令及收到的数据总是出错(主要移位寄存器的操作,及位计数由于不同步计数出错导致的)。由于这个问题多花了一天的调试时间,以后值得注意(同步问题)。另外经调试,得出一些参数(对于我调试用的鼠标,其它的鼠标应该也是差不多)。发送指令给鼠标,260uS后收到鼠标的回应(0xFA),鼠标发送的数据包帧间的间隔大概是200uS。发送复位指令0xFF,360mS后收到自检成功(0xAA)和设备ID号(0x00)。收到ID号后,最好延时400uS右左再发送0xF4“使能数据报告”,不延时立即写可能会出错。此外当PS2数据线为常低时,鼠标会连续产生时钟信号。

另外有个问题比较怪,下面两个进程左边的可以正常运行,右边的不行,其中reset信号是输入引脚,由外面接一个按键,按下时为高电平。

是否外面引入的信号和FPGA内部信号的电气属性有什么区别? always @(posedge clock) always @(posedge clock) begin begin if(reset == 1'b1) if(reset) m2_state <= m2_reset; m2_state <= m2_reset; else else m2_state <= m2_next_state; m2_state <= m2_next_state; end end 以是程序调试中的一些问题,些外还有一个问题刚开始比较模糊,资料上说主机发送数据到PS2设备是在上升沿被取的,而后面又提到如果要仿真鼠标最好用下面的时序(读位操作): 1) 延迟20微秒

2) 把时钟拉低 3) 延迟40微秒 4) 释放时钟 5) 延迟20微秒 7) 读数据线

很明显是在上升沿后20uS才被读入,这与上面的说法有点矛盾,跟上述问题,对程序分别做改动,然后用逻辑分析仪分析,发现信号在上升沿被读入才是正确的。图1.4、1.5是调试中用逻辑分析仪抓到的一些波形。

图1.4 发送0xF4“使能数据报告”指令后,鼠标回应0xFA

图1.5 按下鼠标左键后,鼠标发送的数据包

1.8 学习小结

在设计的过程在学习了一种方法,就是当一个时钟(较低频率)要在一个进程里面同时判断上升沿和下降沿,可以用一个更高速成的时钟对慢的时钟采样,由低变高时产生一上升沿的脉冲,由高变低时产生一下降沿的脉冲,这样在进程里面就可以用电平的方法来判断边沿,当然这个是在边沿时差要求不高的场合。时序图如图1.6所示

(a)

(b)

图1.6 时钟边沿采样时序图

本文来源:https://www.bwwdw.com/article/am8o.html

Top