引言: usb低速设备的设计发展到现在已经有了相当的成熟度。 各家ic公司都推出了usb device端的解决方案, 一般以8 bit cpu core + usb sie为主流构架。 sh69p04是中颖电子(sinowealth)本着丰富usb产品应用,降低usb ic成本而设计的4bit 单片机, 用以开发usb device设备。
sh69p04的功能及特点
图1 如图1, sh69p04集成了usb sie, 支持usb和ps2端口复用。 内建1.5k可控上拉电阻为用户节约成本, 并能建立和pc稳定的通讯。 专门为mouse设计的i/o端口。 双clock系统使ic耗电更少, 轻易满足usb-if对suspend电流的要求。 8k×16 bit的otp rom, 方便用户开发。 最大可支持40×8 的lcd显示或31个i/o, 满足用户的各种应用。 另外还内建watch dog, low power detect功能。
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有了一次插拔动作。程序死锁也可以用这种方法来解决。
图 33.专为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驱动程序会去完成。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』