Я сам начинающий в электронике, поэтому сразу извиняюсь за возможные некорректные высказывания.
В наличие:
- Отладочная плата 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.c инициализирована структура
Первая функция при работе с хостом это , которая вызывается из usb_host.c. В файле usbh_core.c находится ее реализация. Эта функция заполняет некоторые поля структуры hUsbHostHS. (USBH_HandleTypeDef * phost = & hUsbHostHS).
А так же эта функция инициализирует драйвера хоста HAL_HCD_Init();
Далее функция , которая связывает драйвера класса CDC (Communucation Device Class) c хостом.(USBH_ClassTypeDef * pclass=& USBH_CDC_CLASS;)
Далее функция которая запускает работу хоста с помощью функции HAL_HCD_Start().
Так же есть функция ,в которой предлагается прописать пользовательский код. Что писать я не знаю!!! Подскажите! Может в этом дело...
Далее в бесконечном цикле вызывается функция , в которой используется оператор выбора 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».
Не выполняется вот это условие
Вывожу в лог значения:
Получаем: "User: 2 ff"
Прихожу к выводу что в процессе работы поле device структуры не корректно проинициализировалось. Копался- копался в коде- запутался. Далее мысли теряются.
Ваши мысли? Все необходимые документы прикрепил.
В наличие:
- Отладочная плата 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;
Код: Выделить всё
USBH_HandleTypeDef hUsbHostHS; Код: Выделить всё
USBH_Init(&hUsbHostHS, USBH_UserProcess, HOST_HS);Код: Выделить всё
phost->id = id;
phost->pUser = pUsrFunc;
phost->pData = &hhcd_USB_OTG_HS;Далее функция
Код: Выделить всё
USBH_RegisterClass(&hUsbHostHS, USBH_CDC_CLASS);Код: Выделить всё
phost->pClass[phost->ClassNumber++] = pclass;Код: Выделить всё
USBH_Start(&hUsbHostHS);Так же есть функция
Код: Выделить всё
USBH_LL_DriverVBUS()Далее в бесконечном цикле вызывается функция
Код: Выделить всё
USBH_Process(&hUsbHostHS)- 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);Прихожу к выводу что в процессе работы поле device структуры не корректно проинициализировалось. Копался- копался в коде- запутался. Далее мысли теряются.
Ваши мысли? Все необходимые документы прикрепил.