Перейти к содержанию

Принять символы с клавиатуры USB HOST HID STM32f105


artos5

Рекомендуемые сообщения

Добрый вечер уважаемые форумчане .

Прошу Вашей помощи в решении проблемы ... 

Проблема заключается в том , что не удаётся прочитать символы с клавиатуры .

Тут лежит полный проект : https://cloud.mail.ru/public/C2n6/3b6xY2XDr 

 

Вот в этой функции происходит затык:

/**
  * @brief  USBH_HID_KeybdDecode 
  *         The function decode keyboard data.
  * @param  phost: Host handle
  * @retval USBH Status
  */
static USBH_StatusTypeDef USBH_HID_KeybdDecode(USBH_HandleTypeDef *phost)
{
  uint8_t x;
  
  HID_HandleTypeDef *HID_Handle =  (HID_HandleTypeDef *) phost->pActiveClass->pData;
  if(HID_Handle->length == 0)
  {
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,1);
    return USBH_FAIL;
	
  }
  /*Fill report */
  if(fifo_read(&HID_Handle->fifo, &keybd_report_data, HID_Handle->length) ==  HID_Handle->length)
  {
    
    keybd_info.lctrl=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_lctrl, 0);
    keybd_info.lshift=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_lshift, 0);
    keybd_info.lalt=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_lalt, 0);
    keybd_info.lgui=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_lgui, 0);
    keybd_info.rctrl=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_rctrl, 0);
    keybd_info.rshift=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_rshift, 0);
    keybd_info.ralt=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_ralt, 0);
    keybd_info.rgui=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_rgui, 0);
    
    for(x=0; x < sizeof(keybd_info.keys); x++)
    {    
      keybd_info.keys[x]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_key_array, x);
    }
    
    return USBH_OK; 
  }
	
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,1); // загорается светодиод
  return   USBH_FAIL;	
}

в главной функции пытаюсь прочитать так:

(сильно не пинайте) :) 

void MenuProcess(void)
{
	char id;
	static char timer=0;
	static char keys=0;
	char c;
	
                if(Appli_state==APPLICATION_START)
                {
									 if(++timer>20)
									 {
                        Usart2_Send_String("connect OK! \r\n");
		                    Usart3_Send_String("connect OK! \r\n");
										 timer=0;
									 }
									 							
									 Delay_ms(1000);
                }
                else if(Appli_state==APPLICATION_IDLE)
                {
									      
									      if(++timer>20)
																 {
																	Usart2_Send_String("IDLE! \r\n");
		                               Usart3_Send_String("IDLE! \r\n");
																	 timer=0;
																 }
									Delay_ms(1000);
																 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
                }
								else if(Appli_state==APPLICATION_DISCONNECT)
								{
									  
									 if(++timer>20)
																 {
																	    Usart2_Send_String("DISCONNECT! \r\n");
		                                  Usart3_Send_String("DISCONNECT! \r\n");
																	 timer=0;
																 }
									Delay_ms(1000);
																 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
								}
								else if(Appli_state==APPLICATION_READY)
								{

															 if(USBH_HID_GetDeviceType(&hUsbHostFS) == HID_KEYBOARD)
														  {  
																if(++timer>20)
																 {
																								Usart2_Send_String("HID KEY! \r\n");
																								Usart3_Send_String("HID KEY! \r\n");
																	 timer=0;
																 }		
														   	k_pinfo = USBH_HID_GetKeybdInfo(&hUsbHostFS);
																 
	                 	     

																 
														 if(k_pinfo!=NULL)
														 {
																char chr = USBH_HID_GetASCIICode(k_pinfo);
															 Usart2_Send_symbol(chr);
															 Usart3_Send_symbol(chr);
															 

														 }
														 else
														 {
															 if(++timer>20)
																 {
																								Usart2_Send_String("ERR! \r\n");
																								Usart3_Send_String("ERR! \r\n");
																	 timer=0;
																 }
																 
																 char chr = USBH_HID_GetASCIICode(k_pinfo);
															 Usart2_Send_symbol(chr);
															 Usart3_Send_symbol(chr);
														 }
														}
														else
														{
															if(++timer>20)
									             {
																	Usart2_Send_String("NO KEY! \r\n");
																	Usart3_Send_String("NO KEY! \r\n");
																 timer=0;
															 }
														}
														 
									Delay_ms(1000);
								}
  
}

В чем может быть дело?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

