Делаю всё по описанию - включаю изохронную точку на выход, указываю максимальную длину пакета и начальное значение счётчика, затем записываю данные в буфер и вызываю команду проверки буфера, после которой при первом прерывании фрейма этот буфер улетает в ПК. Для индикации прерываний фреймов задействовал одну ножку и на осциллографе наблюдаю импульсы через каждую миллисекунда с точностью до микросекунд, т.е. тактирование настроено правильно.
Код
#include "iolpc1778.h"
#include "LPC17xx.h"
unsigned int i;
void main(void)
{
{ //INIT
SCS |= 0x20; //подключение осциллятора
while(!(SCS&0x40)){} //ожидание запуска
//Настройка тактирования ЦПУ
PLL0CON |= 0x01; //включение PLL0
PLL0CFG |= 0x09; //умножение частоты на 10
PLL0FEED = 0xAA; //разрешение
PLL0FEED = 0x55; //изменений
CCLKSEL |= 0x100; //переключение источника тактирования
//настройка тактирования USB
PLL1CON |= 0x01; //Включение PLL1
PLL1CFG |= 0x03; //Умножаем частоту на 4 (12МГц*4=48МГц)
PLL1FEED = 0xAA; //разрешение
PLL1FEED = 0x55; //изменений
USBCLKSEL = 0x201; //Тактирование USB от PLL1 и частота тактирования 48МГц
IOCON_P1_25 = 0; //PIO
FIO1DIR = 0x2000000; //Выход PIN1_25 для индикации прерывания
{ //init USB
PCONP |= 0x80000000; //включение питания USB
USBCLKCTRL |= 0x12; //устанавливаем флаги DEV_CLK_EN + AHB_CLK_EN
while(!(USBCLKST & 0x12)){}//ждём установки флагов
USBCLKCTRL |= 8; //устанавливаем флаг доступа к регистру выбора конфигурации функции порта
while(!(USBCLKST & 0x08)){}//ждём установки флага
USBPORTSEL = 3; //U2 - ведомый
USBCLKCTRL &=~8; //сброс флага доступа
IOCON_P0_31 = 1; //функция ножк U2D+, на U2D- других функций нет
IOCON_P0_14 = 0; //USBCONNECT - управление подтягивающим резистором
FIO0DIR |= 0x4000; //bit 14 - OUT
USBDEVINTEN = 0x01; //разрешение прерываний FRAME
}
PCLKSEL = 1; //тактирование переферии 1:1
CLKSRCSEL |= 1; //тактирование CPU от PLL0
AIRCR = 0x05FA0200; //настройка
IP1 = 0x00000800; //и разрешение
NVIC_EnableIRQ(USB_IRQn); //прерываний
}
while(1)
{
FIO0SET |= 0x4000; //1.5 kOm
USBREEP |= 0x80; //задействована изохронная точка 7 (IN)
while(!(USBDEVINTST & 0x100)){} //ждём установки флага EP_RLZED
for(i=0; i<0x2FFFFFF; i++ )
{
__NOP();
} //небольшая пауза для пропуска запроса от windows
USBTXPLEN = 40; //начальное значение счётчика байтов в пакете
USBEPIN = 7; //индекс конечной точки
USBMAXPSIZE = 40; //максимальный размер пакета для указанной конечной точки
while(!(USBDEVINTST & 0x100)){} //ждём установки флага EP_RLZED
USBCMDCODE = 0x0500 + 0x070000; //выбор конечной точик
USBCTRL = 0x2 + 0xC; //WP_EN = 1, LOG_ENDPOINT = 3;
TDATA = 0x12345678;
TDATA = 0x91011121;
TDATA = 0x31415161;
TDATA = 0x71819202;
TDATA = 0x12223248;
TDATA = 0x12345678;
TDATA = 0x12345678;
TDATA = 0x12345678;
TDATA = 0x12345678;
TDATA = 0x98765432; //после этой команды сбрасывается WP_EN
USBCMDCODE = 0x0500 + 0xFA0000; //команда + проверка буфера
for(i=0; i<0x8FFFFFF; i++ ){__NOP(); }
FIO0CLR |= 0x4000; //отключение резистора 1.5 кОм
for(;;){}
}
}
void USB_IRQHandler (void)
{
USBDEVINTCLR |= 0x3FF; //clear alls interrupt
FIO1CLR = 0x2000000;
FIO1SET = 0x2000000;
FIO1CLR = 0x2000000;
NVIC_ClearPendingIRQ(USB_IRQn);
return;
}
#include "LPC17xx.h"
unsigned int i;
void main(void)
{
{ //INIT
SCS |= 0x20; //подключение осциллятора
while(!(SCS&0x40)){} //ожидание запуска
//Настройка тактирования ЦПУ
PLL0CON |= 0x01; //включение PLL0
PLL0CFG |= 0x09; //умножение частоты на 10
PLL0FEED = 0xAA; //разрешение
PLL0FEED = 0x55; //изменений
CCLKSEL |= 0x100; //переключение источника тактирования
//настройка тактирования USB
PLL1CON |= 0x01; //Включение PLL1
PLL1CFG |= 0x03; //Умножаем частоту на 4 (12МГц*4=48МГц)
PLL1FEED = 0xAA; //разрешение
PLL1FEED = 0x55; //изменений
USBCLKSEL = 0x201; //Тактирование USB от PLL1 и частота тактирования 48МГц
IOCON_P1_25 = 0; //PIO
FIO1DIR = 0x2000000; //Выход PIN1_25 для индикации прерывания
{ //init USB
PCONP |= 0x80000000; //включение питания USB
USBCLKCTRL |= 0x12; //устанавливаем флаги DEV_CLK_EN + AHB_CLK_EN
while(!(USBCLKST & 0x12)){}//ждём установки флагов
USBCLKCTRL |= 8; //устанавливаем флаг доступа к регистру выбора конфигурации функции порта
while(!(USBCLKST & 0x08)){}//ждём установки флага
USBPORTSEL = 3; //U2 - ведомый
USBCLKCTRL &=~8; //сброс флага доступа
IOCON_P0_31 = 1; //функция ножк U2D+, на U2D- других функций нет
IOCON_P0_14 = 0; //USBCONNECT - управление подтягивающим резистором
FIO0DIR |= 0x4000; //bit 14 - OUT
USBDEVINTEN = 0x01; //разрешение прерываний FRAME
}
PCLKSEL = 1; //тактирование переферии 1:1
CLKSRCSEL |= 1; //тактирование CPU от PLL0
AIRCR = 0x05FA0200; //настройка
IP1 = 0x00000800; //и разрешение
NVIC_EnableIRQ(USB_IRQn); //прерываний
}
while(1)
{
FIO0SET |= 0x4000; //1.5 kOm
USBREEP |= 0x80; //задействована изохронная точка 7 (IN)
while(!(USBDEVINTST & 0x100)){} //ждём установки флага EP_RLZED
for(i=0; i<0x2FFFFFF; i++ )
{
__NOP();
} //небольшая пауза для пропуска запроса от windows
USBTXPLEN = 40; //начальное значение счётчика байтов в пакете
USBEPIN = 7; //индекс конечной точки
USBMAXPSIZE = 40; //максимальный размер пакета для указанной конечной точки
while(!(USBDEVINTST & 0x100)){} //ждём установки флага EP_RLZED
USBCMDCODE = 0x0500 + 0x070000; //выбор конечной точик
USBCTRL = 0x2 + 0xC; //WP_EN = 1, LOG_ENDPOINT = 3;
TDATA = 0x12345678;
TDATA = 0x91011121;
TDATA = 0x31415161;
TDATA = 0x71819202;
TDATA = 0x12223248;
TDATA = 0x12345678;
TDATA = 0x12345678;
TDATA = 0x12345678;
TDATA = 0x12345678;
TDATA = 0x98765432; //после этой команды сбрасывается WP_EN
USBCMDCODE = 0x0500 + 0xFA0000; //команда + проверка буфера
for(i=0; i<0x8FFFFFF; i++ ){__NOP(); }
FIO0CLR |= 0x4000; //отключение резистора 1.5 кОм
for(;;){}
}
}
void USB_IRQHandler (void)
{
USBDEVINTCLR |= 0x3FF; //clear alls interrupt
FIO1CLR = 0x2000000;
FIO1SET = 0x2000000;
FIO1CLR = 0x2000000;
NVIC_ClearPendingIRQ(USB_IRQn);
return;
}
что я не так делаю?