Проблема с библиотекой Adafruit tinyusb на rp2040

Всем привет. Я решил переписать один свой хорошо отработанный на других MCU проект на rp2040. В проекте используется обмен с хостом по USB-CDC. Так как PICO-IDE для меня очень сложная и малопонятная, я решил попробовать адаптировать проект к среде Arduino. Установит библиотеку Adafruit TinyUsb и адаптировал пример CDC/serial_echo под свои нужды:

#include "Adafruit_TinyUSB.h"
#include "pico/multicore.h"

#define PC_PORT       Serial

//Global integers
uint8_t exchange[280];
uint8_t rx_counter = 0;
uint8_t full_buff = 0;
uint8_t packet_size = 0;
volatile uint8_t nxt = 0;

void setup() 
{
  pinMode(MWCS_PIN, OUTPUT);
  pinMode(PGDO_PIN, OUTPUT);
  pinMode(PGDI_PIN, INPUT);
  pinMode(PGC_PIN, OUTPUT);

  PC_PORT.begin(115200);
  PC_PORT.setTimeout(100);

  //Запускаем обработку потока на втором ядре
  multicore_launch_core1(core1_usb_reciever);
}

void loop() 
{
    if(full_buff)
    {
        deassemble_frame();
        full_buff = 0;
    }
}

//Приём пакетов от USB на втором ядре
void core1_usb_reciever()
{
  uint16_t toread = 0;

    while(true)
    {
      toread = PC_PORT.available();
      if(toread) 
      {
          for(uint16_t i = 0; i < toread; i++) exchange[rx_counter + i] = PC_PORT.read(); 
          rx_counter += toread;
          toread = 0;
		      if(rx_counter >= 3) packet_size = exchange[1];
		      if((packet_size > 0) && (rx_counter == packet_size + 3))
		      {
			        rx_counter = 0;
			        packet_size = 0;
			        if(exchange[2] == 0x3D) {nxt = 1; return;}
			        full_buff = 1;
		      }
      }
    }
}

Принцип работы программы следующий: хост отправляет пакет в COM порт, устройство разбирает пакет (в данном случае в отдельном потоке на втором ядре), а затем обрабатывает пакет в функции deassemble_frame() и отправляет ответный пакет обратно в COM порт.
Суть моей проблемы в том, что при отправки даже простых текстовых сообщений они видны только во встроенном мониторе порта Arduino ide, а в моих программах на C# или Qt нет. Даже в программе "Terminal 1.9" сообщения не приходят, хотя COM порт открывается без ошибок. Но если в программе "Terminal 1.9" при подключенном COM порте поменять скорость порта, данные начинают приходить. А если после этого не отключая usb запустить мою программу на C# или Qt то данные также начинают приходить и отправляться, но до следующего отключения usb.
А если при подключенном COM порте выставить скорость порта 1200 или 2400, то usb rp2040 отключается от COM порта и переходит на встроенный DFU загрузчик.
Также есть ещё одна проблема с отправкой данных: после отправки хосту приблизительно 256 байт подряд rp2040 зависает. Даже если после каждой отправки применять функцию flush().
В чём может быть проблема? Как отличается работа монитора порта Arduino ide от других подобных программ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.