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