Например TDA7294

Форум РадиоКот • Просмотр темы - STM32 и USB (практика)
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт апр 19, 2024 01:01:58

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


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



Начать новую тему Ответить на тему  [ Сообщений: 583 ]     ... , , , 12, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср апр 19, 2017 15:53:38 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пн июн 14, 2010 17:09:55
Сообщений: 44
Откуда: Москва
Рейтинг сообщения: 0
Я думаю это NAK-ответ от МК. Узкий импульс может быть следствием плохого контакта. Ведь на второй линии все ок. А там сигналы вроде как в противофазе идут.


Вложения:
NAK.jpg [162.3 KiB]
Скачиваний: 764
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Чт май 04, 2017 08:55:04 
Родился

Зарегистрирован: Чт май 04, 2017 07:36:01
Сообщений: 1
Рейтинг сообщения: 0
Всем привет.
Сразу извеняюсь за ошибки.
NAC это пакет квитации. А конец пакета это два такта .
После энумерации. Host начинает работат. Как часто он будет опршивать конечные точки это записано в дескрипторы.
Дапустим ENP1 IN это данные для Host . Если в дескрипторе 0 то каждом кадре будет обращение к эндпонту.
Но тут есть одна интересная вещь. Эсть два ПИДа DATA0 DATA1.
После Reset все 0. STM32 там тоже DTOG_TX=0 это DATA0. А Host запрашывает DATA1. Конешно ответ NAC. В следующем фреме тоже повторитьса.
Но у вас есть даные которые надо атправит Hostу. Запишыте даные в ENP1 IN буферь и количество. Даные подготовленые можно послать. Это просто изменяем значение DTOG_TX=1. Даные ушли . При получении ACK значить всё хорошо. А при NAC Host в следующем фреме повторит запрос DATA1. А ACK следующий запрос будеть DATA0. Но STM32 стоит 1 это DATA1 значить на запросы ответить NAC. И так будеть продожатса долго. Но у STM32 есть даные которые надо отправить. Данные в буфер счёчик и DTOG_TX=0. И всё :)) :)) :)) :)) :))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс июн 25, 2017 22:48:55 
Держит паяльник хвостом
Аватар пользователя

Зарегистрирован: Сб янв 16, 2010 15:34:57
Сообщений: 920
Откуда: Sevsk/Moscow
Рейтинг сообщения: 0
Вечер добрый. Возникла проблема с STM32F042 HID:
1)при первом включении девайса к ПК пишет "запуск этого устройства невозможен (код 10)". При перетыке данная
ошибка больше не повторяется в принципе. Удаление устройства из системы к повторению ошибки не приводит.
В чем может быть причина такого поведения? Копать дескрипторы?

_________________
:idea:


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн июн 26, 2017 11:51:11 
Встал на лапы

Зарегистрирован: Пн июн 13, 2016 10:41:52
Сообщений: 129
Рейтинг сообщения: 0
Вечер добрый. Возникла проблема с STM32F042 HID:
1)при первом включении девайса к ПК пишет "запуск этого устройства невозможен (код 10)". При перетыке данная
ошибка больше не повторяется в принципе. Удаление устройства из системы к повторению ошибки не приводит.
В чем может быть причина такого поведения? Копать дескрипторы?


Скорее всего дело в них. Или в линии USB. Хотя у меня была как-то проблема. Но писал он, что устройство неопознанно. Но это был косяк с Windows. Бывало такое, но очень редко.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб сен 02, 2017 18:22:02 
Говорящий с текстолитом
Аватар пользователя

Карма: 33
Рейтинг сообщений: 148
Зарегистрирован: Вс июн 24, 2012 16:07:00
Сообщений: 1572
Откуда: Лен.Обл.
Рейтинг сообщения: 0
Подключаю по USB-Host (без класса) тепловизор FlirOne Gen 2 к STM32F4Discovery. Устройство через раз находится, энумерация проходит, интерфейсы определяются, но данные не приходят. Делал по аналогии с этой статьёй. Проект создавал в CubeMX.

Собственно, вот основа проекта:
Спойлер
Код:
#include "main.h"
#include "stm32f4xx_hal.h"
#include "usb_host.h"
#include "usb_host.h"
#include "usbh_core.h"
#include "ST7735S.h"

