|
设备通过usb进行固件升级,上位机每2k发送给我。现在的问题是 在接收过程中,卡死不动,用bus hound抓包没抓到上位机发送的下一帧数据,但是上位机的log日志中已经发送下一帧。
现在问题在下位机这边,我先贴出代码,卡住时 USB中断正常进入,程序没有hardfault,中断优先级 分组2 usb (2,0),usb的时钟定时器(1,0),串口接收(3,0)
还有就是 这个升级流程 只在我做的产品上出现了,其他产品没有出现过这种情况,同样是gd305re。而且我这个有时候可以正常运行,有时候就会卡住
1.我在主循环中这样调用
int cdc_acm_ft232_recv(usb_dev *udev, uint8_t*data, uint32_t data_len)
{
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE];
debug_cdc= (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE];
if(cdc->packet_receive == 1U)
{
#if RTT_DEBUG
SEGGER_RTT_SetTerminal(0);
rtt_printf(RTT_CTRL_TEXT_BRIGHT_GREEN"packet_receive==1");
rtt_printf("\n");
#endif
uint16_t len = USB_MIN(data_len, cdc->receive_length);
memcpy(data,cdc->data_rcv,len);
cdc_acm_data_receive(udev);
return len;
}
return 0;
}
void cdc_acm_data_receive (usb_dev *udev)
{
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE];
cdc->packet_receive = 0U;
//cdc->packet_sent = 0U;
usbd_ep_recev(udev, CDC_DATA_OUT_EP, (uint8_t*)(cdc->data_rcv), USB_CDC_DATA_PACKET_SIZE);
}
2.当接收卡住的时候,就是这个cdc->packet_receive没有被再次置1,。正常情况下 是在下面这段程序中置1,这段在usb的中断中
static uint8_t cdc_acm_out (usb_dev *udev, uint8_t ep_num)
{
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE];
#if RTT_DEBUG
SEGGER_RTT_SetTerminal(0);
rtt_printf(RTT_CTRL_TEXT_BRIGHT_WHITE"enter_acm_out!!!");
rtt_printf("\n");
#endif
if (0U == ep_num) {
#if RTT_DEBUG
SEGGER_RTT_SetTerminal(0);
rtt_printf(RTT_CTRL_TEXT_BRIGHT_RED"false_ep_num!!!");
rtt_printf("\n");
#endif
if (udev->dev.class_core->alter_set != NO_CMD)
{
/* Process the command data */
cdc->line_coding.dwDTERate = (uint32_t)((uint32_t)cdc->data_cmd[0] |
((uint32_t)cdc->data_cmd[1] << 8U) |
((uint32_t)cdc->data_cmd[2] << 16U) |
((uint32_t)cdc->data_cmd[3] << 24U));
cdc->line_coding.bCharFormat = cdc->data_cmd[4];
cdc->line_coding.bParityType = cdc->data_cmd[5];
cdc->line_coding.bDataBits = cdc->data_cmd[6];
udev->dev.class_core->alter_set = NO_CMD;
}
} else {
cdc->packet_receive = 1U;
cdc->receive_length = ((usb_core_driver *)udev)->dev.transc_out[ep_num].xfer_count;
#if RTT_DEBUG
SEGGER_RTT_SetTerminal(0);
rtt_printf(RTT_CTRL_TEXT_BRIGHT_GREEN"true_ep_num==1");
rtt_printf("\n");
#endif
}
return USBD_OK;
}
3.我再贴出我的rtt打印

4.现在的问题就是进入不了cdc_acm_out 。
求大佬帮忙解答一下,
|
|