图5 按键驱动流程图
4.1.2 对主芯片的读写操作函数的实现
如果芯片正常工作起来了,就可以正确读取其ID,因此编写读命令和写命令两个函数用来读取ID,以检测芯片是否正确工作起来了。读写函数不仅需要用到芯片提供的读写命令还需要参照硬件连接才能完成编写。接口的数据口和微控制器的P0口相连,A0和P3.4连接,读写控制引脚与微控制器的16、17引脚连接,中断请求引脚与微控制器的中断源0连接。这样在硬件连接的基础上再依据PDIUSBD12数据手册的时序图即可完成函数编写。前面的两个函数作为子函数。这样就实现了读ID,从而可以确定芯片是否正常工作,也初步验证了电路板的设计正确性。读写流程图如图6所示。
图6 读写流程图
4.2 鼠标主程序
将USB模块连接上计算机后,按复位键,程序重新运行,在程序的开始处,通过PDIUSBD12设置模式命令将其内部的上拉电阻断开。再编写一个延时函数,延时一段时间,待主机确认已断开连接,再将PDIUSBD12的上拉电阻通过设置模式命令连接上,这时主机会检测到USB设备插入。PDIUSBD12在完成相应操作后,将会产生中断请求信号,在芯片的14引脚出现低电平的中断请求信号,通知CPU进行相关处理。在芯片挂起、复位、成功接收数据和发送数据后都会有中断产生。在微控制器的主程序中不断查询14引脚状态,进而确定下一步的处理。当发生中断后,需要判断中断源,因此编写读中寄存器子程序,获取中断源。中断寄存器为八位,代表八个中断源,分别写八个对应的分支函数处理。
4.2.1 读端点零的数据
通过串口显示中断处理的信息,可以发现主机向端点0发送了数据,因此要将此时端点0中的数据读取出来。编写读取端点数据的函数、选择端点函数、清除中断标志函数、清除数据缓冲区函数。PDIUSBD12有多个端点,选择读取那个端点需要用到选择端点命令,选择端点函数实现对端点0的选择。端点0的缓冲区的数据读取后,还需清除数据缓冲区、清除中断标志位。这些子函数共同组成端点0中断处理函数。
通过串口调试助手能看到返回过来的信息,可以看到PDIUSBD12已经成功的接收了主机发送的8字节信息,在第一次接受到数据之后,会停顿一段时间,这段时间主机一直在请求输入,但是程序目前还没有返回数据,所以PIDUSBD12一直返回没有准备好的状态数据包,一段时间之后,主机又发送一次总线复位,如此三次之后进入挂起状态。读端点0数据流程图如图7所示[9-10]。
图7 读端点0数据流程图
4.2.2 设备描述符请求及返回
端点0缓冲区的8字节数据是USB协议定义的标准设备请求。为了明确请求的每个位的具体意义,还需要对USB协议进行研读。在USB协议中详细规定了和端点0有关的控制寄存器和状态寄存器的各个位的具体意义,通过C语言程序的位操作,可以按照要求对部分控制寄存器进行读写操作,并且能读出状态寄存器的内容,从而判断接口和端点工作状态,进而为中断提供中断源。USB协议定义了11个标准请求。USB标准请求数据结构如表1所示,标准请求及其代码如表2所示。
表1 USB标准请求数据结构
偏移量 域 字节数 取值 描述
0 bmRequestType 1 位 D7:数据传输方向
0=主机到设备 1=设备到主机 D6~5:请求类型
0=标准 1=类 2=厂商 3=保留
D4~0:接收者
0=设备 1=接口 2=端点
3=其他 4~31=保留
1 bRequest 1 数值 请求代码 通用串行总线及外设开发+电路图+流程图(5):http://www.youerw.com/tongxin/lunwen_1525.html