//размер буфера приема данных
#define RECEIVE_BUFFER_SIZE 512UL

extern USBH_HandleTypeDef hUsbHostFS;//дескриптор подключения
extern ApplicationTypeDef ApplicationState;//состояние приложения

uint8_t ReceiveBuffer[RECEIVE_BUFFER_SIZE];//буфер приема данных
uint8_t DevicePipe[3];//каналы для приема данных

void RCC_Init(void);
void GPIO_Init(void);
void SPI_Init(void);

void USBH_UserProcess(USBH_HandleTypeDef *phost,uint8_t id);//обработчик событий
long USB_HOST_ControlTransfer(USBH_HandleTypeDef *hUsbHost,uint8_t request_type,uint8_t bRequest,uint16_t wValue,uint16_t wIndex,uint8_t *data,uint16_t wLength);//передать управляющее сообщение
long USB_HOST_Receive(USBH_HandleTypeDef *hUsbHost,uint8_t in_pipe,uint8_t *buffer);//прием данных


//----------
//локальный обработчик ошибок
//----------
void ErrorHandler(void)
{
 while(1)
 {
 }
}
//----------
//глобальный обработчик ошибок
//----------
void _Error_Handler(char * file,int line)
{
 ErrorHandler();
}
//----------
//инициализация GPIO
//----------
void GPIO_Init(void)
{
 //включаем тактирование портов 
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOH_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();
 
 //GPIO_Pin – номера выводов, которые конфигурируются. Пример для нескольких выводов:
 //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
 //GPIO_Speed – задает скорость для выбранных выводов.
 //GPIO_Mode – задает режим работы выводов. Может принимать следующие значения:

 //настраиваем параметры порта D
 GPIO_InitTypeDef LED_GPIO_Init;
 LED_GPIO_Init.Mode=GPIO_MODE_OUTPUT_PP;
 LED_GPIO_Init.Pull=GPIO_NOPULL;
 LED_GPIO_Init.Pin=GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
 LED_GPIO_Init.Speed=GPIO_SPEED_HIGH;
 HAL_GPIO_Init(GPIOD,&LED_GPIO_Init);
}
//----------
//инициализация SPI
//----------
void SPI_Init(void)
{
 SPI_HandleTypeDef hspi1; 
 
 hspi1.Instance=SPI1;
 hspi1.Init.Mode=SPI_MODE_MASTER;
 hspi1.Init.Direction=SPI_DIRECTION_2LINES;
 hspi1.Init.DataSize=SPI_DATASIZE_8BIT;
 hspi1.Init.CLKPolarity=SPI_POLARITY_LOW;
 hspi1.Init.CLKPhase=SPI_PHASE_1EDGE;
 hspi1.Init.NSS=SPI_NSS_SOFT;
 hspi1.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2;
 hspi1.Init.FirstBit=SPI_FIRSTBIT_MSB;
 hspi1.Init.TIMode=SPI_TIMODE_DISABLE;
 hspi1.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;
 hspi1.Init.CRCPolynomial=10;
 if (HAL_SPI_Init(&hspi1)!=HAL_OK) ErrorHandler();
}
//----------
//инициализация тактового генератора
//----------
void RCC_Init(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct;
 RCC_ClkInitTypeDef RCC_ClkInitStruct;
 __HAL_RCC_PWR_CLK_ENABLE();
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
 
 RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSE;
 RCC_OscInitStruct.HSEState=RCC_HSE_ON;
 RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_HSE;
 RCC_OscInitStruct.PLL.PLLM=4;
 RCC_OscInitStruct.PLL.PLLN=168;
 RCC_OscInitStruct.PLL.PLLP=RCC_PLLP_DIV2;
 RCC_OscInitStruct.PLL.PLLQ=7;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!=HAL_OK) ErrorHandler();
 
 RCC_ClkInitStruct.ClockType=RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider=RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV4;
 RCC_ClkInitStruct.APB2CLKDivider=RCC_HCLK_DIV2;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_5)!=HAL_OK) ErrorHandler();
 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
}


