Например TDA7294

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

Текущее время: Вс авг 31, 2025 16:54:07

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


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



Начать новую тему Ответить на тему  [ Сообщений: 122 ]     ... , , , 6,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Чт дек 13, 2018 14:31:15 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
У тебя CDC класс. После прохождения енумерации полезные данные ходят через EP1. Принимаемые данные кладутся в прерываниях в приёмный буфер. Передаваемые Записываешь в EP1 c помощью WriteINEP и они сами уходят.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Чт дек 13, 2018 15:04:45 
Открыл глаза

Зарегистрирован: Чт ноя 29, 2018 06:56:04
Сообщений: 55
Рейтинг сообщения: 0
то есть передача в комп идет по прерыванию? чет я честно говоря не понял


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Чт дек 13, 2018 16:38:37 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Нет. По прерыванию приём с компа. В моём примере в этом же прерывании символ передаётся обратно чтобы эхо в терминале было. А так можешь когда хочешь передавать, только проверить что очередь отправки пуста.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пт дек 14, 2018 07:28:47 
Открыл глаза

Зарегистрирован: Чт ноя 29, 2018 06:56:04
Сообщений: 55
Рейтинг сообщения: 0
ну вот, видимо очередь не пустая, хотя через терминал вижу что все пришло, и второй раз не отправляет

Добавлено after 20 minutes 33 seconds:
Get_TX_Q_cnt этой функцией очередь проверять?

Добавлено after 41 minute 48 seconds:
вот такая картина


Вложения:
Безымянный.jpg [213.78 KiB]
Скачиваний: 434
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пт дек 14, 2018 09:37:15 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Там очередь создаётся только если отправляешь данных больше 64 байт. Например, один из дескрипторов 67 байт вроде как. На коротких сообщениях очередь не задействуется.

У тебя как организован обмен? Если запрос-ответ, то не надо ничего проверять, просто пишешь в ep1 с помощью WriteINEP. У тебя так эхо в терминале работает. Без разницы один байт или много ты в ответ будешь посылать. Попробуй для начала не эхо слать, а какое-нибудь слово, типа "Привет!".

Если инициатором обмена является само устройство, то надо проверить в каком состоянии конечная точка (или FIFO не помню) перед отправкой . Это RM надо почитать. Там не сложно должно быть.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пт дек 14, 2018 09:53:41 
Открыл глаза

Зарегистрирован: Чт ноя 29, 2018 06:56:04
Сообщений: 55
Рейтинг сообщения: 0
void USB_CDC::EP1_OUT_Int(void)
{
uint32_t epint = USB_OTG_OUTEP(1)->DOEPINT;

if(epint & USB_OTG_DOEPINT_XFRC)
{
WriteINEP(0x01,buffusb,7);
}

USB_OTG_OUTEP(1)->DOEPINT = epint;
USB_OTG_OUTEP(1)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA);
};

вот процедура, с пк я отсылаю, принимаю и отправляю в ответ "привет", затем вышел в общий цикл, жду, отправляю еще с пк, принимаю ответ, попадаю на процедуру WriteINEP, она вся проходит, но на комп ничего не прилетает


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пт дек 14, 2018 10:21:56 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Давай так. По приёму сообщения от компа в прерывании ставь флаг, что получил данные. А в основном цикле по наличию флага обрабатывай эти данные и отсылай ответ. Не чему там не работать. Эта же функция передаёт данные через ep0 при энумерации, а там они до 67 байт в моём примере.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пт дек 14, 2018 10:42:50 
Открыл глаза

Зарегистрирован: Чт ноя 29, 2018 06:56:04
Сообщений: 55
Рейтинг сообщения: 0
Давай так. По приёму сообщения от компа в прерывании ставь флаг, что получил данные. А в основном цикле по наличию флага обрабатывай эти данные и отсылай ответ. Не чему там не работать. Эта же функция передаёт данные через ep0 при энумерации, а там они до 67 байт в моём примере.




https://dropmefiles.com/DXcw7
(проэкт)

