基于USB接口设备的固件程序设计
主程序和中断服务程序(ISR)之间任务分配是,ISR从D12收集数据,主程序将处理这些数据。ISR只在它收集了足够的数据才通知主程序准备处理,这样会减少不必要的主程序服务时间,也简化了主程序。
总线重置和空闲在ISR里面不需要特殊的处理。ISR要么设置总线重置标志,要么在EPPFLAG里暂停这一位并退出。
控制型传输总是以setup阶段开始的,接着是数据阶段。然后以状态阶段结束。本文引用地址://m.amcfsurvey.com/article/202578.htm
下面以处理Control OUT和Control IN这两个最复杂最重要的中断子程序为例,说明编写中断服务程序的一些问题。
Control OUT主要是主机用来传递控制请求的,也可用于传输数据,进入服务程序后首先要发送控制字Read Last Transaction Status(40H)给PDIUSBD12,读取管道状态,根据读取的状态判断是因为有数据包还是有SETUP包的到来而中断。当SETUP包被USB设备的D12接收后,设备将会向MCU产生中断。微控制器将通过读取D12中断寄存器的内容判断封包是送到Control端点还是Genric端点而进行处理。如果封包是送到Control端点,MCU将会进一步通过读D12的“Read Last Transaction Status Register”判断数据是不是SETUP 封包。对于获取描述符设备请求,第一个封包必须是SETUP封包。
之后,MCU需要读出SETUP封包的内容通过选择Control Out端点来判断这个端点是满的还是空的。如果控制端点是满的,MCU就从缓冲区中读出它的内容并将它存在存储器里。然后,它将从存储器里去验证主机设备请求是否合法。如果是合法请求,MCU必须送“Acknowledge Setup command”到Control Out端点使能接收下一个封包。下一步,MCU需要确定控制传输是控制读还是控制写。这可以通过从SETUP 封包里读bmRequestType的8个字节来完成。控制传输是控制读,设备需要在下一个数据时相回送数据包给主机。MCU需要建立一个标志,表明USB设备现在正处于传送模式。应主机的要求准备送数据。
Control IN主要是用来向主机传送数据的,进入服务子程序后,首先要通过读Read Last Transaction Status(40H)来清除Control-In interrupt Bit,在确认D12是处于传送模式下后,MCU将数据包送往主机。但是,由于D12只有16字节的FIFO,所以MCU必须控制好传送的总量,如果要求的长度大于16字节的话。MCU必须检查当前和剩下的要送往主机的数据,如果剩下的字节大于16字节的话,MCU将先送头16字节。在下一个Control-IN令牌包到来的时候,MCU将先判断剩下的字节是否为0,如果是,MCU将发一个空包给主机,通知它数据已经传送完毕。
结束语:
功能强大的USB规格已经成为PC的众多标准之一,钻研计算机科技的种种发展,都离不开USB的相关知识。本文创新点:使用USB通信方面的具体协议,用单片机汇编语言编程,利用单片机的指令系统去实现USB设备与PC主机的具体通信,设计出适合用户需求的USB设备。
评论