USB и PIC18f4550
Добавлено: Чт фев 17, 2011 12:38:34
Есть ПК, есть PIC18f4550, c чего нужно начинать, чтобы ПК обнаружил контроллер, как новое СDС-устройство и установил нужный драйвер. Для программирования использую компилятор CCS.
Юра как всегда прав , все лежит в папке Drivers .urry писал(а):я не знаю ццс - но туда входит заголовочный файл с описаниями дескриптора конфигурации и где-то рядом должен лежать инф файл, где эти вид-пид тоже можно посмотреть. Вообще с ними вопрос интересный - если изделие будет тиражироваться тысячами экземпляров, за использование нужно платить - кому и как - не знаю, тема как-то всплывала на микрочип су.
На казусе были темы по ццс с юсб, спросите там.
Код: Выделить всё
/* Функция инициализации модуля USB*/
void init_usb()
{
/* Установим количество передаваемых байт в /из конечной точки 0 */
BD0CNT = 8;
/* Конфигурируем регистр статуса конечно точки 0 */
BD0STAT = 0x88;
/* Укажем адрес начала буфера для EP0*/
BD0ADRL = 0;
BD0ADRH = 0x05;
/* В регистр адреса загружаем адрес 0*/
UADDR = 0;
/* Cконфигурируем регистр UEP0*/
UEP0 = ENDPT_CONTROL;
/* Очистим переменную для хранения запроса к устройству*/
USB_dev_req = 0;
/* Очистим регистр статуса USTAT*/
USTAT = 0;
/* Сконфигурируем регистр UCFG */
UCFG = 0;
/* Включим полную скорость - бит FSEN*/
UCFG |= 1<<2;
USB_Interface [0] = 0;
USB_Interface [1] = 0;
USB_Interface [2] = 0;
USB_Curr_Config = 0;
USB_status_device = 1;
/* Сконфигурируем регистр UCON */
UCON = 0;
/* Включим модуль USB - бит USBEN */
UCON = 1<<3;
/* Разрешим прерывание от USB*/
PIE2 = 1<<5;
/* Сбросим регистр прерываний по состоянию от модуля USB UIR*/
UIR = 0;
/* Сконфигурируем регистр разрешения прерываний UIE*/
UIE = 1;
/* Сконфигурируем регистр прерываний ошибок UEIR*/
UEIR = 0;
/* Сконфигурируем регистр разрешения прерываний из за ошибок UEIE */
UEIE = 0;
/* Включим глобальное разрешение прерываний*/
INTCON |= 1<<7;
/* Разрешим прерывание от перефирийных устройств*/
INTCON |= 1<<6;
/* Включим встроенные подтягивающие регистры - бит UPUEN */
UCFG = 1<<4;
}
Код: Выделить всё
/* Обработчик прерывания сброса модуля USB */
void USBReset(){
RB7 = 0;
/* Сбросим все флаги прерывания модуля USB*/
UIR = 0;
/* Сбросим все флаги прерывания от ошибок модуля USB*/
UEIR = 0;
/* Разрешение некоторых видов прерываний от USB (cм init_usb )*/
UIE = 0x29;
/* В регистр адреса загружаем адрес 0*/
UADDR = 0;
/* Cконфигурируем регистр UEP0*/
UEP0 = ENDPT_CONTROL;
/* Сбросим буфер FIFO для регистра USTAT ( FIFO 4 байта )*/
while(TRNIF == 1)
TRNIF = 0;
/*### Заполним регистры BDT для ENDPOINT0 ###*/
/* Иинициализируем дескриптор конечной точки 0*/
/* Установим количество передаваемых байт в /из конечной точки 0 */
BD0CNT = 8;
/* Конфигурируем регистр статуса конечно точки 0 */
BD0STAT = 0x8C;
/* Укажем адрес начала буфера для EP0*/
BD0ADRL = 0;
BD0ADRH = 0x05;
USB_status_device = 0;
}
Код: Выделить всё
/* Функция селекции прерывания от USB*/
void interrupt_handler_USB()
{
if(TRNIF)
{
USB_end_transact();
}
else
if(URSTIF)
USBReset();
else
if(STALLIF)
{
USBStall();
}
else
if(SOFIF && SOFIE )
USBSof();
/* Сбросить флаг прерывания USB USBIF регистра PIR2 */
//USBIF = 0;
}
Код: Выделить всё
/* Для удобства работы , обвернём указатели в макросы*/
bank2 unsigned char *_BD0STAT = 0x400;
bank2 unsigned char *_BD0CNT = 0x401;
bank2 unsigned char *_BD0ADRL = 0x402;
bank2 unsigned char *_BD0ADRH = 0x403;
#define BD0STAT *_BD0STAT
#define BD0CNT *_BD0CNT
#define BD0ADRL *_BD0ADRL
#define BD0ADRH *_BD0ADRH