Например TDA7294

Форум РадиоКот • Просмотр темы - STM32x9I-EVAL + GPS-приемник
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн июл 28, 2025 01:53:11

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: STM32x9I-EVAL + GPS-приемник
СообщениеДобавлено: Ср июн 15, 2016 16:05:54 
Родился

Зарегистрирован: Ср июн 15, 2016 15:22:15
Сообщений: 2
Рейтинг сообщения: 0
Я сам начинающий в электронике, поэтому сразу извиняюсь за возможные некорректные высказывания.

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

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


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y