USB STM32
- Stepanov Ivan
- Автор темы
- Посетитель
11 года 1 мес. назад #4778
от Stepanov Ivan
Stepanov Ivan создал тему: USB STM32
Здравствуйте! Не так давно сваял небольшой проект, касаемый работы через fatfs с usb флэшкой. Во время проверочных тестов было все не плохо, пока сегодня не столкнулся с не совсем мне понятной пролемой. При попытке отправить большое количество данных, порядка 128 кбайт, программа зависает в вот этих двух циклах (каждый раз по разному, либо в том либо в другом, реже - все проходит успешно):
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
if(HCD_IsDeviceConnected(&USB_OTG_Core))
{
do
{
status = USBH_MSC_Write10(&USB_OTG_Core,(BYTE*)buff,sector,512 * count);//(1)
USBH_MSC_HandleBOTXfer(&USB_OTG_Core, &USB_Host);
if(!HCD_IsDeviceConnected(&USB_OTG_Core))
{
return RES_ERROR;
}
}
while(status == USBH_MSC_BUSY );
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
или в этом
...
if(HCD_IsDeviceConnected(&USB_OTG_Core))
{
do
{
status = USBH_MSC_Read10(&USB_OTG_Core, buff,sector,512 * count); //(2)
USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);
if(!HCD_IsDeviceConnected(&USB_OTG_Core))
{
return RES_ERROR;
}
}
while(status == USBH_MSC_BUSY );
...
Насколько я понимаю и полученных мною данных, в представленных циклах контроллер "висит"
из за того что функции (1) и (2) возвращают USBH_MSC_BUSY. Причем спасает от зависания только передергивание флэшки. Передача данных идет в цикле, без всяких задержек (задержки ставил, эффект тот же). В чем может быть проблема? Переполнение буфера FIFO USB TX/RX? Но если бы данный эффект имел место быть, на мой взгляд, буфер, со временем опустошался бы... Подскажите пожалуйста, я уже совсем запутался...
P.S. При передаче небольшого объема данных все работает стабильно.
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
if(HCD_IsDeviceConnected(&USB_OTG_Core))
{
do
{
status = USBH_MSC_Write10(&USB_OTG_Core,(BYTE*)buff,sector,512 * count);//(1)
USBH_MSC_HandleBOTXfer(&USB_OTG_Core, &USB_Host);
if(!HCD_IsDeviceConnected(&USB_OTG_Core))
{
return RES_ERROR;
}
}
while(status == USBH_MSC_BUSY );
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
или в этом
...
if(HCD_IsDeviceConnected(&USB_OTG_Core))
{
do
{
status = USBH_MSC_Read10(&USB_OTG_Core, buff,sector,512 * count); //(2)
USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);
if(!HCD_IsDeviceConnected(&USB_OTG_Core))
{
return RES_ERROR;
}
}
while(status == USBH_MSC_BUSY );
...
Насколько я понимаю и полученных мною данных, в представленных циклах контроллер "висит"
из за того что функции (1) и (2) возвращают USBH_MSC_BUSY. Причем спасает от зависания только передергивание флэшки. Передача данных идет в цикле, без всяких задержек (задержки ставил, эффект тот же). В чем может быть проблема? Переполнение буфера FIFO USB TX/RX? Но если бы данный эффект имел место быть, на мой взгляд, буфер, со временем опустошался бы... Подскажите пожалуйста, я уже совсем запутался...
P.S. При передаче небольшого объема данных все работает стабильно.
- Stepanov Ivan
- Автор темы
- Посетитель
11 года 4 нед. назад #4855
от Stepanov Ivan
Stepanov Ivan ответил в теме Re: USB STM32
Всем спасибо, все свободны. Проблему решил, причину нашел. Как всегда, кривые ручонки и великий и ужасный STACK.
Время создания страницы: 0.030 секунд