3 часа назад, artos5 сказал:

Вот в этой функции происходит затык:

"Затык" нужно описывать. На какой строке, какая ошибка, какие при этом значения в переменных...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Все что вчера успел выяснить , не выполняется это условие:

if(fifo_read(&HID_Handle->fifo, &keybd_report_data, HID_Handle->length) == HID_Handle->length)

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Значит так:

Проанализировал я в отладке кейл .

Получается такая картина:

есть функция 

 if(phost->pActiveClass != NULL)
      {
        if(phost->pActiveClass->Init(phost)== USBH_OK)
        {
          phost->gState  = HOST_CLASS_REQUEST; 
          USBH_UsrLog ("%s class started.", phost->pActiveClass->Name);
          
          /* Inform user that a class has been activated */
          phost->pUser(phost, HOST_USER_CLASS_SELECTED);   
        }
        else
        {
          phost->gState  = HOST_ABORT_STATE;
          USBH_UsrLog ("Device not supporting %s class.", phost->pActiveClass->Name);
        }
      }

в файле usbh_core.c

Так вот при отладке не попадает в условие : if(phost->pActiveClass->Init(phost)== USBH_OK)

и соответственно попадает:

USBH_UsrLog ("Device not supporting %s class.", phost->pActiveClass->Name);

Как можно это исправить?

ПС: Еще один дурацкий вопрос:

Как увидеть отладочную инфу ЮСБ ??

Вот к примеру эту: USBH_UsrLog ("Device not supporting %s class.", phost->pActiveClass->Name);

Помогите пожалуйста ..

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Привет :D

Если он не попадает в условие if(phost->pActiveClass->Init(phost)== USBH_OK) -- значит не прошла инициализация драйвера класса HID. Навскидку сложно сказать почему.

Походите отладкой по этой функции. Наверняка это функция USBH_HID_InterfaceInit из файла usbh_hid.c В низкоуровневые функции типа USBH_AllocPipe не ходите, попробуйте для начала понять, на каком из тамошних условий она вываливается.

Ещё вспомнился нюанс - какая у Вас клавиатура - простая проводная, либо ГМО типа радиокомплект мышь+клавиатура? Судя по коду, эти ГМО вряд ли будут работать, равно как и прочие "радио" изделия. Причину я примерно знаю, но точно не подскажу, т.к. эта инфа с чужих слов, а у меня самого до них не дошли руки, хотя такой радиокомплект у меня есть.

Поэтому на данном этапе лучше всего использовать простую проводную клавиатуру.

Вы показывали мне ссылку - https://community.st.com/thread/38415-usb-host но там что-то другое - он показывает

KeyBoard device found!
HID class started.

Т.е. у него класс, похоже, инициализировался успешно.

Цитата

Как увидеть отладочную инфу ЮСБ ??

Вот к примеру эту: USBH_UsrLog ("Device not supporting %s class.", phost->pActiveClass->Name);

Судя по коду это обычный printf, он вроде сыпет инфу в uart1 проца. Но я в этом не уверен, т.к. вообще этим не пользуюсь, тем более не знаю, как в кейле это дело настраивать (кейлом тож не пользуюсь :D). Здесь подсказать не могу.

Либо курите его настройку, либо подсуньте туда что-то своё, тем более, что USBH_UsrLog - простой макрос, объявленный через #define

Например, заменить printf на sprintf и выпулить полученный буфер в другой уарт, я видел, у вас в коде он настраивается - будет то же самое по сути.

Если ни фига не выйдет, я попробую накрайняк у себя пощупать ... но срочности не обещаю - работа.

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Привет Дружище ;) Сейчас сел ковырять дальше ЮСБ .

Отладочная инфа не идёт на 1 юарт , при включении отладочной инфы в кубе , проц почему то зависает .

Вот так 1 юарт работает:

void Usart1_Send_symbol(uint8_t data) 
{
  while(!(USART1->SR & USART_SR_TC)); 
  USART1->DR = data;  
}

//SEND String
void Usart1_Send_String(char* str)
{
  uint8_t i=0;
  while(str[i])
  {
    Usart1_Send_symbol(str[i]);
    i++;
  }
  Usart1_Send_symbol('\n');
  Usart1_Send_symbol('\r');
}

А отладочная инфа не вываливается ...

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Привет :D

