STM32x9I-EVAL + GPS-приемник

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
medved333
Родился
Сообщения: 2
Зарегистрирован: Ср июн 15, 2016 15:22:15

STM32x9I-EVAL + GPS-приемник

Сообщение medved333 »

Я сам начинающий в электронике, поэтому сразу извиняюсь за возможные некорректные высказывания.

В наличие:
- Отладочная плата stm324x9i_eval на контроллере stm32F439 NIH 6U TFBGA 216
- GPS-приемник GlobalSat BU-353 GLONASS.

Задача: Отобразить текущее координаты местоположения GPS-приемник. Сохранить в памяти контроллера, вывести на экран или в терминал ПК – не важно, не в этом проблема.
Прошу помочь. Просто не работает. Ниже постараюсь подробно описать ход моих действий, попытаемся вместе найти причины.

После подключения к ПК (после установки драйверов) GPS-приемник определяется системой как виртуальный COM порт.
Изображение

Для сформирования каркаса кода из HAL библиотек использую CubeMX. После выбора контроллера, во вкладке pinout (в группе Peripherals) выбираю используемую переферию:
- USB_OTG_HS
- - External Phy [Host_ Only]
Изображение
- RCC
- - High Speed Clock [Cristal/ Ceramic Resonator]
В группе MiddleWares:
- USB_ HOST
- - Class for HS IP [Communication Host Class (Virtual Port Com) ]
Изображение

Во вкладке Clock Configuration выставляю значение 48 МГц на шине, на которой находится USB устройство.
Изображение

Далее генерирую код под Keil 5, выставив необходимые значения для Heap и Stack. На форуме STM приводилась конкретная цифра, не помню точно, 2000 хватает для корректной работы.

Смотрим код.

В файле usbh_def.h объявлена структура для работы USB хоста.

Код: Выделить всё

/* USB Host handle structure */
typedef struct _USBH_HandleTypeDef
{
  __IO HOST_StateTypeDef     gState;       /*  Host State Machine Value */
  ENUM_StateTypeDef     EnumState;    /* Enumeration state Machine */
  CMD_StateTypeDef      RequestState;       
  USBH_CtrlTypeDef      Control;
  USBH_DeviceTypeDef    device;
  USBH_ClassTypeDef*    pClass[USBH_MAX_NUM_SUPPORTED_CLASS];
  USBH_ClassTypeDef*    pActiveClass;
  uint32_t              ClassNumber;
  uint32_t              Pipes[15];
  __IO uint32_t         Timer;
  uint8_t               id;  
  void*                 pData;                  
  void                 (* pUser )(struct _USBH_HandleTypeDef *pHandle, uint8_t id);
  
#if (USBH_USE_OS == 1)
  osMessageQId          os_event;   
  osThreadId            thread; 
#endif  
  
} USBH_HandleTypeDef;
 
В файле usb_host.c инициализирована структура

Код: Выделить всё

 USBH_HandleTypeDef hUsbHostHS; 
Первая функция при работе с хостом это

Код: Выделить всё

 USBH_Init(&hUsbHostHS, USBH_UserProcess, HOST_HS);
, которая вызывается из usb_host.c. В файле usbh_core.c находится ее реализация. Эта функция заполняет некоторые поля структуры hUsbHostHS. (USBH_HandleTypeDef * phost = & hUsbHostHS).

Код: Выделить всё

phost->id = id;
phost->pUser = pUsrFunc;
phost->pData = &hhcd_USB_OTG_HS;
А так же эта функция инициализирует драйвера хоста HAL_HCD_Init();

Далее функция

Код: Выделить всё

USBH_RegisterClass(&hUsbHostHS, USBH_CDC_CLASS);
, которая связывает драйвера класса CDC (Communucation Device Class) c хостом.(USBH_ClassTypeDef * pclass=& USBH_CDC_CLASS;)

Код: Выделить всё

phost->pClass[phost->ClassNumber++] = pclass;
Далее функция

Код: Выделить всё

USBH_Start(&hUsbHostHS);
которая запускает работу хоста с помощью функции HAL_HCD_Start().
Так же есть функция

Код: Выделить всё

USBH_LL_DriverVBUS()
,в которой предлагается прописать пользовательский код. Что писать я не знаю!!! Подскажите! Может в этом дело...

Далее в бесконечном цикле вызывается функция

Код: Выделить всё

USBH_Process(&hUsbHostHS)
, в которой используется оператор выбора switch. Значение переменной phost->gState указанной в условии switch сравнивается со значениями case:

- HOST_IDLE
- HOST_DEV_WAIT_FOR_ATTACHMENT
- HOST_DEV_ATTACHED
- HOST_ENUMERATION
- HOST_INPUT
- HOST_SET_CONFIGURATION
- HOST_CHECK_CLASS
- HOST_CLASS_REQUEST
- HOST_ABORT_STATE
- HOST_CLASS
- HOST_DEV_DISCONNECTED
- HOST_ABORT_STATE

Через UART выбрасываю на ПК информацию из usb log. Вот что получилось.
Изображение
Загвоздка на месте, где выскакивает лог «No registered class for this device».

Код: Выделить всё

 case HOST_CHECK_CLASS:
    
    if(phost->ClassNumber == 0)
    {
      USBH_UsrLog ("No Class has been registered.");
    }
    else
    {
      phost->pActiveClass = NULL;
      
      for (idx = 0; idx < USBH_MAX_NUM_SUPPORTED_CLASS ; idx ++)
      {
							
	USBH_UsrLog("User: %x %x", phost->pClass[idx]->ClassCode, phost->device.CfgDesc.Itf_Desc[0].bInterfaceClass);
				
        if(phost->pClass[idx]->ClassCode == phost->device.CfgDesc.Itf_Desc[0].bInterfaceClass)
        {
          phost->pActiveClass = phost->pClass[idx];
        }
      }
      
      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);
        }
      }
      else
      {
        phost->gState  = HOST_ABORT_STATE;
        USBH_UsrLog ("No registered class for this device.");
      }
    
Не выполняется вот это условие

Код: Выделить всё

if(phost->pClass[idx]->ClassCode == phost->device.CfgDesc.Itf_Desc[0].bInterfaceClass)
Вывожу в лог значения:

Код: Выделить всё

USBH_UsrLog("User: %x %x", phost->pClass[idx]->ClassCode, phost->device.CfgDesc.Itf_Desc[0].bInterfaceClass);
Получаем: "User: 2 ff"

Прихожу к выводу что в процессе работы поле device структуры не корректно проинициализировалось. Копался- копался в коде- запутался. Далее мысли теряются.

Ваши мысли? Все необходимые документы прикрепил.
Реклама
Ответить

Вернуться в «ARM»