Страница 1 из 1

ожиание отправки по USB

Добавлено: Пт июн 26, 2015 12:42:30
dinets
препарирую пример STM32_USB-FS-Device_Lib_V4.0.0--- VirtualComport_Loopback
отличный пример просто бери и используй
НО у него отправочный буфер всего 64байта

И возникли проблемы с досылкой нескольких пакетов

пробовал сделать так

Код: Выделить всё

uint32_t CDC_Send_DATA (uint8_t *ptrBuffer, uint8_t Send_length)
{
  /*if max buffer is Not reached*/
  if(Send_length < VIRTUAL_COM_PORT_DATA_SIZE)     
  {
    /*Sent flag*/
    packet_sent = 0;
    /* send  packet to PMA*/
    UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
    SetEPTxCount(ENDP1, Send_length);
    SetEPTxValid(ENDP1);
  }
  else
  {
		while (Send_length>VIRTUAL_COM_PORT_DATA_SIZE)
		{
			  packet_sent = 0;
		   UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
    SetEPTxCount(ENDP1, Send_length);
    SetEPTxValid(ENDP1);
		//
			
				while(packet_sent!=1);
						Send_length=Send_length-64;
						ptrBuffer=ptrBuffer+64;
		}
		  packet_sent = 0;
    /* send  packet to PMA*/
    UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
    SetEPTxCount(ENDP1, Send_length);
    SetEPTxValid(ENDP1);
		
    return 0;
  } 
  return 1;
}
но виснет на

Код: Выделить всё

while(packet_sent!=1);
хотя поидее оно должно поменятся в Колбэке отправики тут

Код: Выделить всё

void EP1_IN_Callback (void)
{
  packet_sent = 1;
}
Чем же ловить отправку?

Re: ожиание отправки по USB

Добавлено: Пт июн 26, 2015 13:38:51
balmer
Делал протокол, в котором всегда компьютер запрашивает данные (не более 64-х байт зараз). Потом правда урезал, и сделал не более 32-х байт, иначе под OS X ошибки передачи были иногда. Врочем в USB разбираюсь не очень хорошо.

Впрочем можно посылать данные без запросов с клиента.
Когда вызывается из прерывания void EP1_IN_Callback(void), то тогда можно послать еще одну порцию данных.

Re: ожиание отправки по USB

Добавлено: Пт июн 26, 2015 14:09:19
dinets
Точнее я выкрутился так

Код: Выделить всё

				while (Receive_length>63)
				{
					
          CDC_Send_DATA ((unsigned char*)buf_out+i*63,63);
					 Delay(1);// delay 1 ms per count @ Crystal 8.0 MHz and PLL9x or SYSCLK = 72 MHz
//					buf_out+=63;
					Receive_length=Receive_length-63;
					i=i+1;
				}
				 CDC_Send_DATA ((unsigned char*)buf_out+i*63,Receive_length);
				
		//		CDC_Send_DATA ((unsigned char*)buf_out,Receive_length);
        Receive_length = 0;
				//////////

				
      }
но задержка в милисекунду меня реально удручает, не правильно это
может кто знает что ловить надо по науке?

Re: ожиание отправки по USB

Добавлено: Пт июн 26, 2015 15:00:20
balmer
Есть еще SOF (Start of Frame) Event.

Re: ожиание отправки по USB

Добавлено: Пт июн 26, 2015 17:38:40
BorisSPB
SOF - это правильный совет.
Для bulk endpoint если отправка меньше чем размер пакета, то считается что данных больше нет и IN запросов не будет до следующего SOF.
Поэтому начинаем отправку по SOF, продолжаем пока есть данные по IN запросам и если данных больше нет а последняя отправка имела размер пакета, отправляем пакет 0 длины.

Re: ожиание отправки по USB

Добавлено: Вт июн 30, 2015 08:29:18
dinets
Странное дело Delay мне удалось заменить Вайлом но не пустым
а таким:

Код: Выделить всё

	
while(packet_sent!=1){
NOP_Process();
};
почему же пустой вайл не работает? может он както держит переменную?

Re: ожиание отправки по USB

Добавлено: Вт июн 30, 2015 09:14:00
balmer
При объявлении переменной packet_sent есть volatile слово? Иначе при оптимизации может прочитать один раз из памяти значение в регистр, а потом в цикле проверять регистр процессора.

Re: ожиание отправки по USB

Добавлено: Вт июн 30, 2015 10:02:15
dinets
так

Код: Выделить всё

extern __IO uint32_t packet_sent;
а в мэйне так

Код: Выделить всё

uint32_t packet_sent=1;
хитрый протык буду знать.....