Ну поменяйте ихний printf на что-то своё. printf-ом в МК я вообще не пользовался, ни на аврах, ни на stm32, потому не могу сказать ничего. Изредка на просторах интернета натыкался на какие-то жалобы, что этот механизм как-то странно работает. К тому же и сильно зависит от используемого компилятора... Но в детали не вникал:D.

Сам использую самописные функции - по сути sprintf + то, что Вы назвали Usart1_Send_String. А кому не нравится - его проблемы :D.

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Иногда тоже не использую printf() .

Но где нет требований - там использую , так как удобен .

Значит так:

fifo_read(&HID_Handle->fifo, &keybd_report_data, HID_Handle->length);  - всегда возвращает ноль .

А вот :

HID_Handle->length - первый проход возвращает число 8 , все остальные число 2 .

Потому условие и не срабатывает...

Копаю дальше :)

 

Также это условие не срабатывает...

if(USBH_HID_KeybdDecode(phost) == USBH_OK)

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Код урезал уже до такого состояния :

Скрытый текст

/**
  ******************************************************************************
  * File Name          : main.c
  * Description        : Main program body
  ******************************************************************************
  *
  * Copyright (c) 2017 STMicroelectronics International N.V. 
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without 
  * modification, are permitted, provided that the following conditions are met:
  *
  * 1. Redistribution of source code must retain the above copyright notice, 
  *    this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright notice,
  *    this list of conditions and the following disclaimer in the documentation
  *    and/or other materials provided with the distribution.
  * 3. Neither the name of STMicroelectronics nor the names of other 
  *    contributors to this software may be used to endorse or promote products 
  *    derived from this software without specific written permission.
  * 4. This software, including modifications and/or derivative works of this 
  *    software, must execute solely and exclusively on microcontroller or
  *    microprocessor devices manufactured by or for STMicroelectronics.
  * 5. Redistribution and use of this software other than as permitted under 
  *    this license is void and will automatically terminate your rights under 
  *    this license. 
  *
  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
#include "usb_host.h"

/* USER CODE BEGIN Includes */
#include "usbh_hid_keybd.h"
#include "usbh_core.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

extern ApplicationTypeDef Appli_state;
extern USBH_HandleTypeDef hUsbHostFS;

#define RX_BUFFER_SIZE 250

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_USART1_UART_Init(void);
void MX_USB_HOST_Process(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
HID_KEYBD_Info_TypeDef *k_pinfo;

char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index=0;

char rx_buffer2[RX_BUFFER_SIZE];
unsigned char rx_wr_index2=0;

void Delay_ms(long int delay)
{
	delay=delay*1000;
	while(delay--);
}

//Send char
void Usart3_Send_symbol(uint8_t data) 
{
  while(!(USART3->SR & USART_SR_TC)); //????????? ????????? ????? TC - ?????????? ?????????? ???????? 
  USART3->DR = data; //?????????? ???????? ? ??????? ?????? - ???????? ??????
}

//Send string 
void Usart3_Send_String(char* str)
{
  uint8_t i=0;
  while(str[i])
  {
    Usart3_Send_symbol(str[i]);
    i++;
  }
  Usart3_Send_symbol('\n');
  Usart3_Send_symbol('\r');
}

//Send char
void Usart2_Send_symbol(uint8_t data) 
{
  while(!(USART2->SR & USART_SR_TC)); //????????? ????????? ????? TC - ?????????? ?????????? ???????? 
  USART2->DR = data; //?????????? ???????? ? ??????? ?????? - ???????? ??????
}

//SEND String
void Usart2_Send_String(char* str)
{
  uint8_t i=0;
  while(str[i])
  {
    Usart2_Send_symbol(str[i]);
    i++;
  }
  Usart2_Send_symbol('\n');
  Usart2_Send_symbol('\r');
}

void USART3_IRQHandler()
{
    //int UART3
	char vuart_data;

if (USART3->SR & USART_SR_RXNE) { // UARTs TEST 
vuart_data=USART3->DR;
	
	rx_buffer[rx_wr_index++]=vuart_data;
			if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
}
}

void USART2_IRQHandler()
{
    //int UART2
	char vuart_data;

if (USART2->SR & USART_SR_RXNE) { // UART < HID
vuart_data=USART2->DR;
	
	rx_buffer2[rx_wr_index2++]=vuart_data;
			if (rx_wr_index2 == RX_BUFFER_SIZE) rx_wr_index2=0;
}
}

char string_cmp(char *str1,char *str2)
{
unsigned int x=0;
str1+=0;
str2+=0;
while(str1[x]!=0)
{
if(str1[x] != str2[x])
{
  return 0;
}
x++;
}
return 1;
}

void clear_buffer()
{
	for(unsigned char x=0; x<RX_BUFFER_SIZE; x++){rx_buffer[x]=0; rx_buffer2[x]=0;}
	rx_wr_index=0;
	rx_wr_index2=0;
}



void led_blink(char blink, int delay)
{
	for(char x=0; x<blink; x++)
	{
	  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,1); //HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
		Delay_ms(delay);
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
		Delay_ms(delay);
	}
}

