Взял пример usb драйвера для str9 virtual com port чтобы на основе него сделать свой драйвер для STR912FAW44.
Немного допилив его удалось сделать так, чтобы usb определялся как неизвестное устройство (раньше и этого не было).
Однако дальше процесс не идет (прикрепил скриншот программного анализатора на ПК).
Т.е. нет запросов GET_STATUS (0x00), GET_DESCRIPTOR (0x06) и т.д.
Вот кратко мой код (большая часть кода которая была для uart я удалил или закомментировал, т.к. он мне пока не нужен):
CODE
//1) Инициализация периферии и тактового генератора
SCU_MCLKSourceConfig(SCU_MCLK_OSC);
SCU_AHBPeriphClockConfig(__VIC, ENABLE);
SCU_AHBPeriphReset(__VIC, DISABLE);
/*USB clock = MCLK= 48MHz*/
SCU_USBCLKConfig(SCU_USBCLK_MCLK2);
SCU_AHBPeriphClockConfig(__USB48M, ENABLE);
/*Enable USB clock*/
SCU_AHBPeriphClockConfig(__USB, ENABLE);
SCU_AHBPeriphReset(__USB, DISABLE);
//2) Настраиваем ножку port2 pin7 (USBCLK) на выход:
SCU->GPIOOUT[0x02] = 0x4000;
// 3) Настройка прерывания по умолчанию:
VIC_DeInit();
VIC_InitDefaultVectors();
//4) Настройка прерывания для usb:
void USB_Interrupts_Config(void)
{
VIC_Config(USBLP_ITLine, VIC_IRQ, 3);
VIC_ITCmd(USBLP_ITLine, ENABLE);
}
Обработчик прерывания USB_Istr() в файле usb_istr.c срабатывает, чтобы запустился код на обработку
запросов должна сработать вот эта вот ветка:
Код
#if (IMR_MSK & ISTR_CTR)
if (wIstr & ISTR_CTR & wInterrupt_Mask)
{
/* servicing of the endpoint correct transfer interrupt */
/* clear of the CTR flag into the sub */
CTR_LP();
Т.е. бит CTR в регистре USB_ISTR говорящей об успешности транзакции должен сработать. Однако этого почему-то не происходит.
(Приложил к сообщению свой проект,
проект делал в keil находиться по пути "um0290\str91x demos\Virtual Com Port\project\RVMDK"
).
Подскажите пожалуйста в чем может быть проблема ? Как правильно произвести инициализацию ?
Сообщение отредактировал IgorKossak - Jan 19 2017, 09:25
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!
Эскизы прикрепленных изображений