2016-10-09 1 views
0

J'ai essayé de mettre en place une communication usb de base avec une souris USB en utilisant mon stm32f4 discvery. il n'y a pas d'exemples USB pour mon conseil d'administration alors je suis allé voir d'autres conseils.stm32cube, hôte USB, caché souris/clavier

La bibliothèque Cube de stm a été conçue pour un développement facile et j'ai donc généré un projet avec un cube comprenant USB_OTG_FS en mode hôte seulement et quatre broches IO pour les LED. Je jetais un coup d'oeil dans les fichiers et il semblait que la lecture des boutons de la souris serait assez triviale, mais je ne peux pas le faire fonctionner. si je lance

devtype = USBH_HID_GetDeviceType(&hUsbHostFS); 

détecte l'appareil correctement.

USBH_HID_MouseInit(&hUsbHostFS) 

retourne USBH_OK, mais peu importe ce que j'essaie

mouse=USBH_HID_GetMouseInfo(&hUsbHostFS); 

est toujours NULL

"USBH_HID_MouseInit" est jamais mentionné dans la documentation (DM00105256.pdf) aussi, seule la Les exemples RTOS les utilisent. En lisant l'exemple autonome de l'hôte USB, il semblerait que communiquer avec une souris serait aussi simple que d'exécuter GetDeviceType, et interroger GetMouseInfo, mais je n'arrive pas à le faire fonctionner.

c'est tout le code que j'ajouté, il est exécuté dans la principale tandis que

if(Appli_state == APPLICATION_READY){ 
    switch(state) 
    { 
    case 0: 

      devtype = USBH_HID_GetDeviceType(&hUsbHostFS); 
      if(devtype == HID_MOUSE){ 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,1); 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,0); 
       state=1; 
      } 
      else if(devtype == HID_KEYBOARD){ 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,0); 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,1); 
       state=2; 
      } 
      else{ 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,0); 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,0); 
      } 

    break; 

    case 1: 
     if(USBH_HID_MouseInit(&hUsbHostFS)==0){ 
      HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,1); 
      state=3; 
     } 
     else { 
      HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,0); 
      state=0; 
     } 

    break; 

    case 3: 
     mouse=USBH_HID_GetMouseInfo(&hUsbHostFS); 
     if(mouse != NULL)HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,1); 
     else HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,0); 

    break; 

    default: 
     break; 
    } 
    } 
    if(Appli_state != APPLICATION_READY) state=0; 

reste du code est inchangé. comme je l'ai dit avant qu'il détecte la connexion et si c'est une souris, un clavier ou un périphérique inconnu très bien. Je n'arrive pas à l'obtenir pour communiquer

Répondre

0

Le Cube est buggé, codé d'une manière étrange, et pas bien documenté.

Selon la carte réelle que vous avez, vous devez vous assurer que les horloges sont correctement configurés (en system_stm32f4.c)

Avec la version basée sur stm32f407 (http://www.st.com/en/evaluation-tools/stm32f4discovery.html), vous devez utiliser les paramètres suivants:

HSE = 8000000 
PLL_M = 8 
PLL_Q = 7 
PLL_N = 336 
PLL_P = 4 

L'USB OTG FS nécessite une horloge 48 MHz. Voici les équations:

USB OTG FS, SDIO and RNG Clock = PLL_VCO/PLLQ 
PLL_VCO = (HSE_VALUE/PLL_M) * PLL_N