HID_IN_PACKET задаёт максимальный размер пакета. Данных может быть и меньше (например, как hid_report_t = 1 байт) - это не ошибка.
USB
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
Re: USB
Re: Нужна помощь в запуске проекта USB device!
Здравствуйте. Есть Ваша плата K1921VK01T рабочее ядро и рабочий проект...Прилаживаю к рабочему проекту Ваш проект с USB device. Он у меня не работает...Кварц на плате 24MHz. Отладку веду j-link. Плату питаю от мини USB (JTAG/SWD). У меня Win10. Драйвер установил. Ожидаю что при подключении к компу плата будет определяться как устройство. С чего начать смотреть и куда лезть? Всем заранее спасибо за помощь!
Вот функция main:
Вот функция 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;
}
}
}
Re: USB
Добрый день!urban81 писал(а): ↑28 ноя 2019, 13:28 Здравствуйте. Есть Ваша плата K1921VK01T рабочее ядро и рабочий проект...Прилаживаю к рабочему проекту Ваш проект с USB device. Он у меня не работает...Кварц на плате 24MHz. Отладку веду j-link. Плату питаю от мини USB (JTAG/SWD). У меня Win10. Драйвер установил. Ожидаю что при подключении к компу плата будет определяться как устройство. С чего начать смотреть и куда лезть? Всем заранее спасибо за помощь!
Вот функция main:
Возможно вам поможет вот это обсуждение - здесь есть про Win10.
Re: USB
Здравствуйте. Спасибо за помощь ! Прочитал. Исправил. Но все равно не работает. Вот настройки ядра. Нужна помощь. Всем заранее спасибо.
Код: Выделить всё
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;
}
}
}
Re: USB
Добрый день!
Код на первый взгляд вполне адекватный.
Расскажите, пожалуйста, подробнее какая у вас и плата и как она запитана (там выше упоминался мини USB - но его нет на нашей плате).
При подключении как реагирует ОС? Что отображается в диспетчере устройств? Есть возможность проверить на другой ОС (Win7, Linux)?
Re: USB
Здравствуйте. Здравствуйте. У меня модуль разработчика МВS-K1921BK01T ( ООО "НПФ Мехатроника - Про"). Питание от мини юзб встроенного отладчика jtag/swd. Заливаю во Flash. Потом сброс питания и ...Всем заранее спасибо за помощь.
Re: USB
У нас, к сожалению, нет платы от Мехатроники, поэтому проверить сами ничего не сможем.
Какую ревизию платы используете?
И еще, пробовали зашивать наш тестовый проект (с единственной адаптацией под 24 МГц кварц)?
https://bitbucket.org/niietcm4/k1921vkx ... b_cdc_vcp/
Какую ревизию платы используете?
И еще, пробовали зашивать наш тестовый проект (с единственной адаптацией под 24 МГц кварц)?
https://bitbucket.org/niietcm4/k1921vkx ... b_cdc_vcp/
Re: USB
Доброго всем дня.
Подскажите, пожалуйста вот в чем.
Пытаюсь запустить проект "usb_cdc_vcp" с bitbucketa, откорректировав код под 24 МГц. Отладочная плата LDM-Helper-к1921вк01т rev 1.04. Win 10 устройство определил, данные плата принимает с компа, но не отправляет, падает в HardFault где-то тут
насколько я могу судить по задумке авторов тут должна вызываться функция:
В чем проблема?
Подскажите, пожалуйста вот в чем.
Пытаюсь запустить проект "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());
}
}