本帖最后由 lvben5d 于 2019-2-18 09:44 编辑
1. 原:void usbd_ep_rx (usb_core_handle_struct *pudev, uint8_t ep_addr, uint8_t *pbuf, uint16_t buf_len)
{ ......
devepxlen &= ~DEPLEN_TLEN;
devepxlen &= ~DEPLEN_PCNT;
}
可优化为 (KEI5 Level-0 编译等级下 汇编指令缩减4条!)
void usbd_ep_rx (usb_core_handle_struct *pudev, uint8_t ep_addr, uint8_t *pbuf, uint16_t buf_len)
{ ......
devepxlen &= ~(DEPLEN_TLEN | DEPLEN_PCNT);
}
2. static uint32_t usbd_intf_rxfifo (usb_core_handle_struct *pudev) 函数对RxFIFO非空中断进行数据采集 由于我的是设备端
常规处理的为SETUP OUT数据包 switch (RSTAT_PCKST(rx_status)) { case RXSTAT_DATA_UPDT: //0010:接收到OUT数据包 if (bcount > 0U) { /* read the fifo data */ usb_fifo_read(ep->xfer_buff, (uint16_t)bcount); ep->xfer_buff += bcount; ep->xfer_count += bcount; } break; case RXSTAT_SETUP_UPDT: //0110:接收到SETUP数据包 data_pid = RSTAT_DPID(rx_status); //PID只有SETEP校验的时候才回去看下吧? if ((0U == endp_num) && (8U == bcount) && (DPID_DATA0 == data_pid)) { /* copy the setup packet received in fifo into the setup buffer in ram */ usb_fifo_read(pudev->dev.setup_packet, 8U); ep->xfer_count += bcount; } break; case RXSTAT_GOUT_NAK: //0001:全局OUT NAK(产生一个中断) break; case RXSTAT_XFER_COMP: //0011:OUT传输完成(产生一个中断) break; case RXSTAT_SETUP_COMP: //0100:SETUP传输完成(产生一个中断) break; default: break; } |