//----------
//передать управляющее сообщение
//----------
long USB_HOST_ControlTransfer(USBH_HandleTypeDef *hUsbHost,uint8_t request_type,uint8_t bRequest,uint16_t wValue,uint16_t wIndex,uint8_t *data,uint16_t wLength)
{
 hUsbHost->Control.setup.b.bmRequestType=request_type;
 hUsbHost->Control.setup.b.bRequest=bRequest;
 hUsbHost->Control.setup.b.wValue.w=wValue;
 hUsbHost->Control.setup.b.wIndex.w=wIndex;
 hUsbHost->Control.setup.b.wLength.w=wLength;   
 USBH_StatusTypeDef status=USBH_BUSY;
 while(1)
 {
  status=USBH_CtlReq(hUsbHost,data,wLength);
  if (status==USBH_BUSY) continue;
  break;
 }
 if (status!=USBH_OK)
 {
  hUsbHost->RequestState=CMD_SEND;
  return(0);
 } 
 return(wLength);
}

//----------
//прием данных
//----------
long USB_HOST_Receive(USBH_HandleTypeDef *hUsbHost,uint8_t in_pipe,uint8_t *buffer)
{
 USBH_URBStateTypeDef URB_Status=USBH_URB_IDLE;
 long length=0;
 USBH_BulkReceiveData(hUsbHost,buffer,RECEIVE_BUFFER_SIZE,in_pipe);
 URB_Status=USBH_LL_GetURBState(hUsbHost,in_pipe);
 if(URB_Status==USBH_URB_DONE)
 {
  length=USBH_LL_GetLastXferSize(hUsbHost,in_pipe);
  char str[20];
  sprintf(str,"Data:%i",length);
  ST7735S_Print(str,ST7735S_YELLOW);
  return(length);   
 }
 return(0);
}

