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