все тоже самое


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пт дек 14, 2018 10:44:55 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Мне сейчас не на чем посмотреть. Может вечером гляну.

Сразу на будущее. Глобальный флаг, который меняется в прерывании, определять только с volatile. Поверь, это сэкономит много времени и нервов в будущем.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Сб дек 15, 2018 08:27:09 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Dimas6262, ты одну лишнюю строчку в USB_CDC::EP1_OUT_Int() раскомментировал. В твоём проекте возиться не буду. Немного свой поправил. Добавил сохранение размера принятых данных и пример обработки принимаемых данных в основном цикле. Пройдись синхронизацией по исходникам - всё увидишь.
Спойлер
Код:
const char hello[] = " Hello! ";
const char bye[] = " Good Bye! ";

int main()
{   
  // IsCommandReceived возвращает кол-во принятых в буфер usb_rx_buf данных
  for(;;)
  {
    if(usb.IsCommandReceived())
    {
      switch(usb_rx_buf[0])
      {
        case 'H':
        case 'h':
          usb.WriteINEP(1,(uint8_t *)hello,sizeof(hello)-1);       
          break;
        case 'G':
        case 'g':
          usb.WriteINEP(1,(uint8_t *)bye,sizeof(bye)-1); 
          break;         
        default:
          usb.WriteINEP(1,usb_rx_buf,1);
      }
      usb.ClearCommandReceived();
    }
  };
}

Работает как-то так
Изображение
Вложение:
333.zip [176.48 KiB]
Скачиваний: 236


СпойлерПройдусь всё же по поводу работы со строками.
1. Зачем ты их так маниакально как unsigned char объявляешь? Классическая Си строка это массив char.
2. Строки, содержимое которых в процессе работы не меняется, определять как const. Они будут лежать себе мирно во flash, а не копироваться в RAM как сейчас.
3. При их объявлении и инициализации не надо указывать размер. Это лишняя работа и источник ошибок. Размер надо указывать только если ты потом будешь менять эту строку и нужно зарезервировать определённый размер для этого.
4. Для определения размера строки, которую ты определил как const char[] можно применять sizeof(). Он будет вычислен на этапе компиляции, а не так как у тебя strlen() в рантайме.
5. Не надо переопределять стандартные функции типа strlen и т.д. Во-первых, достаточно было просто сделать приведение типов, чтобы они заработали. Это в случае (char *) и (unsigned char *) совершенно бесплатно. Во-вторых, в программировании это называется велосипедостроение. Поверь, авторы стандартных библиотек написали эту функцию лучше тебя и даже без ошибок.


Давай, удачи!


Вложения:
Untitled.png [3.86 KiB]
Скачиваний: 820
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пн дек 17, 2018 12:05:58 
Открыл глаза

Зарегистрирован: Чт ноя 29, 2018 06:56:04
Сообщений: 55
Рейтинг сообщения: 0
Dimas6262, ты одну лишнюю строчку в USB_CDC::EP1_OUT_Int() раскомментировал. В твоём проекте возиться не буду. Немного свой поправил. Добавил сохранение размера принятых данных и пример обработки принимаемых данных в основном цикле. Пройдись синхронизацией по исходникам - всё увидишь.
Спойлер
Код:
const char hello[] = " Hello! ";
const char bye[] = " Good Bye! ";

int main()
{   
  // IsCommandReceived возвращает кол-во принятых в буфер usb_rx_buf данных
  for(;;)
  {
    if(usb.IsCommandReceived())
    {
      switch(usb_rx_buf[0])
      {
        case 'H':
        case 'h':
          usb.WriteINEP(1,(uint8_t *)hello,sizeof(hello)-1);       
          break;
        case 'G':
        case 'g':
          usb.WriteINEP(1,(uint8_t *)bye,sizeof(bye)-1); 
          break;         
        default:
          usb.WriteINEP(1,usb_rx_buf,1);
      }
      usb.ClearCommandReceived();
    }
  };
}

