USB

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: USB

Сообщение bkolbov »

Роман писал(а): 27 фев 2019, 11:54 Кстати, похоже на ошибку: HID_IN_PACKET 4, а размер hid_report_t 1?
HID_IN_PACKET задаёт максимальный размер пакета. Данных может быть и меньше (например, как hid_report_t = 1 байт) - это не ошибка.
urban81
Сообщения: 4
Зарегистрирован: 11 апр 2019, 12:57
Предприятие: АНПП "ТЕМП-АВИА"

Re: Нужна помощь в запуске проекта USB device!

Сообщение urban81 »

Здравствуйте. Есть Ваша плата K1921VK01T рабочее ядро и рабочий проект...Прилаживаю к рабочему проекту Ваш проект с USB device. Он у меня не работает...Кварц на плате 24MHz. Отладку веду j-link. Плату питаю от мини USB (JTAG/SWD). У меня Win10. Драйвер установил. Ожидаю что при подключении к компу плата будет определяться как устройство. С чего начать смотреть и куда лезть? Всем заранее спасибо за помощь!

Вот функция main:

Код: Выделить всё

int main (){

	core::init(QUARTZ);
	hard::initRole();

	auto controller = hard::Controller::Vertical;

	switch (controller) {
		case hard::Controller::Vertical:
			break;
		case hard::Controller::Horizontal:
			hard::initHr();
			break;
		case hard::Controller::Head:
			hard::initHead ();
			break;
	}
	bootflash::init(SYSCLK);

	periph_init();
    SysTick_Config(QUARTZ);

	core::enableInterrupts();

	// Can Enable
    gpio::initOut(gpio::B8);
    gpio::clear(gpio::B8);

	can_a::init(can_a::Baud_1MHz, can_a::Gpio_B3_F2);
	initProtocol (controller);

	BaseBootloaderMsg msg;
	
	while (true){

		can_a::resetErr();

		bool isData = false;

		const auto size_cmd  = can_a::receive(CAN_MB_CMD,&msg, 0);
		uint16_t size_data = 0xffff;
		if(size_cmd == 0xffff){
			size_data = can_a::receive(CAN_MB_DATA_CMD,&msg, 0);
			isData = true;
		}

		if (time > 1000){
			time = 0;
			currentAction = nullptr;
			continue;
		}

		if((size_cmd == 0xffff) and (size_data == 0xffff))
			continue;

		time = 0;

		if ((currentAction == nullptr) and (isData == false)){
			const auto type = BaseBootloaderMsg::Type(msg.m_type);
			currentAction = getCurrentAction(type);
		}

		bool _continue = currentAction (&msg, isData);
		if (not _continue){
			currentAction = nullptr;
		}
	}
}
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: USB

Сообщение bkolbov »

urban81 писал(а): 28 ноя 2019, 13:28 Здравствуйте. Есть Ваша плата K1921VK01T рабочее ядро и рабочий проект...Прилаживаю к рабочему проекту Ваш проект с USB device. Он у меня не работает...Кварц на плате 24MHz. Отладку веду j-link. Плату питаю от мини USB (JTAG/SWD). У меня Win10. Драйвер установил. Ожидаю что при подключении к компу плата будет определяться как устройство. С чего начать смотреть и куда лезть? Всем заранее спасибо за помощь!

Вот функция main:
Добрый день!

Возможно вам поможет вот это обсуждение - здесь есть про Win10.
urban81
Сообщения: 4
Зарегистрирован: 11 апр 2019, 12:57
Предприятие: АНПП "ТЕМП-АВИА"

Re: USB

Сообщение urban81 »

Здравствуйте. Спасибо за помощь ! Прочитал. Исправил. Но все равно не работает. Вот настройки ядра. Нужна помощь. Всем заранее спасибо.

Код: Выделить всё

