Está en la página 1de 10

Diseño

Integrado

Anexo F: Código de Inicialización USB-CDC

Código necesario para la configuración del periférico, tanto para la


programación como para la configuración del microcontrolador.

PFC_Datos por Pantalla.c

Fichero .c con el código de una aplicación que envía el valor de una conversión
por el puerto USB, configurado como dispositivo de clase CDC (Dispositivo Clase de
Comunicación).

En este caso se envían dos datos de 2bytes cada uno de ellos comprobando
que la recepción de los mismos se lleva a cabo de forma correcta. Para enviar los
datos es necesario tenerlo almacenados en bytes diferenciados, para lo que usamos la
función make, que se queda con el byte alto o bajo de una variable, según le
indiquemos en los parámetros. Enviamos después los valores de forma consecutiva,
primero el byte bajo, después el altos de forma que podamos hacer la recepción de
manera sencilla.

//******************************************************************
//
// PROYECTO FIN DE CARRERA
// PLACA DETECTOR DE MOVIMIENTO
// PROYECTO FIN DE CARRERA
// Detector de Movimiento
//
// Realizado: MARTA ARENAS MAS
// Fecha: 22-Mayo-2008
// Versión: v1
//
//******************************************************************
//
// Ficheros Utilizados: P18F2550.h
//
//******************************************************************

#include <18F2550.h> //Permite incluir fichero en el programa

#device adc=10

#FUSES NOWDT //Deshabilitado el Watch Dog Timer


#FUSES HSPLL //High Speed Crystal/Resonator with PLL enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOLVP //No low voltage prgming, B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES USBDIV //USB clock source comes fron PLL divide by 2
#FUSES PLL1 //No PLL PreScaler
#FUSES CPUDIV1 //96MHz PLL dividido entre 2 = 48MHz reloj sistema
#FUSES VREGEN //USB voltage regulator enabled

Universidad de Sevilla Pág. 169


Diseño ANEXO F
Integrado Código USB-CDC

#use delay(clock=48000000) //Permite definir la frecuencia del oscilador del PIC


//El Compilador lo utiliza para realizar cálculos de tiempo

#include <usb_cdc.h>
//Driver que permite utilizar una clase de dispositivo CDC USB, emulando
//un dispositivo RS232 y lo muestra como un puerto COM en Windows

#include <PicUSB_CDC.h>
//Fichero con los descriptores de dispositivo

#define LED1 PIN_B7


#define LED2 PIN_B6
#define LED_ON output_high
#define LED_OFF output_low

void main(){

int16 Valor=0;
int16 n=0;

int i;
int ValorL;
int ValorH;
int nL;
int nH;

set_tris_B(0xF1); //Configura I/O puerto B


set_tris_A(0xFF); //Configura entrada Puerto A
LED_ON(LED1); //Encendemos el LED1, comienza ejecución del programa

setup_adc_ports(AN0_TO_AN2|VSS_VDD);
//Canales AN0, AN1 y AN2 analógicos de entrada ADCON1

setup_adc(ADC_CLOCK_DIV_4); //Fuente de reloj ADCON2

usb_cdc_init();
usb_init(); //Inicializamos los registros USB

usb_wait_for_enumeration();

if(usb_enumerated()) //Si el dispositivo está configurado


{
LED_OFF(LED1); //Apagamos el LED1
delay_ms(2000);
LED_ON(LED2); //Encendemos el LED2

delay_ms(3000); //Retardo para poder abrir el puerto.

Pág. 170 Universidad de Sevilla


ANEXO F
Código USB-CDC Diseño
Integrado

do{
usb_task(); //Controla la detección de conexión. Resetea en caso de que falle
if(usb_enumerated()) //Si el dispositivo está configurado
{
for(i=0;i<3;i++)
{
set_adc_channel(i);
delay_us(10);
Valor=read_adc();

nL=make8(n,0);
nH=make8(n,1);
if(usb_cdc_putready()) usb_cdc_putc(nL);
//Enviamos byte bajo del EP1 al PC
if(usb_cdc_putready()) usb_cdc_putc(nH);
//Enviamos byte bajo del EP1 al PC

ValorL=make8(Valor,0);
ValorH=make8(Valor,1);
if(usb_cdc_putready()) usb_cdc_putc(ValorL);
//Enviamos byte bajo del EP1 al PC
if(usb_cdc_putready()) usb_cdc_putc(ValorH);
//Enviamos byte alto del EP1 al PC

delay_ms(500); //Se envían datos cada 0.5s


n++;
}
i=0;
}
}while (TRUE);
}
}