//----------
//обработка USB
//----------
void USB_HOST_Processing(void)
{
 //состояния программы 
 typedef enum
 {
  MODE_WAIT,
  MODE_GET_MANUFACTURER,
  MODE_GET_PRODUCT,
  MODE_INIT_PIPE,
  MODE_CONTROL_TRANSFER_STOP_I2,
  MODE_CONTROL_TRANSFER_STOP_I1,
  MODE_CONTROL_TRANSFER_START_I1,
  MODE_CONTROL_TRANSFER_START_I2,   
  MODE_RECEIVE,
  MODE_PAUSE,
  MODE_STOP
 } MODE;
 static long state_pos=0;
 //последовательность инициализации
 static MODE state[]=
 {
  MODE_WAIT,
  MODE_GET_MANUFACTURER,
  MODE_GET_PRODUCT,
  MODE_INIT_PIPE,
  MODE_CONTROL_TRANSFER_STOP_I2,
  MODE_PAUSE,
  MODE_CONTROL_TRANSFER_STOP_I1,
  MODE_PAUSE,
  MODE_CONTROL_TRANSFER_START_I1,
  MODE_PAUSE,
  MODE_CONTROL_TRANSFER_START_I2,
  MODE_PAUSE,
  MODE_RECEIVE,
  MODE_STOP   
 };
 
 USBH_Process(&hUsbHostFS);   
   
 /* 
      USBH_UsrLog("PID: %xh", hUsbHostFS.device.DevDesc.idProduct ); 
      USBH_UsrLog("VID: %xh", hUsbHostFS.device.DevDesc.idVendor );   
  */
 
 
 USBH_StatusTypeDef status;
 
 if (hUsbHostFS.gState==HOST_DEV_DISCONNECTED || ApplicationState==APPLICATION_DISCONNECT)//устройство отключено
 {
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12|GPIO_PIN_13,GPIO_PIN_RESET); //отключаем светодиоды
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_RESET); //отключаем светодиоды
  state_pos=0;
 }
 
 if (hUsbHostFS.gState==HOST_CHECK_CLASS)//определение класса устройства
 {
  MODE mode=state[state_pos];
   
  //начало подключения   
  if (mode==MODE_WAIT)
  {
   
   //if (USBH_SetCfg(&hUsbHostFS,3)==USBH_OK)
   {
    //USBH_SelectInterface(&hUsbHostFS,0);
/*    ST7735S_Clear();     
    char str[100];
    long interface=USBH_MAX_NUM_INTERFACES;//hUsbHostFS.device.CfgDesc.bNumInterfaces;
    for(long n=0;n<interface;n++)
    {
     long ep=hUsbHostFS.device.CfgDesc.Itf_Desc[n].bNumEndpoints;
     //long i=hUsbHostFS.device.CfgDesc.Itf_Desc[n].bInterfaceNumber;
     sprintf(str,"Interface:%i EP:%i",n,ep);
     ST7735S_Print(str,ST7735S_YELLOW);
     for(long m=0;m<ep;m++)
     {
      long addr=hUsbHostFS.device.CfgDesc.Itf_Desc[n].Ep_Desc[m].bEndpointAddress;   
      long size=hUsbHostFS.device.CfgDesc.Itf_Desc[n].Ep_Desc[m].wMaxPacketSize;
      long attr=hUsbHostFS.device.CfgDesc.Itf_Desc[n].Ep_Desc[m].bmAttributes;
      sprintf(str,"EP:%02x S:%i A:%02x",addr,size,attr);
      ST7735S_Print(str,ST7735S_YELLOW);
     }
     HAL_Delay(10000);
     ST7735S_Clear();
   
    }
    HAL_Delay(10000);
    HAL_Delay(10000);
    HAL_Delay(10000); 
*/   
    state_pos++;
   }
   return;
  }   
  //запрос производителя
  if (mode==MODE_GET_MANUFACTURER)
  {
   HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET);//включаем светодиоды
   status=USBH_Get_StringDesc(&hUsbHostFS,hUsbHostFS.device.DevDesc.iManufacturer,ReceiveBuffer,64);
   if (status==USBH_OK)
   {
    ST7735S_Print((char*)ReceiveBuffer,ST7735S_YELLOW);
    //HAL_Delay(1000);
    state_pos++;
   }
   return;
  }
  //запрос модели
  if (mode==MODE_GET_PRODUCT)
  {   
   HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET);//включаем светодиоды     
   status=USBH_Get_StringDesc(&hUsbHostFS,hUsbHostFS.device.DevDesc.iProduct,ReceiveBuffer,64);
   if (status==USBH_OK)
   {
    ST7735S_Print((char*)ReceiveBuffer,ST7735S_YELLOW);     
    //HAL_Delay(1000);
    state_pos++;
   }
   return;
  }
  //инициализация каналов
  if (mode==MODE_INIT_PIPE)
  {   
   HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET);//включаем светодиоды
   //создаем каналы для конечных точек
   uint8_t end_point[3];
   end_point[0]=0x81;
   end_point[1]=0x83;
   end_point[2]=0x85;
   bool ok[3];
   ok[0]=false;
   ok[1]=false;
   ok[2]=false;
   bool error=false;
   for(long n=0;n<3;n++)
   {
    DevicePipe[n]=USBH_AllocPipe(&hUsbHostFS,end_point[n]);   
    status=USBH_OpenPipe(&hUsbHostFS,DevicePipe[n],end_point[n],hUsbHostFS.device.address,hUsbHostFS.device.speed,USB_EP_TYPE_BULK,USBH_MAX_DATA_BUFFER);
    if (status==USBH_OK) ok[n]=true;
                    else error=true;
   }
   if (error==true)
   {
    for(long n=0;n<3;n++)
    {
     if  (ok[n]==true)  USBH_ClosePipe(&hUsbHostFS,DevicePipe[n]);
     USBH_FreePipe(&hUsbHostFS,DevicePipe[n]);
    }
    return;
   }
   char str[20];
   for(long n=0;n<3;n++)
   {
    sprintf(str,"Pipe:0x%02x=0x%02x",end_point[n],DevicePipe[n]);
    ST7735S_Print(str,ST7735S_YELLOW);       
   }
   state_pos++;
   return;
  } 
   /* Flir config
   01 0b 01 00 01 00 00 00 c4 d5
   0 bmRequestType = 01
   1 bRequest = 0b
   2 wValue 0001 type (H) index (L)    stop=0/start=1 (Alternate Setting)
   4 wIndex 01                         interface 1/2
   5 wLength 00
   6 Data 00 00
   */
  //передача управляющих сообщений
  if (mode==MODE_CONTROL_TRANSFER_STOP_I2)
  {   
   //передаём команду на остановку интерфейса 2     
   USBH_SetInterface(&hUsbHostFS,2,0);
   //USB_HOST_ControlTransfer(&hUsbHostFS,USB_H2D|USB_REQ_RECIPIENT_INTERFACE|USB_REQ_TYPE_STANDARD,USB_REQ_SET_INTERFACE,0x00,0x02,ReceiveBuffer,0);
   state_pos++;
   return;
  } 
  //передача управляющих сообщений
  if (mode==MODE_CONTROL_TRANSFER_STOP_I1)
  {   
   //передаём команду на остановку интерфейса 1
   USBH_SetInterface(&hUsbHostFS,1,0);
   //USB_HOST_ControlTransfer(&hUsbHostFS,USB_H2D|USB_REQ_RECIPIENT_INTERFACE|USB_REQ_TYPE_STANDARD,USB_REQ_SET_INTERFACE,0x00,0x01,ReceiveBuffer,0);
   state_pos++;
   return;
  }
  //передача управляющих сообщений
  if (mode==MODE_CONTROL_TRANSFER_START_I1)
  {   
   //передаём команду на включение интерфейса 1
   USBH_SetInterface(&hUsbHostFS,1,1);   
   //USB_HOST_ControlTransfer(&hUsbHostFS,USB_H2D|USB_REQ_RECIPIENT_INTERFACE|USB_REQ_TYPE_STANDARD,USB_REQ_SET_INTERFACE,0x01,0x01,ReceiveBuffer,0);
   state_pos++;
   return;
  }
  //передача управляющих сообщений
  if (mode==MODE_CONTROL_TRANSFER_START_I2)
  {   
   //передаём команду на включение интерфейса 2
   USBH_SetInterface(&hUsbHostFS,2,1);   
   //USB_HOST_ControlTransfer(&hUsbHostFS,USB_H2D|USB_REQ_RECIPIENT_INTERFACE|USB_REQ_TYPE_STANDARD,USB_REQ_SET_INTERFACE,0x01,0x02,ReceiveBuffer,0);
   state_pos++;
   return;
  } 
  //пауза
  if (mode==MODE_PAUSE)
  {
   HAL_Delay(1);
   state_pos++;   
  }
  //прием даннын со всех конечных точек
  if (mode==MODE_RECEIVE)
  {
   HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_SET);//включаем светодиоды   
   long size=0;   
   size=USB_HOST_Receive(&hUsbHostFS,DevicePipe[0],ReceiveBuffer);   
   if (size>0)
   {
    ST7735S_Print("Data0!",ST7735S_YELLOW);
   }
   size=USB_HOST_Receive(&hUsbHostFS,DevicePipe[1],ReceiveBuffer);
   if (size>0)
   {
    ST7735S_Print("Data1!",ST7735S_YELLOW);     
   }   
   size=USB_HOST_Receive(&hUsbHostFS,DevicePipe[2],ReceiveBuffer);
   if (size>0)
   {
    ST7735S_Print("Data2!",ST7735S_YELLOW);     
   }
  }
 }
}

