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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
dinets
Потрогал лапой паяльник
Сообщения: 360
Зарегистрирован: Чт авг 12, 2010 10:16:32

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

Сообщение 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;
}
Чем же ловить отправку?
Реклама
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

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

Сообщение balmer »

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

Впрочем можно посылать данные без запросов с клиента.
Когда вызывается из прерывания void EP1_IN_Callback(void), то тогда можно послать еще одну порцию данных.
Реклама
dinets
Потрогал лапой паяльник
Сообщения: 360
Зарегистрирован: Чт авг 12, 2010 10:16:32

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

Сообщение 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;
				//////////

				
      }
но задержка в милисекунду меня реально удручает, не правильно это
может кто знает что ловить надо по науке?
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

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

Сообщение balmer »

Есть еще SOF (Start of Frame) Event.
Реклама
Эиком - электронные компоненты и радиодетали
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

SOF - это правильный совет.
Для bulk endpoint если отправка меньше чем размер пакета, то считается что данных больше нет и IN запросов не будет до следующего SOF.
Поэтому начинаем отправку по SOF, продолжаем пока есть данные по IN запросам и если данных больше нет а последняя отправка имела размер пакета, отправляем пакет 0 длины.
Реклама
dinets
Потрогал лапой паяльник
Сообщения: 360
Зарегистрирован: Чт авг 12, 2010 10:16:32

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

Сообщение dinets »

Странное дело Delay мне удалось заменить Вайлом но не пустым
а таким:

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

	
while(packet_sent!=1){
NOP_Process();
};
почему же пустой вайл не работает? может он както держит переменную?
Реклама
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

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

Сообщение balmer »

При объявлении переменной packet_sent есть volatile слово? Иначе при оптимизации может прочитать один раз из памяти значение в регистр, а потом в цикле проверять регистр процессора.
dinets
Потрогал лапой паяльник
Сообщения: 360
Зарегистрирован: Чт авг 12, 2010 10:16:32

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

Сообщение dinets »

так

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

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

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

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

Вернуться в «ARM»