基于USB接口芯片CH372的人机接口设备设计与实现(转)
摘 要: 基于一种新型USB 总线接口芯片CH372,设计出一种人机接口设备-USB 鼠标。阐述了CH372 的工作原理和特点,给出了系统的硬件电路图;在软件设计中,分析了HID 类设备描述符枚举过程,根据主程序流程图,写出了部分单片机本地端主程序。通过硬件和软件调试,最后成功模拟出鼠标左键和右键功能。
1 引言
USB(Universal Serial Bus,通用串行总线)是计算机上的一种新型接口技术,它使得计算机和外部设备的连接十分方便。HID 是Human InterfaceDvices 的缩写,即人机接口设备,是USB 协议中最早提出并支持的一种设备类。典型的HID 有键盘和鼠标等,其主要用于和计算机进行交互通信。鼠标属于HID 设备,USB 串行总线规范专门定义了HID 类规范。Windows 操作系统能够方便地和HID 设备建立连接。
2 USB总线接口芯片CH372
2.1 功能介绍
CH372 是一个USB 总线的通用设备接口芯片,是CH371的升级产品,是CH375芯片的功能简化版。
CH372 具有8 位数据总线和读、写、片选控制线以及中断输出,可以方便的挂接到单片机/DSP/MCU/MPU 等控制器的系统总线上;在计算机控制中,CH372 的配套软件提供了简洁易用的操作接口,与本地端的单片机通讯就如同读写文件。
CH372 内置了USB 通讯中的底层协议,具有省事的内置固件模式和灵活的外置固件模式。在内置固件模式下,CH372 自动处理默认端点0 的所有实物,本地端的单片机只要负责数据交换,所以单片机程序非常简洁。在外置固件模式下,由外部单片机根据需要自行处理各种USB 请求,从而可以实现符合各种USB 类规范的设备。
2.2 通信原理
图1 通信原理框图
图1 为CH372 通信原理框图,D7~D0 为8 位双向数据总线、RD#为读选通输入引脚、WR#为写选通输入引脚、CS#为片选输入引脚、INT#为中断输出引脚、A0 为地址输入引脚。
CH372 芯片的RD#和WR#可以分别连接到单片机的读选通输出引脚和写选通输出引脚。CS#由地址译码电路驱动,用于当单片机具有多个外围器件时进行设备选择。INT#输出的中断请求是低电平有效,可以连接到单片机的中断输入引脚或者普通I/O 引脚,单片机可以使用中断方式或者查询方式获知中断请求。
当WR#为高电平并且CS#和RD#及A0 都为低电平时,CH372 中的数据通过D7~D0 输出;当RD#为高电平并且CS#和WR#及A0 都为低电平时,D7~D0 上的数据被写入CH372 芯片中;当RD#为高电平并且CS#和WR#都为低电平而A1 为高电平时,D7~D0 上的数据被作为命令码写入CH372 芯片中。
3 硬件电路
图2 HID 设备硬件电路图
图2 中是没有外部扩展总线的单片机系统,单片机用普通的I/O 引脚模拟出8 位并口时序操作CH372 芯片。在这个电路中,CH372 的CS#固定为低电平,一直处于片选状态。IC1 的P1 端口作为8位双向数据总线,在单片机程序中,可以控制各个I/O引脚模拟并口时序与CH372 进行数据交换。
单片机的P3.0 引脚模拟为鼠标的左键;P3.1 引脚模拟为鼠标的右键。
4 软件设计
4.1 HID 类设备描述符枚举
USB Mouse 属于HID 设备,和所有的HID 设备一样遵从USB 启动流程:设备插入→总线复位→设备枚举→数据接收/传送。怎样让PC 认识USB Mouse流程中的设备枚举就是告知PC 设备描述类型[5]。当插入USB 设备后,主机会向设备请求各种描述符来识别设备。为了把一个设备识别为HID 类别,设备在定义描述符的时候必须遵守HID 规范,因此除了USB 标准定义的一些描述符外,HID 设备还必须定义HID 描述符。主机通过识别描述符从而认识设备,认识设备数据通信格式,从而才能正常进行数据传送接收。
下面图3 是在调试过程中的截图,可以清楚地看出枚举有没有成功,有没有被PC 机设别出来。他们分别是成功识别,识别出设备有问题,无法识别USB设备。
图3 调试过程3 种状态截图。
4.2 单片机本地端主程序
4.2.1 主程序流程图
图4 主程序流程图
4.2.2 部分子程序代码
本地端主程序可以参照图4 流程编写代码。在程序中,外置模式的设置是在CH372 初始化的子程序中完成的;中断子程序编写需要参考CH372 中文手册(二)。从图2 的硬件电路连接上可以看出,单片机的P1 口与CH372 的数据端连接,并非以总线方式挂接在单片机上,因此需要单片机的I/O 拟出相应的时序操作CH372 芯片。下面给出单片机通过数据端口写命令,写数据,读数据的三段代码。
枚举成功后,PC 机识别为USB Mouse.此时单片机根据图2 中所示的遥控指示信号LeftKey(P3.0 脚)和RightKey(P3.1 脚)电平高低,通过CH372端点1(中断端点)发送USB 鼠标相应的键值给PC 机,端点1(中断端点)的缓冲区数据块长度为4 个字节,LeftKey 或者RightKey 键值需要放在第一个字节上。如果鼠标左键按下,则返回0x01,0x00,0x00,0x00;若鼠标右键按下,则返回0x02,0x00,0x00,0x00。
下面给出端点1 上传数据示例:
5 结语
本系统是CH372 设置为灵活的外围固件模式下的应用和开发。系统硬件设计简单,软件流程清晰。
若将硬件和软件做很小的改动,就可以设计出其他很多HID 类设备。
基于USB接口芯片CH372的人机接口设备设计与实现(转)的更多相关文章
- USB接口介绍
USB设备系统分为两个部分,USB Host端和USB Device端,以USB接口的U盘为例子,U盘自身是一个USB Device,PC机的USB接口以及相关的控制电路为USB Host部分 ...
- 基于 USB 传输的针式打印机驱动程序开发
1.引言 针式打印机曾经在相当长的一段时间占据打印机市场的主导地位,但是近年来由于喷墨.激光等非击打式打印机的冲击,针式打印机的市场份额逐年下降.即便如此,由于针式打印机在票据打印领域的不可取代性,同 ...
- TYPEC 接口芯片CC逻辑原理与必要性
USB Type-C凭借其自身强大的功能,在Apple,Intel,Google等厂商的强势推动下,必将迅速引发一场USB接口的革命,并将积极影响我们日常生活的方方面面.为了能够使自己的设备兼容这些接 ...
- IC卡接口芯片TDA8007的读写器设计
摘要:阐述T=0传输协议,给出IC卡读写器中使用的IC卡APDU指令流程和原理框图:重点介绍其中的IC卡接口芯片Philips的TDA8007,给出通过TDA8007对CPU IC卡上下电过程.具体程 ...
- 射频识别技术漫谈(29)——射频接口芯片TRF7960
TRF7960系列是TI推出的载波为13.56MHz.支持ISO15693.ISO14443A/B和FeliCa协议的射频接口芯片.许多人更关心它能不能读写MF1卡片,就我的理解及实际验证,由于MF1 ...
- 射频识别技术漫谈(20)——RC系列射频接口芯片
目前基于13.56MHz的射频识别技术主要有ISO14443A.ISO14443B.ISO15693和FELICA技术.针对13.56MHz的射频识别技术,NXP开发了一系列名字以RC(Radio C ...
- USB接口定义
一般的排列方式是:红白绿黑从左到右 定义: 红色-USB电源 标有-VCC.Power.5V.5VSB字样 绿色-USB数据线(正)-DATA+.USBD+.PD+.USBDT+ 白色-USB数据线( ...
- 【转】重装win7后,所有USB接口无法使用(鼠标、键盘、U盘)
转自:https://blog.csdn.net/u010887744/article/details/45270245 今天给一朋友重装系统,华硕FX50J,修改BIOS重装了win7,结果所有US ...
- KC705E 增强版 基于FMC接口的Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 接口卡
KC705E 增强版 基于FMC接口的Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 接口卡 一.板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FF ...
随机推荐
- apache 伪静态配置 .htaccess
htaccess语法教程apache服务器伪静态规则教程 虽然网上有很多教程,不过发现大部分都是抄袭一个人的,一点都不全,所以我想写一个简单的易于理解的教程,我学习.htaccess是从目录保护开始的 ...
- 一张图看懂三维GIS
- $.proxy和$.extend
$.proxy用法详解 参考:https://www.cnblogs.com/alice626/p/6004864.html jQuery中的$.proxy官方描述为: 描述:接受一个函数,然后返回一 ...
- Angular(二)
Angular开发者指南(二)概念概述 template(模板):带有附加标记的模板HTMLdirectives(指令):使用自定义属性和元素扩展HTMLmodel(模型):用户在视图中显示的数据 ...
- 给创业公司CEO的临别赠言
一别两宽,各生欢喜 2018年2月8日,我在这个公司的最后一天,三年半. 还记得2014年,在三里屯SOHO的某个咖啡厅中,你自信飞扬的脸和眼睛里暗夜星辰般的闪亮的希冀让我久久无法平静.终于在某一个耀 ...
- spring boot GlobalExceptionHandler @RestControllerAdvice @ExceptionHandler
package me.zhengjie.common.exception.handler; import lombok.extern.slf4j.Slf4j; import me.zhengjie.c ...
- 吴裕雄--天生自然python Google深度学习框架:Tensorflow基础应用
import tensorflow as tf a = tf.constant([1.0, 2.0], name="a") b = tf.constant([2.0, 3.0], ...
- LightGBM和XGBoost的区别?
首先声明,LightGBM是针对大规模数据(样本量多,特征多)时,对XGBoost算法进行了一些优化,使得速度有大幅度提高,但由于优化方法得当,而精度没有减少很多或者变化不大,理论上还是一个以精度换速 ...
- markdown 的一些字体
<font face='Comic Sans MS', size=5> 看看字体 1 one Hello 2 two Hello <font face='Kristen ITC', ...
- 主效应|处理误差 |组间误差|处理效应|随机误差|组内误差|误差|效应分析|方差齐性检验|SSE|SSA|SST|MSE|MSA|F检验|关系系数|完全随机化设计|区组设计|析因分析
8 什么是只考虑主效应的方差分析? 就是不考虑交互效应的方差分析,即认为因素之间是不相互影响的,就是无重复的方差分析. 什么是处理误差 (treatment error).组间误差(between ...