PFC_Detector de Movimiento.c

Fichero .c con el código de una aplicación que envía el valor de una conversión
por el puerto USB, configurado como dispositivo de clase CDC (Dispositivo Clase de
Comunicación).

En este caso se envía un datos de 2bytes que es el resultado de la conversión


A/D de cada una de las tres entradas de datos que proporcionan los acelerómetros.
Para enviar los datos es necesario tenerlo almacenados en bytes diferenciados, para
lo que usamos la función make, que se queda con el byte alto o bajo de una variable,
según le indiquemos en los parámetros.

Enviamos los valores leídos en un corto periodo de tiempo, ya que la finalidad


de este código es poder interpretar los resultados de forma gráfica en una aplicación
posterior.

Universidad de Sevilla Pág. 171


Diseño ANEXO F
Integrado Código USB-CDC

//******************************************************************
//
// PROYECTO FIN DE CARRERA
// PLACA DETECTOR DE MOVIMIENTO
// PROYECTO FIN DE CARRERA
// Detector de Movimiento
//
// Realizado: MARTA ARENAS MAS
// Fecha: 22-Mayo-2008
// Versión: v1
//
//******************************************************************
//
// Ficheros Utilizados: P18F2550.h
//
//******************************************************************

#include <18F2550.h> //Permite incluir fichero en el programa

#device adc=10

#FUSES NOWDT //Deshabilitado el Watch Dog Timer


#FUSES HSPLL //High Speed Crystal/Resonator with PLL enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOLVP //No low voltage prgming, B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES USBDIV //USB clock source comes fron PLL divide by 2
#FUSES PLL1 //No PLL PreScaler
#FUSES CPUDIV1 //96MHz PLL dividido entre 2 = 48MHz reloj sistema
#FUSES VREGEN //USB voltage regulator enabled

#use delay(clock=48000000) //Permite definir la frecuencia del oscilador del PIC


//El Compilador lo utiliza para realizar cálculos de tiempo

#include <usb_cdc.h>
//Driver que permite utilizar una clase de dispositivo CDC USB, emulando
//un dispositivo RS232 y lo muestra como un puerto COM en Windows

#include <PicUSB_CDC.h>
//Fichero con los descriptores de dispositivo

#define LED1 PIN_B7


#define LED2 PIN_B6
#define LED_ON output_high
#define LED_OFF output_low

void main(){

int16 Valor=0;

int i=0;
int ValorL=0;
int ValorH=0;

Pág. 172 Universidad de Sevilla


ANEXO F
Código USB-CDC Diseño
Integrado

set_tris_B(0xF1); //Configura I/O puerto B


set_tris_A(0xFF); //Configura entrada Puerto A
LED_ON(LED1); //Encendemos el LED1, comienza ejecución del programa

setup_adc_ports(AN0_TO_AN2|VSS_VDD);
//Canales AN0, AN1 y AN2 analógicos de entrada ADCON1

setup_adc(ADC_CLOCK_DIV_4); //Fuente de reloj ADCON2

usb_cdc_init();
usb_init(); //Inicializamos los registros USB

usb_wait_for_enumeration();

if(usb_enumerated()) //Si el dispositivo está configurado


{
LED_OFF(LED1); //Apagamos el LED1
delay_ms(2000);
LED_ON(LED2); //Encendemos el LED2

delay_ms(3000); //Retardo para poder abrir el puerto.

do{
usb_task(); //Controla la detección de conexión. Resetea en caso de que falle
if(usb_enumerated()) //Si el dispositivo está configurado
{
for(i=0;i<3;i++)
{
set_adc_channel(i);
delay_us(20);
Valor=read_adc();

ValorL=make8(Valor,0);
ValorH=make8(Valor,1);
if(usb_cdc_putready()) usb_cdc_putc(ValorL);
//Enviamos byte bajo del EP1 al PC
if(usb_cdc_putready()) usb_cdc_putc(ValorH);
//Enviamos byte alto del EP1 al PC

//Enviamos el número de puerto del que estamos leyendo


if(usb_cdc_putready()) usb_cdc_putc(i);

delay_us(500); //Se envían datos cada 0.5ms


}
i=0;
}
}while (TRUE);
}
}