//void led_frg()
//{

//	  if(timer>500){ HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,1); if(timer>1000)timer=0; } //HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
//		//Delay_ms(delay);
//		if(timer<500) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,0);
//		//Delay_ms(delay);

//}

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

void MenuProcess(void)
{
//	char id;
	static unsigned long int timer=0;
//	static char keys=0;
//	char c;
	
                if(Appli_state==APPLICATION_START)
                {
									 if(++timer>200000)
									 {
                        //Usart2_Send_String("connect OK! \r\n");
		                    Usart3_Send_String("conn OK!");
										 timer=0;
									 }
									 							
									 
                }
                else if(Appli_state==APPLICATION_IDLE)
                {
									      
									      if(++timer>200000)
																 {
																	//Usart2_Send_String("IDLE! \r\n");
		                               Usart3_Send_String("IDLE!");
																	 timer=0;
																 }
									 
																 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
                }
								else if(Appli_state==APPLICATION_DISCONNECT)
								{
									  
									 if(++timer>200000)
																 {
																	    //Usart2_Send_String("DISCONNECT! \r\n");
		                                  Usart3_Send_String("DISCONNECT!");
																	 timer=0;
																 }
									 
																 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
								}
								else if(Appli_state==APPLICATION_READY)
								{

															 if(USBH_HID_GetDeviceType(&hUsbHostFS) == HID_KEYBOARD)
														  {  
																if(++timer>200000)
																 {
																								//Usart2_Send_String("HID KEY!");
																								Usart3_Send_String("HID KEY!");
																	 timer=0;
																 }		
														   	k_pinfo = USBH_HID_GetKeybdInfo(&hUsbHostFS);
																 
	                 	     

																 
														 if(k_pinfo!=NULL)
														 {
																char chr = USBH_HID_GetASCIICode(k_pinfo);
															 Usart2_Send_symbol(chr);
															 Usart3_Send_symbol(chr);
															 

														 }
														 else
														 {
															 if(++timer>200000)
																 {
																								//Usart2_Send_String("ERR!");
																								Usart3_Send_String("ERR!");
																	 timer=0;
																 }
																 
//																 char chr = USBH_HID_GetASCIICode(k_pinfo);
//															 Usart2_Send_symbol(chr);
//															 Usart3_Send_symbol(chr);
														 }
														}
														else
														{
															if(++timer>200000)
									             {
																	//Usart2_Send_String("NO KEY!");
																	Usart3_Send_String("NO KEY!");
																 timer=0;
															 }
														}
														 
									 
								}
  
}

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */
	//USB_HID_HOST_STATUS_t host_status;
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_HOST_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */
//	__enable_irq(); //?????????? ????????? ??????????
//NVIC_EnableIRQ(USART3_IRQn); //???????? ?????????? ?? UART
//NVIC_SetPriority(USART3_IRQn, 0); //?????????? ?? UART, ????????? 0, ????? ???????


//NVIC_EnableIRQ(USART2_IRQn); //???????? ?????????? ?? UART
//NVIC_SetPriority(USART2_IRQn, 1); //?????????? ?? UART, ????????? 0, ????? ???????
//USART3->CR1 |= USART_CR1_RXNEIE; //?????????? ?? ??????
//USART2->CR1 |= USART_CR1_RXNEIE; //?????????? ?? ??????
	
	led_blink(40, 500);
		Usart2_Send_String("System start... \r\n");
		Usart3_Send_String("System start... \r\n");
		  Delay_ms(2000);
		Usart2_Send_String("Program start OK! \r\n");
		Usart3_Send_String("Program start OK! \r\n");
		
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
    MX_USB_HOST_Process();

  /* USER CODE BEGIN 3 */
		
		//AT_cmd();
		MenuProcess();
		
	
		
	//	uint32_t data = OTG_FS_GRXSTSR; //OTG_FS_GRXSTSP;

		//led_blink(10, 500);
    //Delay_ms(1000);
  }
  /* USER CODE END 3 */

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.Prediv1Source = RCC_PREDIV1_SOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
  RCC_OscInitStruct.PLL2.PLL2State = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV2;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

    /**Configure the Systick interrupt time 
    */
  __HAL_RCC_PLLI2S_ENABLE();

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* USART1 init function */
static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

}

