Демонстрационная программа для платы Eval9(ВЕ3,ВЕ4), написанная для СС7А.
Работает через драйвер LibUSB
http://sourceforge.net/projects/libusb-win32/files/ с программой USBDemo.exe.
Код:
#include <1886ve3d.h>
#include "int17xxx.h"
unsigned char Temp; // рабочий регистр в прерывании от TMR0
unsigned char DataInp; // состояние перемычек, передаваемое в компьютер
unsigned char DataOut; // регистр управления светодиодами
unsigned char FLAG; // регистр флагов
bit FLAG1; // запрос передачи в компьютер состояния перемычек
bit FLAG7; // индикация младшей/старшей тетрады светодиодов
//------------------------------------------------------------------------------
void PAUSE(unsigned char);
#pragma origin 0x8
interrupt iServer(void){
multi_interrupt_entry_and_save
// save on demand: TBLPTRH,TBLPTRL,FSR0,FSR1
TMR0_service:
T0IF = 0;
DDRE = 0xF0;//PORTE 4-7 - входы
PORTE = 0x07;
PAUSE(6);
Temp = PORTE & 0xF0; //Считывание старшей тетрады перемычек
PORTE = 0x0b;
PAUSE(6);
Temp = Temp | (PORTE >> 4); //В Temp считанный байт состояния перемычек
if(Temp != DataInp){
FLAG1 = 1; //Флаг запроса передачи в компьютер
DataInp = Temp;}
if(FLAG7 == 1){FLAG7 = 0;}else{FLAG7 = 1;}//Переключение флага в противоположное состояние
Temp = DataOut;
if(FLAG7 == 0){Temp = swap(Temp);}
Temp = (Temp | 0x0f) & 0xfe;
if(FLAG7 == 1){Temp = Temp ^ 0x03;}
PORTE = Temp;
DDRE = 0;
if(PORTA.0 == 0){FLAG1 = 1;}
goto RESTORE_and_return;
PERIPHERAL_service:
#asm
dw 0xC000 ; goto 0
#endasm
// goto RESTORE_and_return;
T0CKI_service:
INT_service:
RESTORE_and_return:
interrupt_exit_and_restore
}
#pragma insertConst
const unsigned char DESCR[128] ={
0x12, // DEVICE descriptor
0x01,0x00,0x10,0x0FF,0x00,0x0FF,0x08,0x34,
0x12,0x78,0x56,0x00,0x00,
0x01, // indexes string desc
0x02,0x03,0x01,
0x09, // CONFIGURATION descriptor
0x02,0x20,0x00,0x01,0x01,0x00,0x0C0,0x0A0,
0x09, // INTERFACE descriptor
0x04,0x00,0x00,0x02,0x0FF, // int class
0x01, // interfeSubClass
0x0FF, // int prot
0x00,
0x07, // ENDPOINT 1 descriptor (out)
0x05,0x01,0x03, // 02h
0x40,0x00,0x01,
0x07, // ENDPOINT 2 descriptor (in)
0x05,0x82,0x03, // 02h
0x40,0x00,0x01,
0x00, // ENDPOINT 3 and 4 descriptor
0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08, // Languages
0x03,0x09,0x04,0x09,0x04,0x09,0x04,
0x0A, // String 1
0x03,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
0x0A, // String 2
0x03,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,
0x0A, // String 3
0x03,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
0x0A, // string 4
0x03,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,
0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31
};
//------------------------------------------------------------------------------
void PAUSE(unsigned char PS){
unsigned char i;
for (i=0;i<PS;i++);}
//------------------------------------------------------------------------------
void main(){
unsigned char n;
GLINTD = 1; // Запрет всех прерываний
PORTE = 0x00;
DDRE = 0x00; // Выход
PORTC = 0x00;
DDRC = 0x00; // Выход
PORTD = 0x00;
DDRD = 0x00; // Выход
// Загрузка дескриптора и включение USB контроллер
for (n=0;n<128;n++){
DESCR_ADR = n;
DESCR_DATA = DESCR[n];}
// Загрузка размера буферов оконечных точек (макс 64)
EP1_CFG1 = 0x40; // Загрузка размера буфера оконечной точки1
EP2_CFG1 = 0x40; // Загрузка размера буфера оконечной точки2
// Загрузка типов оконечных точек
EP1_CFG2 = 0x04; // OUT Interrupt Transfer
EP2_CFG2 = 0x02; // IN Interrupt Transfer
// Включение USB
USB_CTRL = 0x03; //Полная скорость "1" в 1р, разрешение работы "1" в 0р
// Ожидание инициализации и конфигурирования со стороны хост контроллера CONF_SET
while ((!CONF_SET)){clrwdt();}
USB_RST = 0; //Сброс флага RESET на USB_STAT,4
//USB контроллер готов - разрешение прерывания по USB и TMR0
USB_IE1 = 0x00; //Разрешение прерывания все 4 точки полно или пусто
USB_IE2 = 0x80; //Установка USB_RST_IE = 1;
USB_IE3 = 0x00; //Установка разрешение прерывания от USB блока - ошибки
USB_IE4 = 0x08; //Установка глобального разрешения прерывания USB_OLL_IE
//от контроллера USB
PIR1 = 0x00; //Сброс флагов запросов прерываний
PIE1 = 0x04; //Установка USB_IE
T0STA = 0x20; //Включение TMR0 (внутр. тактовая частота, предделитель 1:1)
INTSTA = 0x0a; //Установка PE_IE + TOIE
DataInp = 0x00; //Обнуление состояния перемычек, передаваемое в компьютер
DataOut = 0x00; //Обнуление регистра управления светодиодами
FLAG = 0x00; //Обнуление регистра флагов
GLINTD = 0x00; //Установка бита разрешения всех прерываний
while (1){
clrwdt();
if(EMPTY1 == 0){//Проверка наличия данных в FIFO1
DataOut = EP1_REG;}
else{ //Прием байта данных из компа в регистр упр.светодиодами
if((FLAG1 == 1)&&(EMPTY2 == 1)){//Проверка наличия данных в FIFO2
EP2_REG = DataInp; //Передача данных в компьютер
FLAG1 = 0;}}}
}