Universidad de Sevilla Pág. 173


Diseño ANEXO F
Integrado Código USB-CDC

PicUSB.h
///////////////////////////////////////////////////////////////////////////
////
//// PicUSB_CDC.h
////
//// Este ejemplo muestra como configurar el dispositivo USB y sus
//// descriptores. Los únicos cambios con respecto a su verión
//// original (usb_desc_cdc.h) han sido realizados en el apartado
//// start device descriptors, concretamente el vendor y product id
//// y en apartado de start string descriptors, para definir el
//// nombre del dispositivo y la compañia.
////
///////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////
///
///PicUSB.h Archivo Descriptor Configuración
///
//////////////////////////////////////////////////////////////////////////

#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__

#include <usb.h>

///////////////////////////////////////////////////////////////////////////
///
/// Comienzo de la configuración
/// Array que contiene el descriptor de configuración, de interface
/// y de punto final.
///
///////////////////////////////////////////////////////////////////////////

#DEFINE USB_TOTAL_CONFIG_LEN 67 //config+interface+class+2 endpoints

const char USB_CONFIG_DESC[] = {

//Descriptor de la configuración
USB_DESC_CONFIG_LEN, //Tamaño del descriptor
USB_DESC_CONFIG_TYPE, //Tipo del descriptor (CONFIGURACION 0x02)
USB_TOTAL_CONFIG_LEN,0,
2, //Número de interfaces que soporta el dispositivo
0x01, //Identificador de la configuración (Si hubiera más de una)
0x00, //Índice del descriptor de cadena para esta configuración
0xC0, //Bit 6=1 si el dispositivo es self powered,
//Bit 5=1 si soporta remote wakeup, bits 0-4 reservados and Bit7=1
0x32, //0x32 = 100mA, máximo permitido

//Descriptor de Interfaz 0 (comm class interface)


USB_DESC_INTERFACE_LEN, //Tamaño del descriptor
USB_DESC_INTERFACE_TYPE, //Tipo de descriptor (INTERFACE (0x04))
0x00, //Identificador de la Interfaz
0x00,
1, //Número de puntos finales de la interfaz, sin contar EP0.

Pág. 174 Universidad de Sevilla


ANEXO F
Código USB-CDC Diseño
Integrado

0x02, //Código de la Clase, 02 = Comm Interface Class


0x02, //Código de la Subclase, 02 = Abstract
0x01, //Código del protocolo, 01 = v.25ter
0x00, //Índice del descriptor de cadena para la interfaz

//class descriptor [functional header]


5, //length of descriptor
0x24, //dscriptor type (0x24 == )
0, //sub type (0=functional header)
0x10,0x01, //==21,22 //cdc version

//class descriptor [acm header]


4, //length of descriptor
0x24, //dscriptor type (0x24 == )
2, //sub type (2=ACM)
2, //capabilities

//class descriptor [union header]


5, //length of descriptor
0x24, //dscriptor type (0x24 == )
6, //sub type (6=union)
0, //master intf
1, //save intf0

//class descriptor [call mgmt header]


5, //length of descriptor
0x24, //dscriptor type (0x24 == )
1, //sub type (1=call mgmt)
0, //capabilities
1, //data interface

//Descriptor de Punto Final


USB_DESC_ENDPOINT_LEN, //Tamaño del descriptor
USB_DESC_ENDPOINT_TYPE, //Tipo del descriptor (ENDPOINT (0x05))
USB_CDC_COMM_IN_ENDPOINT | 0x80,
//Número de Endpoint y dirección (0x80)
0x03, //Tipo de transferencia soportada
//(0 control, 1 isócrona, 2 bulk (masiva), 3 interrupción)
USB_CDC_COMM_IN_SIZE,0x00, //Tamaño máximo del paquete
250, //Intervalo en ms. (sólo para transferencia por interrupción)

//Descriptor de Interfaz 1 (data class interface)


USB_DESC_INTERFACE_LEN, //Tamaño del descriptor
USB_DESC_INTERFACE_TYPE, //Tipo de descriptor (INTERFACE (0x04))
0x01, //Identificador de la Interfaz
0x00,
2, //Número de puntos finales de la interfaz, sin contar EP0.
0x0A, //Código de la Clase, 0A = Data Interface Class
0x00, //Código de la Subclase
0x00, //Código del protocolo
0x00, //Índice del descriptor de cadena para la interfaz

Universidad de Sevilla Pág. 175


Diseño ANEXO F
Integrado Código USB-CDC

//Descriptor de Punto Final


USB_DESC_ENDPOINT_LEN, //Tamaño del descriptor
USB_DESC_ENDPOINT_TYPE, //Tipo del descriptor (ENDPOINT (0x05))
USB_CDC_DATA_OUT_ENDPOINT,
//Número de Endpoint y dirección(0x02 = EP2 OUT)
0x02, //Tipo de transferencia soportada
//(0 control, 1 isócrona, 2 bulk (masiva), 3 interrupción)
// make8(USB_CDC_DATA_OUT_SIZE,0),make8(USB_CDC_DATA_OUT_SIZE,1),
USB_CDC_DATA_OUT_SIZE & 0xFF, (USB_CDC_DATA_OUT_SIZE >> 8) & 0xFF,
//Tamaño máximo del paquete
250, //polling interval, in ms.

//Descriptor de Punto Final


USB_DESC_ENDPOINT_LEN, //Tamaño del descriptor
USB_DESC_ENDPOINT_TYPE, //Tipo del descriptor (ENDPOINT (0x05))
USB_CDC_DATA_IN_ENDPOINT | 0x80,
//Número de Endpoint y dirección (0x82 = EP2 IN)
0x02, //Tipo de transferencia soportada
//(0 control, 1 isócrona, 2 bulk (masiva), 3 interrupción)
// make8(USB_CDC_DATA_IN_SIZE,0),make8(USB_CDC_DATA_IN_SIZE,1),
USB_CDC_DATA_IN_SIZE & 0xFF, (USB_CDC_DATA_IN_SIZE >> 8) & 0xFF,
//Tamaño máximo del paquete
250, //polling interval, in ms.
};

