由于D12的控制端点只有16字节FIFO,如果传输的长度大于16字节,MCU在传输阶段就必须控制数据的数量。如流程图11所示,MCU必须检查要发送到主机的当前和剩余的数据大小。如果剩下的字节数大于16, MCU将先发送16字节并用减去参考长度(要求的长度)16。
当下一个Corntol_ In标志来到时,MCU将确定剩余的字节是否为零。如果己经没有数据要发送,MCU需要发送一个空的包以指示主机数据已经发送完毕。如果建立包为Set-Descriptor( )请求,那么建立包中的控制传输将指示此包为控制写类型。在执行完Set_ Descriptor请求过程后,MCU等待数据阶段。主机发送一个Control_ Out标志,MCU从D12缓冲区中减去数据。流程现在处于Control_ Out处理程序的右端。MCU首先确认D12是否处于USB_ Receive模式。然后MCU通过检查选择控制输出端点确认缓冲区是否己满并将数据从缓冲区读出。
图11 控制输入处理流程
4.1.5 普通端点处理程序
端点1和端点2这里定义为普通输入输出。
普通输出端点配置为从主机接收数据包。当MCU从主机接收Generic_ Out标志(通过读中断寄存器识别)时,D12中断位必须清零。选择端点将清零Generic_ Out缓冲区,接下来MCU需要确认
图12 计算机毕业设计 控制输出处理流程
数据的长度并把数据读出,然后设置收到数据标志位bEPPflag。
对于普通输入端点的中断,只要读取端点号的最后处理状态寄存器来消除中断寄存器的相应位,把状态清零就可以了。Generic_ In标志是在发送完数据后才产生的,当还有数据要发送时可以在中断程序里接着继续发。注意:这里的数据发送完成标志是指在主机的一个有效的IN事务后才发生的。当主机发出IN事务而设备没有送出数据时,是不会产生中断的。
4.1.6 主循环--MAINLOOP.C
MCU一旦上电就需要初始化其所有端口、存储区、定时器和中断服务程序。之后MCU将重新连接USB,包括将Soft_ Connect寄存器设置为ON。这些过程是很重要的,因为它确保了在MCU准备好服务D12之前D12不会进行操作。
在主循环程序中MCU对键盘进行轮询。如果任何一个特定的按键被按下,键处理命令将执行子程序并返回主循环。增加该子程序的目的仅仅是为了调试。1ms定时器用于激活该子程序以检测在评估板上的任何按键。当轮询到了检测建立包时,它确认建立标志在之前是否被中断服务程序所置位。如果建立标志置位,它将向协议层发送一个器件请求进行处理。下面所示的流程图13是主程序在前台执行的流程。
4.1.7 计算机毕业设计PDISBD12固件编程的关键注意事项
(1)在编写PDIUSBDI2固件程序时需要注意:
[1]单片机的中断应设置为电平触发:中断后一定要读上次传输状态寄存器(命令40-45H),以清除中断寄存器中的中断标志。这样,PDIUSBD12的中断输出才能变回高电平。这一点非常重要。
[2]在接收到Setup包后,一定要调用ACK setup命令重新使能端口0。
[3]在向IN端点写完数据后,一定要调用Vali date Buffer(命令FAH ),
指明缓冲区中的数据有效,可以发送到主机。
[4]读完数据后,一定要调用Clear Buffer(命令F2H),以保证可以接收新
的包。
[5]可以通过调用Read Chip ID(命令FDH)检查PDIUSBDI2是否工作。该
命令要读两个字节数据。