void core::init(uint32_t quartz)
{
	DINT;
	core::quartz = quartz;
	NT_BOOTFLASH->T_ACC = 6;			//Задержка от установки адреса, до считывания данных из флеш-памяти (в транзакциях чтения)
	NT_USERFLASH->T_ACC = 6;
	//Настройка частоты тактирования
	//выходная частота равна FOUT = (FIN * NF) / ( NR * NO), где FIN - частота кварца
	NT_COMMON_REG->PLL_OD = 2;//2;		//Выходной делитель PLL NO=2
	NT_COMMON_REG->PLL_NR = 1;			//Опорный делитель PLL NR=R_PLL+2=3
	if(core::quartz==24000000ul)
		NT_COMMON_REG->PLL_NR = 4;			//Опорный делитель PLL NR=R_PLL+2=3

	uint32_t pll_nf = ((SYSCLK*12)/core::quartz)-2;

	NT_COMMON_REG->PLL_NF = pll_nf;		//Делитель обратной связи PLL NF=F_PLL+2=50


	//FOUT = 24 * ( 48 + 2 ) / ( ( 4 + 2 ) * 2 ) = 100 МГц, вроде сходится
	do
	{
		//Выбор источника синхросигнала
		NT_COMMON_REG->SYS_CLK = SYSCLK_REFCLK;		//Выбор источника зависит от состояния сигнала на входе микроконтроллера CPE_pad: 0 - Блок POR, 1 - Вход микроконтроллера XI_OSC
		NT_COMMON_REG->SYS_CLK = SYSCLK_PLLCLK;		//Блок PLL
		for(int i = 0; i < 50; i++);
	}
	while (NT_COMMON_REG->SYS_CLK_bit.CURR_SRC != SYSCLK_PLLCLK);	//Текущий источник тактирования должен совпадать с выбранным

	// Разрешение работы периферии
	NT_COMMON_REG->APB_CLK = 0x7FFFF | 0x1000000 | 0x80000;

	for (int i = 0; i < 100; i++){//чтобы типа прошло время... пускай там порезетится
		NT_COMMON_REG->PER_RST0=0;
		NT_COMMON_REG->PER_RST1=0;
	}

	NT_COMMON_REG->PER_RST0 = 0xFFFFFFFF;
	NT_COMMON_REG->PER_RST1 = 0xFFFFFFFF;
	NT_COMMON_REG->GPIODEN0 = 0xFFFFFFFF;
	NT_COMMON_REG->GPIODEN1 = 0xFFFFFFFF;
	NT_COMMON_REG->GPIODEN2 = 0xFFFFFFFF;
	NT_COMMON_REG->GPIODEN3 = 0xFFFFFFFF;

	// Настройка тактирования АЦП (12 МГц)
	NT_COMMON_REG->ADC_CTRL0 = 0x07070707;
	NT_COMMON_REG->ADC_CTRL1 = 0x07070707;
	NT_COMMON_REG->ADC_CTRL2 = 0x07070707;

	NT_COMMON_REG->UART_SPI_CLK_SEL = 0x00000000;

	SCB->VTOR = (uint32_t)(&__isr_vector);

	Энвик_SetPriority(IRQn(USBOTG_IRQn+1),4);


	//EINT;

}

Код: Выделить всё

void core::usbInit()
{
    NT_COMMON_REG->USB_CTRL = (1 << COMMON_REG_USB_CTRL_FSEL_Pos) |  // 24 MHz
                              (1 << COMMON_REG_USB_CTRL_CLKEN_Pos) | // clk en
                              (1 << COMMON_REG_USB_CTRL_CLKSEL_Pos); // xtal
    NT_COMMON_REG->PER_RST0_bit.USBPHYRST = 1; // clear reset from usb phy
    for (int i=0;i<10000;i++) {
        __NOP();
    }
}

Код: Выделить всё