//----------
//главная функция программы
//----------
int main(void)
{
 HAL_Init();
 RCC_Init();
 GPIO_Init();
 SPI_Init();
 USB_HOST_Init();
 ST7735S_Init();
 ST7735S_Clear();
 while (1)
 {
  USB_HOST_Processing();
 }
}


Данный тепловизор я успешно запускал по USB и в Linux, и в Windows и в QNX - т.е. протокол обмена точно верный.
Вот что ему нужно послать как управляющее сообщение:
Код:
   /* Flir config
   01 0b 01 00 01 00 00 00
   0 bmRequestType = 01
   1 bRequest = 0b
   2 wValue 0001 type (H) index (L)    stop=0/start=1 (Alternate Setting)
   4 wIndex 01                         interface 1/2
   5 wLength 00
   6 Data 00 00
   */


Сначала нужно остановить интерфейсы 1 и 2, а потом включить. И всё. Но не отвечает совсем по USB. USBH_LL_GetURBState возвращает USBH_URB_IDLE - я так понимаю, данные не принимаются.
Может быть, кто-нибудь знает, что я сделал неверно?

_________________
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн сен 04, 2017 18:47:24 
Говорящий с текстолитом
Аватар пользователя

Карма: 33
Рейтинг сообщений: 148
Зарегистрирован: Вс июн 24, 2012 16:07:00
Сообщений: 1572
Откуда: Лен.Обл.
Рейтинг сообщения: 0
Смотрю, что устройство присылает в дескрипторе интерфейса STM32F: у конечных точек wMaxPacketSize=64. Но они типа Bulk и в линуксе устройство отвечает так ( lsusb -vvv ):

