artos5

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

34 сообщения в этой теме

artos5    283

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

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

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

Тут лежит полный проект : 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);
								}
  
}

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

Поделиться сообщением


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Lexter    100
3 часа назад, artos5 сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283

Значит так:

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

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

есть функция 

 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);

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189

Привет :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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283

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

Отладочная инфа не идёт на 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');
}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189

Привет :D

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

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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283

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

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

Значит так:

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

А вот :

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

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

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

 

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

if(USBH_HID_KeybdDecode(phost) == USBH_OK)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283

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

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

/**
  ******************************************************************************
  * 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 ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283
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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189
1 час назад, artos5 сказал:

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

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

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

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

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

 

Цитата

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


if(USBH_HID_KeybdDecode(phost) == USBH_OK)

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

 

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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283
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.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283

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

	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' в юарт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283
10 часов назад, hd44780 сказал:

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

KeyBoard device found!
HID class started.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189

Посмотрел кубовый 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189

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

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

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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283
22 часа назад, hd44780 сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189
3 часа назад, artos5 сказал:

А вообще запутанный код пипец... 

Это с непривычки :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283
В 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!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283

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

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" ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189

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

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

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

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

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

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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    283

Я понял почему фифо постоянно возвращает "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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189

а выпихните плиз в уарт, что он пихает в очередь в ветке  case HID_POLL:

Поделиться сообщением


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

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

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Сообщения

    • Были бы попки, а то задницы повыкладывали. Некрасиво.
    • Большинство главредов, все-таки, люди адекватные - как-никак, интеллегенция. Публиковался пару раз в одном из тематических журналов, так с меня потребовали скан рукописной расписки - мол, "осознаю свою ответственность в случае нарушения авторских прав, в случае плагиата виновным считать меня"! Интересно, а ДМК, БХВ, Солон-Р, НиТ и прочие - берут с Кошака такие расписки?   Ну, а судя по переписке Гения с редакциями, тут мы уже не афериста и не плагиатора имеем, имхо. Тут про сам сабж впору писать "учебник крепкий"  Потому как рассматриваемая личность, похоже что, типичный "адаптированный психопат": тут мы имеем очень многие признаки. Мегаломания, графомания, склонность к авантюризму, сниженная (мягко говоря) самокритика и неспособность признавать свои ошибки (даже очевидные), манипуляторство, резонерство, стремление состоять во множестве общественных организаций, иметь контакты со знаменитыми людьми (если верить его ВК, то он общался с президентом Финляндии, например); также он считает себя человеком многосторнне развитым, способным к успеху в практически любой сфере, и совесть его, по всей видимости, не мучает никогда... Очень смахивает на "личностное расстройство"... В психиатрии даже термин такой есть - "синдром Хлестакова", наблюдается как раз у авантюрных психопатов. Хотя, чему тут удивляться - человек Чечню прошел, вот и привело к "паталогическому заострению преморбидных черт личности"... Но это - только мое предположение. Синдром Хлестакова
    • Это железяка с частотника трехфазного для 5кВт двигателя.  Списывали, я забрал. Жаль что один пока. 
    • SUNON DP203A , напряжения и токи такие же , лет пять работал в дымоходе .  В чип-дипе недорого. Из защитных решений - реле превышения напряжения и подключение вентилятора  в этом случае через дополнительный  резистор  .
    • Есть возможность изготовить корпус из 2 мм сплава алюминия, который очень легко сверлится и поддается механической обработке ( не вязкий, как чистый алюминий). Корпус получается очень лёгким, также может использоваться в качестве радиатора для отвода тепла. На фото один из вариантов корпуса для мощного усилителя D-класса.
      А тут есть видео:

      Возможна нарезка по вашим размерам, листы не новые, поэтому цены очень доступные .