cancel
Showing results for 
Search instead for 
Did you mean: 

446ZE Nucleo USB Host HID Keyboard Not Working ?

Varadharajan V
Associate III

I'm using NUCLEO-446ZE Host to access USB Keyboard

My cubeMx version STM32Cube FW_F4 V1.21.0

I configured all clock and 48Mhz for USB via PLLSAIP

Main core run on 180Mhz

While connecting Keyboard I'm able to detect

While accessing

k_pinfo = USBH_HID_GetKeybdInfo(&hUsbHostFS);

at first the structure return ok and no data

but from seconds cycle the the k_pinfo is always NULL

while debugging I get to know that the fifio head and tail are 0

and

HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData;

HID_Handle->Length = 2 always

Kindly suggest any rectification

My main.c

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "stm32f4xx_hal.h"

#include "usart.h"

#include "usb_host.h"

#include "gpio.h"

/* USER CODE BEGIN Includes */

#include "usbh_hid.h"

#include "usbh_hid_parser.h"

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

void MX_USB_HOST_Process(void);

/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

extern ApplicationTypeDef Appli_state;

extern USBH_HandleTypeDef hUsbHostFS;

HID_KEYBD_Info_TypeDef * k_pinfo;

__IO char c;

__IO uint8_t once = 0;

/* USER CODE END 0 */

/**

 * @brief The application entry point.

 *

 * @retval None

 */

int main(void)

{

 /* USER CODE BEGIN 1 */

 /* USER CODE END 1 */

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

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

 HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */

 SystemClock_Config();

 /* USER CODE BEGIN SysInit */

 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */

 MX_GPIO_Init();

 MX_USART3_UART_Init();

 MX_USB_HOST_Init();

 /* USER CODE BEGIN 2 */

 /* USER CODE END 2 */

 /* Infinite loop */

 /* USER CODE BEGIN WHILE */

 while (1)

 {

 /* USER CODE END WHILE */

  MX_USB_HOST_Process();

 /* USER CODE BEGIN 3 */

if(Appli_state == APPLICATION_READY){

HAL_GPIO_WritePin(GPIOB, LD3_Pin, GPIO_PIN_SET);

USBH_HID_GetPollInterval(&hUsbHostFS);

}

else{

HAL_GPIO_WritePin(GPIOB, LD3_Pin, GPIO_PIN_RESET);

}

if(Appli_state == APPLICATION_READY){

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

//HAL_GPIO_WritePin(GPIOB, LD2_Pin, GPIO_PIN_SET);

k_pinfo = USBH_HID_GetKeybdInfo(&hUsbHostFS);

if(k_pinfo != NULL)

{

c = USBH_HID_GetASCIICode(k_pinfo);

if(c != 0)

{

HAL_GPIO_WritePin(GPIOB, LD2_Pin, GPIO_PIN_SET);

HAL_Delay(10);

HAL_GPIO_WritePin(GPIOB, LD2_Pin, GPIO_PIN_RESET);

}

}

}

else{

HAL_GPIO_WritePin(GPIOB, LD3_Pin, GPIO_PIN_RESET);

}

}

 }

 /* USER CODE END 3 */

}

/**

 * @brief System Clock Configuration

 * @retval None

 */

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct;

 RCC_ClkInitTypeDef RCC_ClkInitStruct;

 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;

  /**Configure the main internal regulator output voltage 

  */

 __HAL_RCC_PWR_CLK_ENABLE();

 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /**Initializes the CPU, AHB and APB busses clocks 

  */

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

 RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

 RCC_OscInitStruct.PLL.PLLM = 4;

 RCC_OscInitStruct.PLL.PLLN = 180;

 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

 RCC_OscInitStruct.PLL.PLLQ = 7;

 RCC_OscInitStruct.PLL.PLLR = 2;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

 {

  _Error_Handler(__FILE__, __LINE__);

 }

  /**Activate the Over-Drive mode 

  */

 if (HAL_PWREx_EnableOverDrive() != HAL_OK)

 {

  _Error_Handler(__FILE__, __LINE__);

 }

  /**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_DIV4;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)

 {

  _Error_Handler(__FILE__, __LINE__);

 }

 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48;

 PeriphClkInitStruct.PLLSAI.PLLSAIM = 4;

 PeriphClkInitStruct.PLLSAI.PLLSAIN = 96;

 PeriphClkInitStruct.PLLSAI.PLLSAIQ = 2;

 PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV4;

 PeriphClkInitStruct.PLLSAIDivQ = 1;

 PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP;

 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)

 {

  _Error_Handler(__FILE__, __LINE__);

 }

  /**Configure the Systick interrupt time 

  */

 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  /**Configure the Systick 

  */

 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 /* SysTick_IRQn interrupt configuration */

 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

/* USER CODE BEGIN 4 */

void USBH_HID_EventCallback(USBH_HandleTypeDef *phost){

HAL_GPIO_WritePin(GPIOB, LD2_Pin, GPIO_PIN_SET);

HAL_Delay(10);

HAL_GPIO_WritePin(GPIOB, LD2_Pin, GPIO_PIN_RESET);

}

/* USER CODE END 4 */

/**

 * @brief This function is executed in case of error occurrence.

 * @param file: The file name as string.

 * @param line: The line in file as a number.

 * @retval None

 */

void _Error_Handler(char *file, int line)

{

 /* USER CODE BEGIN Error_Handler_Debug */

 /* User can add his own implementation to report the HAL error return state */

 while(1)

 {

 }

 /* USER CODE END Error_Handler_Debug */

}

#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,

   tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

 /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

1 REPLY 1
Pavel A.
Evangelist III

Maybe you need the patch posted in the forum on May, 21 before it changed to, er... whatever.

I could not find the post (by Amel N ?) so attaching the patch here.

Apply it to the CubeMX repository for F4, version 4.1.21.0

Regards,

-- pa