Цитата:
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 240
bInterfaceProtocol 1
iInterface 6 com.flir.rosebud.fileio
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x04 EP 4 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 1



Почему же тепловизор сообщает STM32F, что у него 64 байта размер передачи? Может, это USBH при инициализации чего-то передал тепловизору, что тот решил сократить размер конечной точки? Возможно ли такое? Я использую USB-Full Speed. Пробовал с LOW_SPEED (1.5 МБ/с) и HEIGHT_SPEED (12 МБ/с). Результат одинаковый. Там действительно приходит 64 байта для любой конечной точки.
Кстати, кто-нибудь знает, после SetInterface на интерфейс не содержащий конечных точек и обратно нужно заново делать USBH_OpenPipe? В библиотеке внутри постоянно делается USBH_OpenPipe - но... зачем? Ну и ещё одна странность - bAlternateSetting=0 у интерфейсов 1 и 2 есть по две конечные точки. При bAlternateSetting=1 точек нет ( там задан 0). Но тепловизор запускается как раз по командам SetInterface с bAlternateSetting=0, а потом bAlternateSetting=1. То есть, переключением в интерфейсы БЕЗ конечных точек! Почему тогда он работает в операционках? Или этот номер условный и bAlternateSetting=1 может выбирать интерфейс с конечными точками?

_________________
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт сен 05, 2017 10:53:29 
Мучитель микросхем

Карма: 11
Рейтинг сообщений: 35
Зарегистрирован: Ср окт 15, 2008 09:33:03
Сообщений: 475
Откуда: Воронеж
Рейтинг сообщения: 0
на вопрос почему сначала с конечными точками, а потом без них могу сделать предположение, что сначала устанавливается нормальная конфигурация, потом ей шлются настроечные параметры, а потом переключаемся в конфигурацию без конечных точек что бы не потреблять трафика. Когда устройство реально включится снова произойдет переключение в нормальную конфигурацию. Примерно так работает аудиокарта. Там в нормальной конфигурации опрашиваются диапазоны громкости и потом устанавливается 0 громкость. Потом происходит переключение в конфигурацию без конечных точек.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт сен 05, 2017 11:10:31 
Говорящий с текстолитом
Аватар пользователя

Карма: 33
Рейтинг сообщений: 148
Зарегистрирован: Вс июн 24, 2012 16:07:00
Сообщений: 1572
Откуда: Лен.Обл.
Рейтинг сообщения: 0
Спасибо за идею! Интересная мысль. Я обнаружил, что запрос к конечной точке GET_STATUS не проходит для конечных точек как раз настраиваемых интерфейсов (с возможностью отключения конечных точек) - ошибка "не поддерживается". Но после выполнения переключения интерфейсов в вариант без конечных точек запрос проходит. То есть, конечные точки оживают. Но не хотят ничего передавать - они должны непрерывно передавать. Запросы GET_INTERFACE (в котором можно было бы узнать, как сконфигурирован интерфейс) к настраиваемым интерфейсам, к сожалению, не проходит - ответ usb-модуля контроллера также "не поддерживается". Я посмотрел дескриптор конфигурации побайтно - там на самом деле максимальный размер пакета для всех конечных точек задан в 64 байта. А должно быть 512 (кроме точек для управления). Операционки сообщают именно о 512 байтах. Я не понимаю, как такое возможно? :roll: И подозреваю, что в этом размере всё дело - тепловизор отказывается передавать данные с таким размером передачи.