//****** COMPROBACIÓN CORRECTA CONFIGURACIÓN ********

#define USB_MAX_NUM_INTERFACES 2

const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={2};


const int16

USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][USB_MAX_NUM_INTERFA
CES][4]=
{
//config 1
//interface 0
//class 1-4
18,23,27,32,
//interface 1
//no classes for this interface
0xFFFF,0xFFFF,0xFFFF,0xFFFF
};

#if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)


#error USB_TOTAL_CONFIG_LEN not defined correctly
#endif

Pág. 176 Universidad de Sevilla


ANEXO F
Código USB-CDC Diseño
Integrado

//////////////////////////////////////////////////////////////////
///
/// Descriptor del dispositivo
///
//////////////////////////////////////////////////////////////////

//Descriptor de Dispositivo
char const USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
USB_DESC_DEVICE_LEN, //Tamaño del descriptor
0x01, //Tipo del descriptor (DEVICE (0x01))
0x10,0x01, //Versión USB in bcd(2.0)
0x02, //Código de clase 0x02=Communication Device Class
0x00, //Código de Subclase
0x00, //Código del Protocolo
USB_MAX_EP0_PACKET_LENGTH,
//Tamaño máximo del paquete del Endpoint 0
0xD8,0x04, //Identificador del vendedor (0x04D8 is Microchip)
0x0A,0x00, //Identificador del producto
0x00,0x01,
0x01, //Indice del descriptor de cadena de fabricante
0x02, //Indice del descriptor de la cadena de producto
0x00, /Indice de descriptor de la cadena de número de serie
USB_NUM_CONFIGURATIONS //Número de Configuraciones
};

//////////////////////////////////////////////////////////////////
///
/// Comienza la Descripción de la cadena
///
//////////////////////////////////////////////////////////////////

char USB_STRING_DESC_OFFSET[]={0,4,12};

char const USB_STRING_DESC[]={


//string 0
4, //Tamaño de la cadena
USB_DESC_STRING_TYPE, //Tipo de descriptor(0x03 (STRING))
0x09,0x04,

//string 1 --> Fabricante


8, //Tamaño de la cadena
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'M',0,
'A',0,
'M',0,

//string 2 --> Producto


30, //Tamaño de la cadena
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'R',0,
'S',0,
'2',0,
'3',0,
'2',0,

Universidad de Sevilla Pág. 177


Diseño ANEXO F
Integrado Código USB-CDC

' ',0,
'P',0,
'i',0,
'c',0,
'U',0
'S',0,
'B',0

};

#ENDIF

Pág. 178 Universidad de Sevilla

También podría gustarte