int main (){

	core::init(QUARTZ);
	hard::initRole();

	auto controller = hard::Controller::Vertical;

	switch (controller) {
		case hard::Controller::Vertical:
	
			break;
		case hard::Controller::Horizontal:
			hard::initHr();
			break;
		case hard::Controller::Head:
			hard::initHead ();
			break;
	}


	bootflash::init(SYSCLK); // делать инициализацию bootflash только если бутлоадер будет использоваться в режиме бутлоадера

	core::enableInterrupts();

	// Leed Enable
    gpio::initOut(gpio::C8);

	// Can Enable
    gpio::initOut(gpio::B8);
    gpio::clear(gpio::B8);

	can_a::init(can_a::Baud_1MHz, can_a::Gpio_B3_F2);
	initProtocol (controller);

	BaseBootloaderMsg msg;

	core::waitTimer(2, 1 * core::TIME_10mSec);

	core::usbInit();

	USBDev_Init();
	USBDev_ClassCbInit(&USBDEV_CDC_VCP_cb);
	USBOTG_SetRole(USB_Role_Device);

	VCP_RxHandlerInit(&VCP_RxHandler);
	VCP_TxHandlerInit(&VCP_TxHandler);

	usb_irq_en();


	while (true){

		gpio::toggle(gpio::C8);

		can_a::resetErr();

		bool isData = false;

		const auto size_cmd  = can_a::receive(CAN_MB_CMD,&msg, 0);
		uint16_t size_data = 0xffff;
		if(size_cmd == 0xffff){
			size_data = can_a::receive(CAN_MB_DATA_CMD,&msg, 0);
			isData = true;
		}

		if (time > 1000){
			time = 0;
			currentAction = nullptr;
			continue;
		}

		if((size_cmd == 0xffff) and (size_data == 0xffff))
			continue;

		time = 0;

		if ((currentAction == nullptr) and (isData == false)){
			const auto type = BaseBootloaderMsg::Type(msg.m_type);
			currentAction = getCurrentAction(type);
		}

		bool _continue = currentAction (&msg, isData);
		if (not _continue){
			currentAction = nullptr;
		}
	}
}
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: USB

Сообщение bkolbov »

urban81 писал(а): 23 дек 2019, 10:04 Здравствуйте. Спасибо за помощь ! Прочитал. Исправил. Но все равно не работает. Вот настройки ядра. Нужна помощь. Всем заранее спасибо.
Добрый день!

Код на первый взгляд вполне адекватный.

Расскажите, пожалуйста, подробнее какая у вас и плата и как она запитана (там выше упоминался мини USB - но его нет на нашей плате).
При подключении как реагирует ОС? Что отображается в диспетчере устройств? Есть возможность проверить на другой ОС (Win7, Linux)?
urban81
Сообщения: 4
Зарегистрирован: 11 апр 2019, 12:57
Предприятие: АНПП "ТЕМП-АВИА"

Re: USB

Сообщение urban81 »

Здравствуйте. Здравствуйте. У меня модуль разработчика МВS-K1921BK01T ( ООО "НПФ Мехатроника - Про"). Питание от мини юзб встроенного отладчика jtag/swd. Заливаю во Flash. Потом сброс питания и ...Всем заранее спасибо за помощь.
urban81
Сообщения: 4
Зарегистрирован: 11 апр 2019, 12:57
Предприятие: АНПП "ТЕМП-АВИА"

Re: USB

Сообщение urban81 »

bkolbov писал(а): 24 дек 2019, 08:47 Сброс питания и ... ?
Здравствуйте. Спасибо за помощь. ...И пробую подключать. Драйвер пока не установлен. Диспетчер открыт и там нет реакции никакой на подключение платы. Плата запитана через jtag c помощью блока питания.
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: USB

Сообщение bkolbov »

У нас, к сожалению, нет платы от Мехатроники, поэтому проверить сами ничего не сможем.
Какую ревизию платы используете?

И еще, пробовали зашивать наш тестовый проект (с единственной адаптацией под 24 МГц кварц)?
https://bitbucket.org/niietcm4/k1921vkx ... b_cdc_vcp/
Sur0vy
Сообщения: 1
Зарегистрирован: 30 окт 2020, 18:06
Предприятие: -

Re: USB

Сообщение Sur0vy »

Доброго всем дня.

Подскажите, пожалуйста вот в чем.
Пытаюсь запустить проект "usb_cdc_vcp" с bitbucketa, откорректировав код под 24 МГц. Отладочная плата LDM-Helper-к1921вк01т rev 1.04. Win 10 устройство определил, данные плата принимает с компа, но не отправляет, падает в HardFault где-то тут

Код: Выделить всё

if (VCP_CDC_DataTransmitted != NULL)
                VCP_CDC_DataTransmitted();
насколько я могу судить по задумке авторов тут должна вызываться функция:

Код: Выделить всё

void VCP_RxHandler(void)
{
    if (VCP_IsRxBufEmpty() == 0) {
        VCP_PutChar(VCP_GetChar());
    }
}
В чем проблема?
Ответить

Вернуться в «32-разрядные микроконтроллеры»