Всё, данные пошли. :))) Оказывается, при задании конечной точки в OpenPipe нужно указать точный размер канала, который прислал тепловизор. Я заменил на 64 и данные пошли.

_________________
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср сен 06, 2017 19:55:33 
Говорящий с текстолитом
Аватар пользователя

Карма: 33
Рейтинг сообщений: 148
Зарегистрирован: Вс июн 24, 2012 16:07:00
Сообщений: 1572
Откуда: Лен.Обл.
Рейтинг сообщения: 0
Мне объяснили, в чём дело. :) У Full Speed и ниже устройств максимальный размер буфера 64 байта. А у High Speed 512. Вот поэтому и такой маленький буфер.
Кстати, может кто знает ответы на следующие вопросы?

1) Если частота опроса 1 кГц, а за раз передаётся 64 байта, то за секунду можно передать с одного устройства всего 6400 байт? Но это ведь не так — иначе тепловизор бы нифига не работал бы с USB 1.0 и LOW_SPEED на PC.
2) Что такое USBD и чем оно отличается от USBH? Я так понимаю, USBD более высокий уровень и использует USBH?
3) Правильно ли я понимаю, что USB у STM32F4 требует непрерывного вызова функции USBH_Process? То есть, если с этим вызовом помедлить, то USB отвалится?
4) Правильно ли я понимаю, что USBH_BulkReceiveData работает в фоне с помощью этого самого USBH_Process? То есть, если USBH_Process не взывать, то USBH_BulkReceiveData не будет работать? Дело в том, что у меня USBH_BulkReceiveData при буфере отличным от 64, мягко говоря, работает от случая к случаю (но чаще не работает вовсе). Да даже при буфере в 64 точки приходит 35, 40, 63 и подобное количество байт. Но тепловизор, я знаю, фигачит не переставая. Куда же делись эти данные?
5) Можно ли как-то ускорить опрос устройства (опрашивать не 1 кГц, а чаще)?

Спасибо.

_________________
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб сен 09, 2017 19:34:24 
Встал на лапы

Зарегистрирован: Ср мар 22, 2017 09:52:52
Сообщений: 130
Рейтинг сообщения: 0
Добрый день, знатоки stm32!
Если не затруднит, поделитесь пожалуйста рабочим примером работы с USB флешкой с использованием FatFs (на Keil или CooCox).
Интересует именно с использованием SPL, а не CUBE.
МК - stm32f407zet6.
На кубе получилось запустить, пробовал создать файл, писать в него, читать, всё работает.
В примерах на SPL, которых удалось найти, или функции файловой системы не работают или вообще не компилируется проект.
Спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб сен 09, 2017 19:58:38 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
SPL CooCox, SPL можно даже легко подчистить - там практически только работа с портами через SPL. В Keil портируется.
http://mikrocontroller.bplaced.net/word ... ge_id=1333


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб сен 09, 2017 21:48:37 
Встал на лапы

Зарегистрирован: Ср мар 22, 2017 09:52:52
Сообщений: 130
Рейтинг сообщения: 0
Находил именно этот же пример, но на сайте "Паяльник" http://cxem.net/mc/mc366.php
И там он был абсолютно нерабочий!
Этот же превосходно работает.
Огромное спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн сен 11, 2017 17:26:49 
Встал на лапы

Зарегистрирован: Ср мар 22, 2017 09:52:52
Сообщений: 130
Рейтинг сообщения: 0
Однако, рано я обрадовался.
При попытке портировать в Keil uVision5 перестало работать.
В режиме отладки функция UB_USB_MSC_HOST_Do() в цикле всегда возвращает статус USB_MSC_DEV_DETACHED
Настройка тактирования и в Keil и в CooCox одинаковая (функция SystemInit() ).
В чём может быть причина?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб сен 16, 2017 07:41:32 
Встал на лапы

Зарегистрирован: Ср мар 22, 2017 09:52:52
Сообщений: 130
Рейтинг сообщения: 0
Проблема всё ещё актуальна. Никто не поможет?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб сен 16, 2017 08:50:54 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
для F401 тест портированый, вроде работал, железка "уехала" - проверить не могу
Вложение:
USBHostDemoF401.zip [379.98 KiB]
Скачиваний: 278


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб сен 16, 2017 15:44:42 
Встал на лапы

