DAP数据发送过程:
1)当USB配置完成后,根据协议DAP主机发来IN事务,表示要从下载器获取数据,若DAP没有数据需要发送,则在数据阶段发送NAK告诉主机数据还没准备好;
2)当DAP有数据需要发送时,在主函数中调用usbd_ep_start_write(DAP_IN_EP, USB_Response[n], USB_RespSize[n]);,作用为:给USB DMA准备好数据以及长度,并使DAP USB设备回复ACK;
3)当主机的下一次IN事务来之后,随后进入中断USBD_IRQHandler中断处理函数,此时主机已经把一部分或者全部数据取走,后续流程会判断数据是否被完全取走;
4)中断函数中,首先将USB设备设置为NAK忙状态,更新下一次发送数据的地址,更新目前发送的总长度等;
5)再判断数据是否发送完成,或者已经到到了期望发送数据长度;
6)如果没有发送完成,设置USB为ACK继续接收,直到发送完成;
7)如果已经发送完成了,则进入usbd_event_ep_out_complete_handler();
7)函数中实际调用dap_in_callback(uint8_t ep, uint32_t nbytes);
8)dap_in_callback函数先判读是否还有数据需要发给主机,过程中USB中断一直NAK,如果没数据了就跳过。如果有数据则调用usbd_ep_start_write(DAP_IN_EP, USB_Response[USB_ResponseIndexO], USB_RespSize[USB_ResponseIndexO]);准备好数据,并再允许USB ACK,等待主机发IN事务来取数据;
11)如此循环往复完成DAP数据发送。
整个过程看起来相当复杂,其实一点也不简单。
所属系列
从当前文章继续阅读它所在合集中的前后内容。
本作品集介绍USB基础知识,解析USB通信协议,学习USB工作原理,制作USB设备,编写USB上位机软件。
相关文章
优先推荐同专题、同标签和同作者内容,补足热门文章。