/* USART2 init function */
static void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }

}

/* USART3 init function */
static void MX_USART3_UART_Init(void)
{

  huart3.Instance = USART3;
  huart3.Init.BaudRate = 115200;
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
  huart3.Init.StopBits = UART_STOPBITS_1;
  huart3.Init.Parity = UART_PARITY_NONE;
  huart3.Init.Mode = UART_MODE_TX_RX;
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart3) != HAL_OK)
  {
    Error_Handler();
  }

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pins : PC1 PC2 PC3 */
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler */
  /* User can add his own implementation to report the HAL error return state */
  while(1) 
  {
		
//		if(host_status==USB_HID_KEYBOARD_CONNECTED)
//		{
//			
//		}
  }
  /* USER CODE END Error_Handler */ 
}

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

/**
  * @}
  */ 

/**
  * @}
*/ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

Кто может проверить . Может я банально неправильно переменные какие объявил , затрагивающие USB ...

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, hd44780 сказал:

Ну поменяйте ихний printf на что-то своё

Да проблема в том что там еще числа переменных в принтф отправляются, а моя функция такого не делает . Она просто текст печатает .

Вот так не работает :

#if (USBH_DEBUG_LEVEL > 0)                         
#define  USBH_DbgLog(...)   sprintf(data_,__VA_ARGS__);\
                            Usart3_Send_String(data_);

Хотя , по идее должно . Выдает при сборке 10 ошибок

Вот содержимое:

linking...
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usb_host.o and main.o).
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usbh_conf.o and main.o).
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usbh_ioreq.o and main.o).
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usbh_hid_mouse.o and main.o).
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usbh_pipes.o and main.o).
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usbh_core.o and main.o).
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usbh_hid_keybd.o and main.o).
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usbh_hid_parser.o and main.o).
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usbh_ctlreq.o and main.o).
USB_HOST_STM32F105\USB_HOST_STM32F105.axf: Error: L6200E: Symbol data_ multiply defined (by usbh_hid.o and main.o).
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 0 warning and 10 error messages.
"USB_HOST_STM32F105\USB_HOST_STM32F105.axf" - 10 Error(s), 4 Warning(s).
Target not created.
Build Time Elapsed:  00:00:15

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, artos5 сказал:

HID_Handle->length - первый проход возвращает число 8 , все остальные число 2 .

Потому условие и не срабатывает...

Про проходы я не понял. USBH_HID_KeybdDecode - эта функция вызывается при каждом нажатии любой клавиши. И её задача - расшифровать сканкоды клавиатуры. 1 нажатие = 1 порция сканкодов. Сколько именно это байт - зависит от клавиши. Максимально там вроде 8 байт, но я сейчас в этой цифре не уверен.

Если вы ничего не нажимаете, то эта функция вообще не должна вызываться.

Какие тут проходы?

 

Цитата

Также это условие не срабатывает...


if(USBH_HID_KeybdDecode(phost) == USBH_OK)

Это уже следствие .... Когда USBH_HID_KeybdDecode отработает нормально, оно само взлетит.

 

Про отладку сразу не отвечу.

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, hd44780 сказал:

Какие тут проходы?

Первый цикл .

И последующие циклы .

Итак получилось вывалить содержимое отладки в 3й юарт )))

Вот что имею :