Зарегистрирован: Ср мар 22, 2017 09:52:52
Сообщений: 130
Рейтинг сообщения: 0
Разобрался.
Оказалось всё дело в уровне оптимизации проекта. У меня изначально был 0 и поэтому ничего не работало (странно, почему так?).
Поставил Level 1 и заработало.
Я раньше думал, что уровень оптимизации это какой-то мифический, мало на что влияющий (по крайней мере на аппаратную часть) параметр в Keil. По умолчанию, при создании проекта всегда 0 и никогда не менял его.

Добавлено after 3 hours 5 minutes 17 seconds:
oleg110592, в вашем примере системная частота 84MHz, а хотелось бы на максимальной работать.
Если делаю 168MHz, USB перестаёт работать. Причём частоту тактирования шины USB оставляю 48MHz.
Файл system_stm32f4xx.c создаю с помощью STM32F4xx_Clock_Configuration_V1.1.0.xls


Вложения:
Комментарий к файлу: С такими настройками USB не работает
system_stm32f4xx.c [21.46 KiB]
Скачиваний: 614
Комментарий к файлу: А с такими работает
system_stm32f4xx.c [21.47 KiB]
Скачиваний: 363
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс сен 17, 2017 06:52:29 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
у меня 84 максимум микроконтроллера, а если настройки как куб советует сделать:
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс сен 17, 2017 09:13:15 
Говорящий с текстолитом
Аватар пользователя

Карма: 33
Рейтинг сообщений: 148
Зарегистрирован: Вс июн 24, 2012 16:07:00
Сообщений: 1572
Откуда: Лен.Обл.
Рейтинг сообщения: 0
Цитата:
Оказалось всё дело в уровне оптимизации проекта. У меня изначально был 0 и поэтому ничего не работало (странно, почему так?).
Поставил Level 1 и заработало.


А у вас отладочная (debug) информация включена в проект или нет? USB не тот интерфейс, чтобы его можно было отлаживать по шагам в дебаггере. А включение отладочной информации замедляет работу программы. Возможно, при оптимизации O1 и выше вся отладочная информация из проекта выбрасывается и он начинает работать.

_________________
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс сен 17, 2017 09:37:29 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
Много раз запускал проекты с USB под отладкой и все нормально работало.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс сен 17, 2017 11:00:46 
Говорящий с текстолитом
Аватар пользователя

Карма: 33
Рейтинг сообщений: 148
Зарегистрирован: Вс июн 24, 2012 16:07:00
Сообщений: 1572
Откуда: Лен.Обл.
Рейтинг сообщения: 0
Это вы просто не попадали на места с жёстко заданным таймаутом:

Цитата:
USB-совместимый хост предполагает, что все запросы будут обработаны в пределах максимального периода 5 секунд. Также определены более строгие лимиты времени для определенных запросов:

Standard Device request (стандартный запрос к устройству) без стадии данных должен быть завершен в течение 50 мс.
Standard Device request со стадией данных должен начать передавать данные не позже чем через 500 мс после запроса.
Каждый пакет данных должен быть отправлен в течение 500 мс после успешного завершения передачи предыдущего пакета. Стадия состояния должна быть завершена в течение 50 мс после передачи последнего пакета данных.
Команда SetAddress (которая содержит фазу данных) должна быть обработана и вернуть статус в течение 50 мс. Устройство тогда имеет 2 мс, чтобы изменить адрес прежде, чем будет послан следующий запрос.

Эти периоды времени ожидания являются весьма приемлемыми для даже самого медленного из устройств, но могут быть ограничением во время отладки. Невозможно обеспечить 50 мс для многих отладочных символов, отправляемых на скорости 9600 bps через асинхронный последовательный порт, или во внутрисхемных отладчиках/эмуляторах при выполнении программы по шагам или при остановке по точке останова для просмотра внутренних регистров и переменных. Поэтому USB требует специальной техники отладки в отличие от других проектов на микроконтроллерах.

http://microsin.net/programming/arm-wor ... part2.html

_________________
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos


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

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


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

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


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

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


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