Работает как-то так
Изображение
Вложение:
333.zip


СпойлерПройдусь всё же по поводу работы со строками.
1. Зачем ты их так маниакально как unsigned char объявляешь? Классическая Си строка это массив char.
2. Строки, содержимое которых в процессе работы не меняется, определять как const. Они будут лежать себе мирно во flash, а не копироваться в RAM как сейчас.
3. При их объявлении и инициализации не надо указывать размер. Это лишняя работа и источник ошибок. Размер надо указывать только если ты потом будешь менять эту строку и нужно зарезервировать определённый размер для этого.
4. Для определения размера строки, которую ты определил как const char[] можно применять sizeof(). Он будет вычислен на этапе компиляции, а не так как у тебя strlen() в рантайме.
5. Не надо переопределять стандартные функции типа strlen и т.д. Во-первых, достаточно было просто сделать приведение типов, чтобы они заработали. Это в случае (char *) и (unsigned char *) совершенно бесплатно. Во-вторых, в программировании это называется велосипедостроение. Поверь, авторы стандартных библиотек написали эту функцию лучше тебя и даже без ошибок.


Давай, удачи!




все тоже самое даже с твоим кодом


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пн дек 17, 2018 12:31:13 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Тогда не там роешь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Вт дек 25, 2018 07:47:54 
Открыл глаза

Зарегистрирован: Чт ноя 29, 2018 06:56:04
Сообщений: 55
Рейтинг сообщения: 0
Да бред какой то, нигде ничего не написано про такую ерунду, как он так может только один раз отправить пакет любой длины, а потом как будто в очередь становится и даже не принимает


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Вт дек 25, 2018 18:42:42 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Ты ещё не разобрался? Больше недели прошло. Вот смотри, энумерация, судя по всему, у тебя проходит. Энумерация это в основном запросы-ответы: дай мне тот дискриптор, теперь этот, а теперь опять первый и так много раз. В моём примере один из дискрипторов 67 байт, насколько помню. То есть, обмен данными любого размера работает. Передача через ep0 и ep1 осуществляется одной и той же функцией. Не чему там не работать.

Может всё же в кубе натыкать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Ср дек 26, 2018 07:11:47 
Открыл глаза

Зарегистрирован: Чт ноя 29, 2018 06:56:04
Сообщений: 55
Рейтинг сообщения: 0
а там не может быть что нибудь по схемотехнике?

Добавлено after 1 minute 20 seconds:
и после второй передачи порт занят
то есть даже принять не могу

Добавлено after 3 minutes 31 second:
каким образом можно все очереди нулить?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Ср дек 26, 2018 09:47:51 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Какой порт, что значит занят, какие очереди? Давай на одном языке общаться.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Ср дек 26, 2018 09:59:57 
Открыл глаза

Зарегистрирован: Чт ноя 29, 2018 06:56:04
Сообщений: 55
Рейтинг сообщения: 0
Какой порт, что значит занят, какие очереди? Давай на одном языке общаться.



сделал передачу на ПК, прослушиваю как ком порт через Serial Monitor Port, все пришло, затем прерываю связь Serial Monitor Port, делаю 2-ю передачу, пытаюсь подключится в программе, но говорит что порт занят, но по отладчику, мы никуда не прыгаем, то есть комп думает что я ему что то передаю, а сам процессор в это время ничего не делает, не заходит в прерываиние


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Ср дек 26, 2018 11:12:54 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Причём тут микроконтроллер, если ты с маздаиной справиться не можешь...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пт дек 28, 2018 09:44:14 
Открыл глаза

Зарегистрирован: Чт ноя 29, 2018 06:56:04
Сообщений: 55
Рейтинг сообщения: 0
А по подключению к stm32f107 клавиатуры нет ни каких примеров?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32f107 USB VCP
СообщениеДобавлено: Пт дек 28, 2018 10:35:16 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 430
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2539
Рейтинг сообщения: 0
Какой клавиатуры?


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

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


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

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


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

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


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