USB Device Attached
PID: c18h
VID: 2a7ah
Address (#1) assigned.
Manufacturer : N/A
Product : U
Serial Number : N/A
Enumeration done.
This device has only 1 configuration.
Default configuration set.
Switching to Interface (#0)
Class    : 3h
SubClass : 1h
Protocol : 1h
KeyBoard device found!
HID class started.

Не пойму почему не работает...

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Вот так пытаюсь прочитать с клавы данные :

	else if(Appli_state==APPLICATION_READY)
	{
      if(USBH_HID_GetDeviceType(&hUsbHostFS) == HID_KEYBOARD)
		{  
		if(++timer>200000)
			{
							
				Usart3_Send_String("HID KEY!");
				 timer=0;
			}		
		k_pinfo = USBH_HID_GetKeybdInfo(&hUsbHostFS);	 
		if(k_pinfo!=NULL)
		 {
			char chr = USBH_HID_GetASCIICode(k_pinfo);
			Usart2_Send_symbol(chr);
			Usart3_Send_symbol(chr);
		 }								
		}
		else
		{
		if(++timer>200000)
			{
			Usart3_Send_String("NO KEY!");
			timer=0;
			}
		}
}

Это условие не срабатывает:

if(k_pinfo!=NULL)

Если пытаюсь в тупую читать с клавы , получаю постоянно либо '1' либо '2' в юарт.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, hd44780 сказал:

Вы показывали мне ссылку - https://community.st.com/thread/38415-usb-host но там что-то другое - он показывает

KeyBoard device found!
HID class started.

У меня получается та же проблема что и у него . Хоть пиши ему письмо :)

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

HID_KEYBD_Info_TypeDef *USBH_HID_GetKeybdInfo(USBH_HandleTypeDef *phost)
{
  if(USBH_HID_KeybdDecode(phost) == USBH_OK)
 {
  return &keybd_info;
 }
 else
 {
  return NULL; 
 }  
}

Возвращается NULL, т.к. не пашет USBH_HID_KeybdDecode, что мы выше уже определили - длина данных не совпадает. Там надо рыть.

Я постараюсь сегодня глубже вдуматься в суть того, как оно работает. Эту часть в кубе заметно переписали, работает оно не так, как в докубовых либах, которые я использую :(.

А с кубом я считай не работал, и без него хорошо:D

Ссылка на комментарий
Поделиться на другие сайты

Посмотрел кубовый USB драйвер HID класса, сопоставил с некубовыми либами. Заметил одно на мой взгляд существенное отличие. Детально не копался, т.к. смотрел лишь в код, в железе не проверял.

Короче - в файле usbh_hid.c (это драйвер HID класса, там общий код для мышей и клавиатур) есть функция USBH_HID_Process. Там в switch есть ветка case HID_IDLE. В ней вызывается fifo_write - закомментарьте её и проверьте.

Эта штука пишет что-то в очередь. Очередь читается в USBH_HID_KeybdDecode (и больше нигде, драйвер мыши не в счёт), там пытается вытащить из очереди сканкоды клавиши и потом декодировать их. Мне сложно сразу сказать, что именно пишется в очередь в HID_IDLE и зачем оно туда пишется, т.к. реальные данные (хоть от мыши, хоть от клавы) приходят в этой же функции в ветке HID_GET_DATA, а в очередь загоняются в следующей ветке - HID_POLL. Пихать в эту очередь что-то ещё кроме данных - как по мне - явно лишнее.

Пока так ....

PS.

А вообще - как-то стрёмно у них это сделано... даже не знаю, как поточнее сформулировать.

В очередь пишет по сути функция MX_USB_HOST_Process(), вызывающаяся в главном цикле. Она кладёт туда сканкоды, кол-во байт которых м.б. разным. Декодер вызывается из функции USBH_HID_GetKeybdInfo где-то в пользовательском коде ... Причём декодер использует HID_Handle->length для получения длины данных в очереди. HID_Handle->length изменяется в недрах той же MX_USB_HOST_Process().

Чувствуете чем всё это пахнет? Банальным рассинхроном, когда в очереди будут лежать данные, а HID_Handle->length уедет куда-то дальше .... В итоге работать ничего не будет, хоть в очередь будут попадать правильные коды. Я не знаю, насколько это вероятно, но такое вполне может быть.

Если не лезть в кубовый код, я бы посоветовал сделать что-то такое:

if(Appli_state==APPLICATION_READY)
{
	 if(USBH_HID_GetDeviceType(&hUsbHostFS) == HID_KEYBOARD)
	  {  
	   	k_pinfo = USBH_HID_GetKeybdInfo(&hUsbHostFS);
    	 if(k_pinfo!=NULL)
		 {
			char chr = USBH_HID_GetASCIICode(k_pinfo);
		 }
}

сразу после MX_USB_HOST_Process() и класть этот chr в какой-то свой буфер и потом использовать где надо.

В старых либах это сделано более грамотно - там данные клавы/мыши не кладутся в очередь, а сразу декодируются. А в очередь попадает уже готовый символ.

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Привет Дружище! ;)

8 часов назад, hd44780 сказал:

 

Если не лезть в кубовый код, я бы посоветовал сделать что-то такое:


if(Appli_state==APPLICATION_READY)
{
	 if(USBH_HID_GetDeviceType(&hUsbHostFS) == HID_KEYBOARD)
	  {  
	   	k_pinfo = USBH_HID_GetKeybdInfo(&hUsbHostFS);
    	 if(k_pinfo!=NULL)
		 {
			char chr = USBH_HID_GetASCIICode(k_pinfo);
		 }
}

сразу после MX_USB_HOST_Process() и класть этот chr в какой-то свой буфер и потом использовать где надо.

Я так точно и пробую , получается что не срабатывает условие : 

if(k_pinfo!=NULL)

В этом то и загвоздка тоже ...

Я думаю , может я чего на портачил с переменными при объявлении ?

Потому как у этого чувака через sprintf() реализовано ... как то переменная форматируется в строку что ли .

Дублирую его код:

if(USBH_HID_GetDeviceType(&hUSBHost) == HID_KEYBOARD)
      {

        hid_demo.keyboard_state = HID_KEYBOARD_IDLE; 
        hid_demo.state = HID_DEMO_KEYBOARD;
                    //HID_KeyboardMenuProcess();
                    
                    HID_KEYBD_Info_TypeDef *k_pinfo; 
                    char c;
                    k_pinfo = USBH_HID_GetKeybdInfo(&hUSBHost);
                    
                    if(k_pinfo != NULL)
                    {
                         
                         c = USBH_HID_GetASCIICode(k_pinfo);
                         
                         char str[5];
                         sprintf(str,"%c",c);
                         HAL_UART_Transmit(&huart2,k_pinfo->keys,6,10000);
                         
                    }
                    
               }
     }

https://community.st.com/thread/38415-usb-host

 

Завтра попробую через спритф , но оно работать не будет скорее  так как выше условие не срабатывает...

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Вы про HID_IDLE в моём посте прочитали?

Условие, о котором Вы пишете - следствие какого-то сбоя в USBH_HID_KeybdDecode. Если USBH_HID_KeybdDecode сработает, то всё остальное, я думаю, сразу оживёт.

Типы я просмотрел, вроде норм. Да и компилятор бы выругался..

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

22 часа назад, hd44780 сказал:

Короче - в файле usbh_hid.c (это драйвер HID класса, там общий код для мышей и клавиатур) есть функция USBH_HID_Process. Там в switch есть ветка case HID_IDLE. В ней вызывается fifo_write - закомментарьте её и проверьте.

Привет дружище! Сегодня проверю этот момент . И отпишусь сразу .
А вообще запутанный код пипец... 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

В 16.05.2017 в 12:11, hd44780 сказал:

Там в switch есть ветка case HID_IDLE. В ней вызывается fifo_write - закомментарьте её и проверьте.

За комментировал, собрал проект , проверил - не работает все равно ... Уже голова кипит :(

Сделал так:

else if(Appli_state==APPLICATION_READY)
								{

			                         if(USBH_HID_GetDeviceType(&hUsbHostFS) == HID_KEYBOARD)
												{  
														   	k_pinfo = USBH_HID_GetKeybdInfo(&hUsbHostFS);
																 
														 if(k_pinfo!=NULL)
														 {
																char chr = USBH_HID_GetASCIICode(k_pinfo);
															 Usart2_Send_symbol(chr);
															 Usart3_Send_symbol(chr);
															 if(++timer>600000)
									             {
																	//Usart2_Send_String("NO KEY!");
																	Usart3_Send_String("HID OK!");
																 timer=0;
															 }
														 }
														 else
															 {
																if(++timer>600000)
									             {
																	
																	Usart3_Send_String("HID ERR!");
																 timer=0;
															 } 
															 }
														 }
														else
														{
															if(++timer>600000)
									             {
																	//Usart2_Send_String("NO KEY!");
																	Usart3_Send_String("NO KEYBOARD!");
																 timer=0;
															 }
														}
														 
									 
								}

Выдаёт в терминал следующее:

USB Device Attached
PID: c18h
VID: 2a7ah
Address (#1) assigned.
Manufacturer : N/A
Product : U
Serial Number : N/A
Enumeration done.
This device has only 1 configuration.
Default configuration set.
Switching to Interface (#0)
Class    : 3h
SubClass : 1h
Protocol : 1h
KeyBoard device found!
HID class started.
HID ERR!
HID ERR!
HID ERR!
HID ERR!
HID ERR!
HID ERR!
HID ERR!
HID ERR!
HID ERR!

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Получается прикол в том , что не срабатывает условие :

if(fifo_read(&HID_Handle->fifo, &keybd_report_data, HID_Handle->length) ==  HID_Handle->length)

fifo_read()

вот такой он:

/**
  * @brief  fifo_read
  *         Read from FIFO.
  * @param  f: Fifo address
  * @param  buf: read buffer 
  * @param  nbytes: number of item to read
  * @retval number of read items
  */
uint16_t  fifo_read(FIFO_TypeDef * f, void * buf, uint16_t  nbytes)
{
  uint16_t  i;
  uint8_t * p;
  p = (uint8_t*) buf;
  
  if(f->lock == 0)
  {
    f->lock = 1;
    for(i=0; i < nbytes; i++)
    {
      if( f->tail != f->head )
      { 
        *p++ = f->buf[f->tail];  
        f->tail++;  
        if( f->tail == f->size )
        {  
          f->tail = 0;
        }
      } else 
      {
        f->lock = 0;
        return i; 
      }
    }
  }
  f->lock = 0;
  return nbytes;
}

Посмотрев на него - голова у меня уже задымела... :) 

fifo_read() почему то постоянно возвращает "0" ...

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Ну хз, чего там они намутили.

Попробую у себя - отпишусь. usart3 у меня как раз свободен ...

Но сегодня-завтра-послезавтра - не знаю - работа ...

fifo_read - чтение очереди. если оно возвращает 0, значит очередь пуста. а это, в свою очередь, означает, что проц не принял ничего от клавиатуры. Ветка HID_GET_DATA не сработала.

ладно, посмотрю в железке - может и скажу что-то внятное:D

Если можете, подскажите плиз мне куда в вашем кубе воткнуть переключение PA10 на выход и выставление на нём лог 0? Этим у меня на плате подаётся питание на USB гнездо.

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Я понял почему фифо постоянно возвращает "0"

Я написал тестовый вывод переменных в fifo_read() :

if(f->lock == 0)
  {
    f->lock = 1;
    for(i=0; i < nbytes; i++)
    {
      if( f->tail != f->head )
      { 
        *p++ = f->buf[f->tail];  
        f->tail++;  
        if( f->tail == f->size )
        {  
          f->tail = 0;
        }
				if(timer3>600000)timer3=0;
	      if(timer3<9){USBH_UsrLog("else !=   Test i = %d , f->lock = %d ", i, f->lock );}
	      timer3++;
				
      } else 
      {
        
				if(timer2>600000)timer2=0;
	      if(timer2<9){USBH_UsrLog("else ==   Test i = %d , f->lock = %d ", i, f->lock );}
	      timer2++;
				f->lock = 0;
        return i; 
      }
    }
  }

Срабатывает эта строка:

USBH_UsrLog("else ==   Test i = %d , f->lock = %d ", i, f->lock );

Вот так выглядят логи:

System start... 

Program start OK! 

USB Device Attached
PID: c18h
VID: 2a7ah
Address (#1) assigned.
Manufacturer : N/A
Product : U
Serial Number : N/A
Enumeration done.
This device has only 1 configuration.
Default configuration set.
Switching to Interface (#0)
Class    : 3h
SubClass : 1h
Protocol : 1h
KeyBoard device found!
HID class started.
Test nBytes, buf = 8 , 40
else ==   Test i = 0 , f->lock = 1 
Test fifo = 0 == 8
else ==   Test i = 0 , f->lock = 1 
else ==   Test i = 0 , f->lock = 1 
else ==   Test i = 0 , f->lock = 1 
else ==   Test i = 0 , f->lock = 1 
else ==   Test i = 0 , f->lock = 1 
else ==   Test i = 0 , f->lock = 1 
else ==   Test i = 0 , f->lock = 1 
else ==   Test i = 0 , f->lock = 1 
HID ERR!
Test nBytes, buf = 2 , 40
else ==   Test i = 0 , f->lock = 1 
else ==   Test i = 0 , f->lock = 1 
Test fifo = 0 == 2

Теперь ясно почему ноль возвращается :) 

Но не ясно почему так :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...