| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Странности с lufa-Generic HID device
31.08.2013, 20:34
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Странности с lufa-Generic HID device
в общем, весьма близко к примерчику в луфа.
Софт на компе (компонент JEDI Hid Device) отсылает один output-report с "командой=0", которую МК запоминает в виде цифры (байта).
В вызове CreateGenericHIDReport эта цифра инкрементируется и отсылается назад (присваивается DataArray[1] и [2], uint16 делится на LO и HI).
Очевидно, в софте на компе должен получатся этот же инкремент. Однако..
цифра скачет сразу на несколько порядков, может с 1 до 40 прыгнуть. Если поставить паузу в цикле запроса get_report - то разрыв стремительно увеличивается.
Получается, что срабатывание CreateGenericHIDReport получается намного чаще моих вызовов его из софта на компе.
Что может быть причиной этому?
На борту еще весьма шустрый таймер (программная процедурка) (отключал, опустошал - не помогает) и наверно и все..
|
|
|
|
31.08.2013, 20:39
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: странности с lufa-Generic HID device
попробую более внятно
|
Код:
|
int main(void)
{
SetupHardware();
GlobalInterruptEnable();
while(1)
{
HID_Task();
USB_USBTask();
}
} |
|
Код:
|
void ProcessGenericHIDReport(uint8_t* DataArray)
{
/*обработка входящих репортов*/
last_command = DataArray[0];
......
if(last_command == 0x44 || DataArray[0] == 0x45) //команды 0x44,0x45 старт и стоп чтения eeprom
{
ext_eeprom_addr = 0; //сброс адресации eeprom
} |
|
Код:
|
void CreateGenericHIDReport(uint8_t* DataArray)
{
...
if(last_command == 0x44) //
{
DataArray[0] = 0x44; //возврат команды для проверки
DataArray[1] = LO(ext_eeprom_addr);
DataArray[2] = HI(ext_eeprom_addr);
ext_eeprom_addr++; //инкремент адреса |
|
Код:
|
fillchar(usb_report,length(usb_report),0);
usb_report[1] := $44;
send_out_report();
n:=1;
while( usb_report[1] = $44) do
begin
get_in_report(); (данные попадают в массив usb_report)
Memo1.Lines.Add(IntToStr(n) + ' 0x'+IntToHex(usb_report[1], 2) + ' - ' + IntToStr( (usb_report[3] shl 8) or usb_report[2] ));
inc(n);
end; //while |
|
|
|
|
01.09.2013, 00:13
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Странности с lufa-Generic HID device
Ничо не понимаю, в общем то. Вызов процедуры, где "складывается" массив на отправку, явно происходит часто и густо без моего участия.
Я очень рассчитывал разместить там счетчик.. чтобы сэкономить на протоколе обмена, но видно не судьба
|
|
|
|
01.09.2013, 00:46
|
|
|
Гражданин KAZUS.RUN
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 980
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Странности с lufa-Generic HID device
Сообщение от whoim
|
|
Вызов процедуры, где "складывается" массив на отправку, явно происходит часто и густо без моего участия.
|
Каждую 1 мс если быть точным. Т.к. ваше устройство ничего не имеет права посылать без ведома компьютера, оно вынуждено проверять есть ли что ему отправить с каждым новым фреймом на шине.
|
|
|
|
01.09.2013, 00:49
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Странности с lufa-Generic HID device
Wiza_, не думаю, что там 1мс. Я таймеры не поднимал, библиотека не использует. Вызов идет в основном теле (постоянно, а в таймер переносятся свои заморочки).
К тому же
|
Код:
|
void HID_Task(void)
{
/* Device must be connected and configured for the task to run */
if (USB_DeviceState != DEVICE_STATE_Configured)
return;
Endpoint_SelectEndpoint(GENERIC_OUT_EPADDR);
/* Check to see if a packet has been sent from the host */
if (Endpoint_IsOUTReceived())
{
/* Check to see if the packet contains data */
if (Endpoint_IsReadWriteAllowed())
{
/* Create a temporary buffer to hold the read in report from the host */
uint8_t GenericData[OUT_REPORT_SIZE];
/* Read Generic Report Data */
Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL);
/* Process Generic Report Data */
ProcessGenericHIDReport(GenericData);
}
/* Finalize the stream transfer to send the last packet */
Endpoint_ClearOUT();
}
Endpoint_SelectEndpoint(GENERIC_IN_EPADDR);
/* Check to see if the host is ready to accept another packet */
if (Endpoint_IsINReady())
{
/* Create a temporary buffer to hold the report to send to the host */
uint8_t GenericData[IN_REPORT_SIZE];
/* Create Generic Report Data */
CreateGenericHIDReport(GenericData);
/* Write Generic Report Data */
Endpoint_Write_Stream_LE(&GenericData, sizeof(GenericData), NULL);
/* Finalize the stream transfer to send the last packet */
Endpoint_ClearIN();
}
} |
или это и есть то вы имеете ввиду? Если готов - то огонь?
|
|
|
|
01.09.2013, 00:52
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Странности с lufa-Generic HID device
Как бы у меня принцип задумывался такой.
uint8_t last_comand хранит "код" последней пришедшей команды.
То есть в set_output_report я отправляю эту команду, МК запоминает.
При вызове CreateGenericHIDReport внутри проверяется, соответствует ли last_command этой цифре, и если да - заполняется массив. Если я после заполнения массива обнулю last_command то эта теория не работает ВООБЩЕ.
То есть код команды я посылаю, он присваивается last_command, однако проверку ветка в CreateGenericHIDReport НЕ проходит.
Путаюсь вконец уже. Мож, целиком выложить? С библиотекой?
|
|
|
|
01.09.2013, 00:53
|
|
|
Гражданин KAZUS.RUN
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 980
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Странности с lufa-Generic HID device
Сообщение от whoim
|
|
/* Check to see if the host is ready to accept another packet */
|
Имеется ввиду что хост послал SOF для данной точки
|
|
|
|
01.09.2013, 00:55
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Странности с lufa-Generic HID device
Wiza_, ага.
Получается, CreateGenericHIDReport выполняется всегда с бешаной скоростью, а программа на компе забирает данные только когда они реально нужны..
Как в таких условиях организовать передачу из МК данных неизвестного состава и длинны? Я планировал по "метке" останавливать передачу, передавая программе на компе некий байтик..
|
|
|
|
01.09.2013, 00:57
|
|
|
Гражданин KAZUS.RUN
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 980
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Странности с lufa-Generic HID device
Не, мне хватило ковыряния с CDC. Второй раз я этого не переживу =)
Суть в том, что внутренние процедуры USB - не трогайте. В либе должно быть две процедуры с которыми вам надо работать: отослать массив, и колбэк на приём данных. В остальное лучше не лезть и не вникать. Только если для общего развития...
|
|
|
|
01.09.2013, 00:57
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Странности с lufa-Generic HID device
Сообщение от whoim
|
|
Если я после заполнения массива обнулю last_command то эта теория не работает ВООБЩЕ
|
получается следующее, видимо
программа на ПК посылает команду в МК
команда запоминается
процедура CreateGenericHIDReport выполняется следом без оглядки на то, просит ли хост данные, попутно обнуляя команду
когда комп просит данные, уже поздно - метка обнулена
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:25.
|
|