Я сам начинающий в электронике, поэтому сразу извиняюсь за возможные некорректные высказывания.
В наличие:
- Отладочная плата 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 структуры не корректно проинициализировалось. Копался- копался в коде- запутался. Далее мысли теряются.
Ваши мысли? Все необходимые документы прикрепил.