USB通信程序设计 第13页
处理:读多个字节(最大130B)。
读缓冲区命令后,返回一系列从选择的端点数据缓冲区读出的数据。每读一个字节,内部缓冲区指针自动加1。读缓冲区命令不会将缓冲区指针复位到缓冲区的起始端,这意味着可被其他的命令所中断(选择端点命令除外)。
缓冲区数据结构如下:
字节1:保留,可为任意值。
字节2:数据字节的数目/长度。
字节3:数据字节1。
字节4:数据字节2。
……
由于头两个字节在DMA读操作中可跳过,因此第1个读出的字节是数据字节1;第2个读出的字节是数据字节2……PDIUSBD12可通过USB信息包的EOP终止来决定包的最后一个字节。
写缓冲区
命令:F0h。
处理:写多个字节(最大130B)。
写缓冲区命令后跟一系列需要写入端点缓冲区的数据。数据的结构必须与前面描述的读缓冲区命令一样。第1个字节(保留)总为0。由于在DMA写操作中头两个字节会被绕过,因此第1个写入的字节是数据字节1;第2个写入的字节是数据字节2……在非同步传输(批量或中断)中,数据被发送到主机之前,缓冲区必须被完全填满并切换到下一个缓冲区。例外的情况是:当前的缓冲区内容将要被发送到主机时,由有效的EOT_N指示DMA传输的结束。
注意:
越过缓冲区边界的写入/读出或写入OUT缓冲区/读出IN缓冲区都是不受保护的,其中的任何一个都会导致错误的操作。OUT缓冲区的数据只能在成功发送之后才有意义。例外的情况是:在主端点的DMA操作时,指针在到达边界(双缓冲结构)后自动指向第2个缓冲区。
清缓冲区
命令:F2h。
处理:无。
当一个信息包完全接收之后,内部端点缓冲区满标志置位,所有后续的包将被返回的NAK拒绝。当微控制器已读取数据,它应当通过清缓冲区命令来释放缓冲区。当缓冲区清空之后,新的信息包即可被接受。
使缓冲区有效
命令:Fah。
处理:无。
当微控制器已将数据写入IN缓冲区时,其应当通过缓冲区有效命令设置缓冲区满标志,这表示缓冲区内的数据有效,并可在接收到下一个IN标志时将其送入主机。
设置端点状态
命令:40h――45h。
处理:写1B。
当一个停止控制的端点接收到SETUP标志时自动解除停止,而不管信息包的内容如何。如果端点应当处在停止状态时,微控制器可以重新停止它,该命令参数的具体描述如下图所示。
当一个停止的端点解除了停止(设置端点命令或接收到一个SETUP标志)时,其同时被重新初始化,并将缓冲区刷新。如果是OUT缓冲区就等待一个DATA0PID,如果是IN缓冲区就写入一个DATA0PID。即使在解除停止时,将设置端点状态写为0也将初始化端点。
应答SETUP
命令:F1h。
处理:无。
一个SETUP信息包的到达将IN缓冲区刷新并禁止对IN和OUT端点的两条命令:使缓冲区有效和清零缓冲区命令。微控制器需要通过应答SETUP命令重新使能这些命令。这确保了最后的SETUP包留在缓冲区内,并且在微控制器看到SETUP包并应答之前,不会有任何包发回主机。微控制器必须将应答SETUP命令发送到IN和OUT端点。3.数据流命令
发送恢复
命令:F6h。
处理:无。
发送一个上行数据流恢复信号10ms。该命令通常用于器件处于挂起状态时。恢复命令后不跟读出或写入的数据。
读当前帧数目
命令:F5h。
处理:读1B或2B。
该命令后跟1――2个读出的字节,并返回最后成功接收的SOF帧数目,帧数目为返回的低位有效字节,该命令参数的具体描述如下图所示。
附录 B U盘固件程序源码清单
源码清单于附带光盘中。