接口/总线/驱动
1. USB和PS2端口共用
通过寄存器实现USB端口和PS2端口的切换
PS2PU = 1: 如果PS2IS = 1, 则内部PS2专用上拉电阻起作用。当需要使用USB端口时, 只要让PS2IS = 0即能关闭PS2端口及其上拉电阻。
2. 1.5KΩ可控上拉电阻
如图2, 有了这个1.5KΩ可控上拉电阻一方面可以节约成本, 另一方面可以实现软开关, 确保PC认出DEVICE。
当USB DEVICE和PC相连后由于内部1.5KΩ上拉电阻并未打开, 所以PC不认为有新的设备连接。 在打开上拉电阻前用户可以放心的完成程序初始化及其它客户程序, 而不必担心需要及时响应USB总线上的信号。 这是因为如果没有可控的上拉电阻而是直接外加, 那么当DEVICE和PC相连后, PC马上就会知道有新的设备连接, 在一定时间后就会向DEVICE发送信号, 如果DEVICE连续几次通讯失败的话, PC就认为该DEVICE出错而不会再和它通讯。
另外结合Watch Dog可以进一步确保DEVICE的连接。 用户可以事先计算一下整个USB初始化过程所需的时间, 并设置Watch Dog。 万一USB初始化出错就可以产生Watch Dog Reset, 1.5KΩ上拉就被关闭, 程序重新开始。 PC就会认为DEVICE有了一次插拔动作。程序死锁也可以用这种方法来解决。
图 3
3. 专为MOUSE设计的I/O端口
如图3, 原理分析时Q1.1和Q1.3是输出方波。 实际上由于Photo Transistors是采用光敏三极管, 当光栅转动时, 光敏三极管受到的光线也是连续变化的, 所以输出的波形也是连续变化的。 又因为光栅无法完全阻隔光线, 所以会产生一个OFFSET电平。 实际波形如图4。
图中VIH表示一旦输入电平高于VIH, 那么MCU就认为是高电平。 VIL表示一旦输入电平低于VIL, 那么MCU就认为是低电平。 在图4所示的这种状态下MCU可以很方便的读到光栅转动的情况。 但是由于干扰或者元器件老化等原因造成OFFSET电平发生变化, 使得输入信号的电平无法和VIH、VIL相交(如图5), MCU就会认为输入的信号一直为高或一直为低。
SH69P04为每一个MOUSE的端口提供三档下拉电阻(如图4)来控制OFFSET电平。 通过寄存器来选择下拉电阻的阻值, 用以解决由于OFFSET电平的变化而引起的错误。
软件设计
USB协议虽然很复杂, 但是MOUSE端需要编写的程序却十分有限。 用户很容易就能和PC建立联系。(Windows端HID驱动程序由操作系统提供)
1. USB/PS2端口的监测
第一步: 上电, delay 50ms
第二步: 在2ms的时间内监测D-的电平, 如果有4次为高电平, 就是PS2接口。 否则进入第三步
第三步: 打开USB上拉电阻, delay500us, 反复监测D+和D-的电平, 直到其中有一个出现高电平。 如果D+是高电平, 则为PS2接口。 如果D-是低电平, 则进入第4步。
第四步: 关闭USB上拉电阻, delay 100us。 如果D+/D-都为低电平, 则为USB接口。
否则就是PS2接口。
2. USB Enumeration过程
整个过程有点像做测试题。 PC问, MOUSE回答。 其中关键是要告诉PC, 自身是一个MOUSE, 支持HID协议。 由于篇幅有限, 就不详细列出了。
3. 把MOUSE的信息传给PC
在Enumeration过程中, MOUSE会告诉PC后续X,Y,Z,按键这些信息的格式。 当MOUSE有动作时, 只要按这个格式把数据返回给PC就可以了。 剩下的事情PC端HID驱动程序会去完成。
全部0条评论
快来发表一下你的评论吧 !