You are on page 1of 51

INSTITUTO POLITECNICO NACIONAL

ESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA


ZACATENCO

ING. EN CONTROL Y AUTOMATIZACION

REPORTE DE IMPLEMENTACION DE COMUNICACIN USB CLASE


CDC EN UN MICROCONTROLADOR PIC18F4550 EN CCS

PROFESOR: Adrin Mendoza

Realizo: Esteban Guerrero Rivero


Contenido

INTRODUCCION................................................................................................ 4
Descripcin general..................................................................................... 4
ESPECIFICACIONES USB.................................................................................. 5
Medio fsico................................................................................................... 5
Terminales..................................................................................................... 5
Tipos de transferencia................................................................................. 6
Velocidades de transmisin........................................................................6
Descriptores.................................................................................................. 7
Descriptor del dispositivo.................................................................8
Descriptor de la configuracin........................................................10
Descriptores de la interfaz..............................................................12
Descriptor de cadena.......................................................................14
Endpoints del dispositivo..........................................................................15
Normas......................................................................................................... 15
Resumen de la norma CDC120-20101103.................................17
Comunicacin device class..............................................................18
AN1164 USB clase CDC para dispositivos embebidos.................19
IMPLEMENTACION DE COMUNICACIN USB EN UN
MICROCONTROLADOR PIC18F4550.............................................................20
Requerimientos.......................................................................................... 20
Descripcin general del mdulo USB en el PIC18F4550.....................20
FUNCIONES DEL OSCILADOR PARA COMUNICACIN USB.....................24
Libreras de CCS......................................................................................... 25
Descriptores................................................................................................ 29
Programas de generacin de descriptores y archivos .inf..................31
DRIVER............................................................................................................ 33
Descripcin general................................................................................... 33
Servicio Plug & Play de Windows............................................................34
Administrador de dispositivos.................................................................34
Creacin del instalador del controlador con INSTALLSHIELD.............35
IMPLEMENTACION.......................................................................................... 42
Programa de ejemplo............................................................................................ 42
Circuito......................................................................................................... 45
Simulacin................................................................................................... 46
Prueba.......................................................................................................... 47
INTRODUCCION

El presente trabajo abarca la implementacin de la comunicacin USB en un microcontrolador tipo


PIC18F4550 en el ambiente de programacin PICC de CCS para el intercambio de informacin con
una computadora personal empleando el modo SERIAL de la clase CDC (Comunication device
class)

Descripcin general

El USB (Universal Serial Bus) es un estndar industrial desarrollado en la dcada de las 90s que
define los cables, conectores y protocolos usados en un bus para conectar, proveer alimentacin
elctrica entre ordenadores, perifricos y dispositivos electrnicos

En el presente trabajo se abordara la parte terica e las comunicaciones USB, la implementacin de


la comunicacin USB empleando un microcontrolador, el uso e instalacin del driver necesario para
el funcionamiento de la interfaz as como la implementacin de un circuito funcional para enviar y
recibir informacin por el puerto USB.
ESPECIFICACIONES USB

Medio fsico

Las seales de USB se transmiten en un cable de par trenzado con impedancia caracterstica de
90Ohms, cuyos hilos se denominan D+ Y D-. Este puerto solo admite la conexin de dispositivos de
bajo consumo, es decir, que tengan un consumo mximo de 500 m A.
El calibre tpico de este tipo de cables es el 26AWG, adems en la norma USB 2.0 se especifica una
longitud mxima de 5m y para la norma USB 3.0 una longitud mxima de 3m.

Terminales

PIN SEAL COLOR DESCRIPCION


1 VCC Rojo +5V
2 Data- Blanco Data-
3 Data+ Verde Data+
4 GND Negro Tierra

Pines en los distintos tipos de conectores


Tipos de transferencia

Existen 4 tipos de transferencia de informacin definidos en las especificaciones tcnicas del USB

ISOCHRONOUS: Este mtodo se emplea para grandes cantidades de datos (ms de


1023bytes), con tiempo de entrega asegurado, sin embargo la integridad de la informacin
no puede asegurarse del todo, es comnmente empleado en aplicaciones de audio

BULK: Este tipo de mtodo de transferencia es empleado para transmitir grandes


cantidades de informacin, la integridad de la informacin es asegurada, no as el tiempo de
entrega.

INTERRUPT: Este tipo de transferencia asegura el tiempo de entrega para pequeos


bloques de datos, adems es asegurada la integridad de la informacin

CONTROL: Permite la configuracin del dispositivo

Velocidades de transmisin

USB (1.0): Tasa de transferencia de hasta 1.5 Mbit/s, es el ms empleado en dispositivos de interfaz
humana (HID). Pero es en esta seccin

USB (1.1): Tasa de transferencia de hasta 12 Mbit/s, esta fue la ms rpida hasta la implementacin
del protocolo 2.0

USB (2.0): Tasa de transferencia de 480 Mbit/s, casi todos los dispositivos fabricados en la
actualizad trabajan bajo este protocolo.

USB (3.0): Tasa de transferencia de 4.8Gbit/s, la velocidad del bus es ms rpida debido a que se
han incluido contactos adicionales
Descriptores

Como se describi anteriormente, durante la enumeracin el anfitrin usa transferencia de control


para solicitar descriptores del dispositivo, como la enumeracin progresa, los descriptores
solicitados van dando cada vez ms informacin del dispositivo, primero de todo el dispositivo, luego
de cada configuracin, la interface de cada configuracin y finalmente los endpoints de las
interfaces, en la siguiente tabla se muestran los tipos de descriptores.

bDescriptor Tipo de descriptor Es necesario?


Type
01h dispositivo SI
02h configuracin SI
03h cadena Opcional
04h interfaz SI
05h endpoint No (si el disp. Solo usa el
endpoint 0)
06h calificador del Si
dispositivo
07h otra config. De Si
velocidad
08h energa de la No (si el disp. Solo usa el
interfaz endpoint 0)
09h OTG On the go
0Ah debug No (si el disp. Solo usa el
endpoint 0)
0Bh asociacin de la Opcional
interfaz

Los descriptores de alto nivel informan al anfitrin de cualquier descriptor adicional de bajo nivel, a
excepcin de los dispositivos compuestos, cada dispositivo tiene un solo descriptor que contiene la
informacin del dispositivo como un todo y especifica el nmero de configuraciones que soporta el
dispositivo.
Cada dispositivo tambin contiene uno o ms descriptores de configuracin que contienen
informacin acerca del consumo de energa del dispositivo y el nmero de interfaces soportadas por
la configuracin. Cada descriptor de la interface especifica cero o ms descriptores de endpoints
que contienen la informacin necesaria para comunicarse con un endpoint.
Cada descriptor de endpoint tiene informacin acerca de cmo el endpoint transfiere los datos, una
interfaz sin descriptores de endpoint debe emplear el punto final de control para las comunicaciones.
Un descriptor de cadena puede almacenar texto como el nombre del vendedor o el nombre del
dispositivo, otros descriptores pueden contener valores de ndice que apuntes a esos descriptores
de cadena y el anfitrin puede leer estos con una solicitud Get_Descriptor.
En el valor del descriptor bDescriptorType, el bit7 siempre es cero. El bit 6 y 5 identifican el tipo de
descriptor: 00h=estndar, 01h=class, 02h=fabricante, 03h=reservado, y los bits 4:0 identifican el
descriptor.
Cada descriptor consta de una serie ce campos. La mayora de los nombres de campo usan prefijos
que indican el formato o el contenido en ese campo: b=byte (8 bits), w=Word (16 bits), bm=bit map,
bcd= binary-coded decimal, i=index, id=identificador.

Descriptor del dispositivo

El descriptor del dispositivo contiene informacin bsica acerca del dispositivo, este descriptor es el
primero ledo por el anfitrin al conectar el dispositivo e incluye la informacin que el anfitrin
necesita para solicitar informacin adicional del dispositivo. El anfitrin solicita el descriptor del
dispositivo mandando la instruccin Get_Descriptor con el bit MSB del campo wValue en 1.
El descriptor contiene 14 campos. La siguiente tabla muestra los campos en el orden en que estos
se presentan.

offset Field Size Descripcin


(decimal) (bytes)
0 bLength 1 Tamao del descriptor en bytes
1 bDescriptorTyp 1 La constante DEVICE (01h)
e
2 bcdUSB 2 Numero de la versin de USB (BCD)
4 bDeviceClass 1 Cdigo de Clase
5 bDeviceSubcla 1 Cdigo de Subclase
ss
6 bDeviceProtoco 1 Cdigo de protocolo
l
7 bMaxPacketSiz 1 Tamao mximo del paquete para el
e0 endpoint 0
8 idVendor 2 Vendor ID
10 idProduct 2 Product ID
12 bcdDevice 2 Nmero de la versin del dispositivo (BCD)
14 iManufacturer 1 ndice de la cadena descriptora del
fabricante
15 iProduct 1 ndice de la cadena descriptora del
producto
16 iSerialNumber 1 ndice de la cadena descriptora del
nmero de serie
17 bNumCofigurati 1 Numero de configuraciones posibles
ons

bLength : La longitud en bytes del descriptor


bDescriptorType : La constante DEVICE (01h)
bcdUSB : La versin de la especificacin USB sobre la cual est basado el dispositivo y los
descriptores del mismo, en formato BCD. La versin 1.0 es 0100h, la 1.1 es 0110h y la
versin 2.0 es 0200h.
idVendor: Miembros del USB-IF y otros quienes pagan tarifas administrativas tienen
derecho a usar un cdigo nico, el anfitrin debe tener un archivo INF que contiene este
valor, y as Windows es capaz de decidir que driver asignarle al dispositivo.
idProduct: El dueo del VID puede asignarle un identificador al producto, esta informacin
tambin debe hallarse en un archivo INF para determinar el driver a instalar.
bcdDevice : El nmero de versin del dispositivo se encuentra en formato BCD, el vendedor
asigna este valor, el anfitrin puede hacer uso tambin de este dato como informacin
adicional para elegir el driver apropiado a instalar.
iManufacturer : Es un ndice que apunta a una cadena la cual describe el fabricante, este
valor es cero si no hay un descriptor del fabricante.
iProduct : Es un ndice que apunta a una cadena descriptora del producto, este valor es
cero si no existe tal cadena.
iSerialNumber : Es un ndice que apunta a una cadena descriptora la cual contiene un
nmero de serie del dispositivo, este valor es cero si no existe tal cadena. Algunas clases de
dispositivos como los dispositivos mass storage requieren nmeros de serie, esos son de
ayuda si el usuario cuenta con dispositivos idnticos
bNumConfigurations : El nmero de configuraciones que soporta el dispositivo
bMaxPacketSize0 : El mximo tamao de paquete para el endpoint 0. El anfitrin emplea
esta informacion de la siguiente manera, para dispositivos de baja velocidad este valor debe
ser 8, para dispositivos de Full-speed se pueden emplear valores de 8, 16, 32 o 64, los
dispositivos de alta velocidad deben emplear el valor de 64
bDeviceClass : Para dispositivos cuya funcin se encuentra definida a un nivel de
dispositivo, este campo especifica la clase del dispositivo. Los valores desde 1 hasta FEh se
encuentran reservados para clases definidas. La siguiente tabla muestra los cdigos
definidos. El valor FFh significa que la clase es especfica para el fabricante y se encuentra
definida por el mismo. Muchos dispositivos especifican su clase o clases en los descriptores
de la interface, y para estos dispositivos el campo bDeviceClass en el descriptor del
dispositivo es 00h
bDeviceSubclass : Este campo puede especificar una subclase dentro de una clase, si
bDeciveClass es 0, el campo bDeviceSubclass debe ser igualmente 0. Si el campo
bDeviceClass es u nmero entre 1 y FEh, bDeviceSubclass debe ser un cdigo definido en
una especificacin de clase USB.
bDeviceProtocol : Este campo puede especificar un protocolo definido por la clase o la
subclase.
bDeviceC Descripcin
lass
00h El descriptor de la interface nombra
la clase
02h Comunicaciones
09h Hub
DCh Dispositivo de diagnostico
E0h Controlador inalmbrico
Efh Dispositivo genrico
FFh Especifico del fabricante
Opciones para bDeviceClass

Descriptor de la configuracin

Despus de recibir la informacin del descriptor del dispositivo, el anfitrin puede solicitar la
configuracin del dispositivo, de la interface y del endpoint.
Cada dispositivo tiene al menos una configuracin que especifica las caractersticas y
funcionalidades del dispositivo. Por lo general una sola configuracin es suficiente, pero un
dispositivo con mltiples modos de funcionamiento puede soportar diversos modos de configuracin.
Solo una configuracin est activa. Cada configuracin requiere su propio descriptor. El descriptor de
la configuracin contiene informacin acerca del uso de energa y de los nmeros de interfaces
soportadas por el dispositivo.
El anfitrin selecciona una configuracin con la instruccin Set_Configuration y lee la configuracin
actual con la instruccin Get_Configuration
El descriptor contiene 8 campos, la siguiente tabla muestra los campos en el orden en que ocurren
en el descriptor, los campos contienen informacin acerca del descriptor en s, la configuracin y los
requerimientos energticos del dispositivo para esa configuracin en particular.

OFFSE CAMPO SIZE DESCRIPCION


T (BYT
(DECI ES)
MAL)
0 bLength 1 Tamao del descriptor en bytes
1 bDescriptorTy 1 La constante CONFIGURATION (02h)
pe
2 wTotalLength 2 El nmero de bytes en el descriptor de la
configuracin
4 bNumInterfac 1 Numero de interfaces en la configuracin
es
5 bConfiguratio 1 Identificador para las instrucciones
nValue Set_Configuration y Get_Configuration
6 iConfiguration 1 ndice de la cadena del descriptor de
configuracin
7 bmAttributes 1 Caractersticas de alimentacin Propia/Del Bus y
"remote awake"
8 bMaxPower 1 Corriente requerida (expresada en Max mili
amperes/2)

bLength : La longitud en bytes del descripto


bDescriptorType: La constante CONFIGURATION (02h)
wTotalLength : El nmero de bytes en el descriptor de la configuracin y todos los
descriptores subordinados
bConfigurationValue : Identifica la configuracin para los requerimientos de las
instrucciones Get_Configuration y SetConfiguration, debe ser 1 o mayor. Una requisicin de
la instruccin SetConfiguration con un valor de retorno de cero casusa que el dispositivo
entre e3n un estado no configurado.
iConfiguration : Es un ndice que apunta a una cadena la cual describe la configuracin,
este valor es cero si no existe tal cadena
bNumInterfaces : El nmero de interfaces en la configuracin, el mnimo es 1.
bmAttributes. Bit6=1 si el dispositivo tiene alimentacin propia o 0 si es alimentado a travs
del bus USB, el bit 5=1 si e dispositivo soporta la funcin remote awake (Funcin para
encender el dispositivo mediante una orden del anfitrin). Un dispositivo USB debe entrar en
modo de suspensin si no ha habido actividad del bus por ms de 3 milisegundos. Los
dems bits en el campo no se emplean, los bits 0:4 deben ser 0. El bit 7 debe ser 1.
bMaxPower : Especifica cuanta corriente requiere el dispositivo, este valor equivale a la
mitad del nmero de mili amperes requeridos. Si el dispositivo requiere 200 mili amperes el
valor de este registro deber ser 100. La corriente mxima que un dispositivo puede solicitar
es 500miliamperes. Guardar el registro con la mitad de la capacidad requerida permite
almacenar este dato en un solo byte. Si la corriente requerida no se encuentra disponible, el
anfitrin se negara a configurar el dispositivo.
Descriptores de la interfaz

El descriptor de la interface provee informacin acerca de una funcin o caracterstica que un


dispositivo implementa. El descriptor contiene clases, subclases, informacin del protocolo y el
nmero de endpoint que la interfaz emplea.
Una configuracin puede tener mltiples interfaces, las cuales pueden estar activas al mismo tiempo,
las interfaces puedes estar asociadas con una sola funcin o pueden no estar relacionadas entre si.
Una configuracin puede adems soportar una interfaz alternativa, mutuamente exclusiva.
El anfitrin puede solicitar una interfaz alternativa con una solicitud Set_Interface y leer la interfaz
actual con la instruccin Get_Interface.
Un descriptor de interface contiene 9 campos, la siguiente tabla muestra los campos en el orden en
que estos ocurren en el descriptor. Muchos dispositivos no emplean todos los valores de los campos.

OFFSET CAMPO SIZE DESCRIPCION


(DECIMAL) (BYTES)
0 bLength 1 Tamao del descriptor en bytes
1 bDescriptorTyp 1 La constante Interface (04h)
e
2 bInterfaceNum 1 El numero identificador de la interface
ber
3 bAlternateSetti 1 Valor empleado para seleccionar una
ngs configuracin alterna
4 bNumEndpoint 1 Numero de endpoint soportados (Sin contar el
s endpoint 0)
5 bInterfaceClas 1 Cdigo de clase
s
6 bInterfaceSubc 1 Cdigo de subclase
lass
7 bInterfaceProt 1 Cdigo de protocolo
ocol
8 iInterface 1 ndice de la cadena descriptora de la interfaz

bLength: Numero de bytes en el descriptor


bDescriptorType: La constante INTERFACE (04h)
iInterface : ndice de una cadena que describe la interfaz, este valor es cero si no existe tal
cadena
bInterfaceNumber : Identifica la interfaz, en un dispositivo compuesto, una configuracin
tiene mltiples interfaces, las cuales pueden estar activas al mismo tiempo. Cada interface
debe tener un descriptor con un valor nico en este campo, por default este valor es cero.
bAlternateSetting : Cuando una configuracin soporta interfaces mltiples mutuamente
excluyentes, cada una de las interfaces debe tener un descriptor con el mismo valor en
bInterfaceNumber y un valor nico en bAlternateSetting. La intruccion Get_Interface regresa
los datos de la configuracin actual, y la instruccin SetInterface selecciona la configuracin
a usar, por default este valor es cero.
bNumEndpoints : El nmero de endpoints que la interface soporta adicionalmente al
endpoint 0.
bInterfaceClass : Similar a bDeviceClass en el descriptor del dispositivo, pero para
dispositivos con una clase especificada por la interfaz. La siguiente tabla muestra los
cdigos definidos. Valores de 01h a FEh estn reservadas para clases definidas. FFh indica
una clase definida por el fabricante, el cero est reservado.
bInterfaceSubClass : Similar a bDevideSubClass en el descriptor del dispositivo, pero para
dispositivos con una clase definida por la interface. Para interfaces que pertenecen a una
clase, este campo puede especificar una subclase dentro de la clase. Si bInterfaceClass es
0, bInterfaceSubClass debe ser 0. Si bInterfaceClass es un valor entre 01h y FEh,
bInterfaceSubClass debe ser 0 o un cdigo definido por la especificacin USB.
BInterfaceProtocol : Similar a bDeviceProtocol en el descriptor del dispositivo pero para
dispositivos con una clase definida por la interface. Puede especificar un protocolo definido
por la clase o subclase de interfaz seleccionada.

Cdigo de clase Descripcin
(hexadecimal)
01h Audio
02h Comunication Device Class (Interfaz de
comunicaciones)
03h Dispositivo de interfaz humana (HID)
05h Fsico
06h Imagen
07h Impresora
08h Almacenamiento masivo
09h Hub
0Ah Comunication Device Class (Interfaz de datos)
0Bh Smart CARD
0Dh Contenido de seguridad
0Eh Video
DCh Dispositivo de diagnostico
E0h Controlador wireless
Feh Especifico de aplicacin
FFh Especifico de fabricante
Opciones para bInterfaceClass

Descriptor de cadena

Un descriptor de cadena contiene texto descriptivo. La especificacin USB 2.0 define los
descriptores que pueden contener ndices a varias cadenas, incluyendo cadenas que describen el
fabricante, el producto, nmero de serie, configuracin e interfaces.
El soporte para descriptores de cadenas es opcional, sin embargo algunas clases requieren de ellos.

OFFSET CAMPO SIZE DESCRIPTOR


(DECIMAL) (BYTES)
0 bLength 1 Tamao del descriptor en
bytes
1 bDescriptorTy 1 La constante String (03h)
pe
2 Bstring Varia ndice de los idiomas
wLANGID soportados
bLength : El nmero de bytes del descriptor
bDescriptorType La constante STRING (03h)
wLANGID[0..n] : Usado nicamente en la cadena descriptora 0. La cadena descriptora 0
contiene uno o ms cdigos de identificacin de lenguaje de 16bits, los cuales indican el
idioma en que las cadenas estn disponibles. El cdigo para el ingls es 0009h y el
subcodigo para Ingles Norteamericano es 0004h., Estos se supone sern los nicos cdigos
soportados por el sistema operativo. La web del USB-IF contiene una lista de los
identificadores de lenguaje.
bString : Para valores de 1 y mayores el campo String contiene una cadena en Unicode, el
formato Unicode emplea 16bits para representar cada carcter, con algunas excepciones los
caracteres ANSI 00h al 7Fh corresponden uno a uno con los cdigos Unicode 0000h 0007h

Cuando el anfitrin solicita el descriptor de la cadena, el LSB del campo wValue, es un valor de
ndice. Un valor ndice de 0 tiene la funcin especial de solicitar el idioma de las identificaciones.

NOTA: El cdigo de lenguaje para el espaol (Mxico) es 080Ah, el cdigo para el espaol es
000Ah y para el espaol en Mxico es 0008h

Endpoints del dispositivo

Todo el trfico del bus viaja hacia o desde el endpoint del dispositivo. El
endpoint es un buffer el cual almacena mltiples bytes. Tpicamente un
endpoint es un bloque de memoria o un registro en el chip del controlador. Los
datos almacenados en el endpoint pueden ser datos recibidos o datos
esperando a ser enviados. El anfitrin tambin tiene buffers que retienen datos
recibidos o datos esperando a transmitirse, pero el anfitrin no cuenta con este
buffer especial llamado endpoint, en su lugar el anfitrin sirve de inicio y
trmino para las comunicaciones con el endpoint del dispositivo.
La especificacin USB define el endpoint del dispositivo como una porcin del
dispositivo USB nicamente direccionable que es la fuente o destino de
informacin en un flujo de comunicacin entre el anfitrin y el dispositivo.
Una direccin de endpoint consiste de un nmero de endpoint y de un sentido,
el nmero es un valor entre 0 y 15, el sentido es definido desde la perspectiva
del anfitrin, un endpoint IN provee datos para ser enviados al anfitrin y un
endpoint OUT almacena los datos recibidos por el host.
Un endpoint configurado para transferencias de control debe transmitir datos
en ambos sentidos, as que un endpoint de control consiste en un pr de
direcciones de endopints IN y OUT los cuales comparten un nmero endpoint.
Cada dispositivo debe tener el Endpoint 0 configurado como un endpoint de
control, es realmente raro la necesidad de endpoints de control adicionales, sin
embargo algunos chips los soportan.

Normas

El USB-IF (USB implementers forum), es la asociacin encargada de generar las normativas que
rigen el empleo del estndar USB.
En la pgina http://www.usb.org/developers/docs/usb20_docs/ podremos encontrar todo lo
relacionado con las diferentes normativas que definen las caractersticas fsicas y tcnicas de los
protocolos USB.
Los dispositivos USB se dividen por clases de acuerdo a sus funcionalidades, estas a su vez se
divides en subclases, las clases reconocidas por la organizacin son las siguientes:

Audio class
Audio/Video device class
Battery charger
Cable conector
Common class
Comunication device class
Content security
Device firmware upgrade group
HID class
Imaging class
IrDA
Mass storage
Media transfer protocol
Monitor
Open USBDI
Personal healthcare
Physical interface devices
Power
Printer class
Smart card class
Test & measurement class
Video class

En el presente reporte se detallaran los requerimientos para la comunicacin USB entre la


computadora y un microcontrolador, esta comunicacin ser empleando una transmisin serie, la
cual se encuentra disponible en la clase CDC.
Este mtodo es el ms sencillo para la comunicacin serie, permite el intercambio de informacin en
ambos sentidos empleando instrucciones y caractersticas similares a las empleadas en las
comunicaciones tipo UART.
Universal Serial Bus Class Definitions for Communications Devices es el documento donde se
detalla este modo de operacin, es posible encontrarlo como CDC120-20101103-track.pdf

Resumen de la norma CDC120-20101103

3.-FUNCTIONAL OVERVIEW

Esta seccin describe las caractersticas funcionales de los CDC, los cuales incluyen la
organizacin y operacin del dispositivo

3.1- FUNCTION MODELS

Un dispositivo de comunicaciones tiene 3 responsabilidades bsicas


Administracin del dispositivo
Administracin de la operacin
Transmisin de datos

El dispositivo debe usar una interfaz Communication Class para llevar acabo la administracin del
dispositvo.

3.3 DEVICE OPERATION

Los dispositivos de comunicacin presentan los datos al anfitrin (host) en una forma definida por
otra clase, como Audio, Datos, HID.

3.4.2. DATA CLASS INTERFACE

La Data class interface define una interfaz de datos como una interface con un tipo de clase de
datos, esto quiere decir que la transmisin de datos de un dispositivo de comunicacin no est
restringido por las interfaces empleando clases de datos predefinidas, en resumen la interfaz de
datos es usada para transmitir, recibir datos, los cuales no se encuentran definidos en ninguna otra
clase, un ejemplo de esto es:

Alguna forma de datos brutos (RAW DATA) de alguna lnea de comunicacin


Datos de mdems obsoletos
Datos usando un formato propietario

En este punto es responsabilidad del software anfitrin as como del dispositivo comunicarse
el uno al otro sobre alguna interfaz (CDC) para determinar el formato apropiado a usar.

Comunicacin device class

La clase de dispositivos de comunicacin engloba 2 tipos de dispositivos: telfonos y dispositivos de


red de baja velocidad, los telfonos incluyen telfonos analgicos y mdems, terminales ISDN y
telfonos digitales, en cuando a dispositivos de red engloba mdems ADSL, mdems de cable,, y
hubs y adaptadores de Ethernet 10BASE-T.
Esta clase tambin se considera una buena opcin para otros dispositivos accesados va funciones
de puerto COM por parte del anfitrin.
La principal documentacin para los dispositivos de comunicacin es la especificacin para la clase
dispositivos de comunicacin (CDC). Dos subclases tienen sus propias documentaciones.
La subclase Wireless Mobile Communications (WMC) incluye equipo terminal para dispositivos
inalmbricos que pueden desarrollar varias funciones incluyendo comunicaciones de datos y de
audio.
La subclase Ethernet Emulation model (EEM) incluye dispositivos que enva y reciben framas de
Ethernet

En resumen
AN1164 USB clase CDC para dispositivos embebidos

En esta nota de aplicacin de Microchip nos da una introduccin de las funcionalidades del mdulo
USB, en nuestro caso especfico para implementar una comunicacin del tipo UART a travs de
USB.
La clase CDC indica como es la interfaz de comunicacin USB, se desarroll para dispositivos como
mdems e interfaces de red, sin embargo unas de las funcionalidades de este modo de operacin
pueden emplearse para emular un puerto serie, lo cual puede proveer una terminal UART virtual.

IMPLEMENTACION DE COMUNICACIN USB EN


UN MICROCONTROLADOR PIC18F4550

El empleo de un lenguaje de programacin de alto nivel es de gran ayuda para la implementacin de


funciones USB en el microcontrolador, esto debido a que CCS cuenta con funciones para la
inicializacin y el control del mdulo USB del PIC.

Requerimientos

Un microcontrolador que soporte comunicacin va USB


Un programa en el microcontrolador para transmitir la informacin.
Una computadora con puerto USB.
Driver en la computadora anfitrin.
Programa para leer los datos del dispositivo externo
Descripcin general del mdulo USB en el PIC18F4550

El PIC18FX550 contiene un USB Serial Interface Engine (SIE) compatibles con alta y baja
velocidad el cual permite una rpida comunicacin entre el USB anfitrin y el microcontrolador.
La SIE puede ser conectada directamente al USB, utilizando un transceptor interno, aunque tambin
es posible emplear un transceptor externo.
Algunas caractersticas especiales de hardware han sido implementadas para mejorar el
rendimiento. Una memoria de doble puerto ha sido implementada (USB RAM) para compartir acceso
directo el ncleo del microcontrolador y la SIE. Un puerto paralelo de streaming se ha provisto para
soportar la transferencia ininterrumpida de largos volmenes de informacin, como datos
asncronos.
Diagrama de la organizacin interna del mdulo USB

17.2 USB STATUS AND CONTROL

L a operacin del USB es configurada a travs de 3 registros, adems un total de 22 registros estn
involucrados para el manejo de la informacin USB, los ms importantes son:

USB CONTROL REGISTER (UCON)


USB CONFIGURATION REGISTER (UCFG)
USB TRANSFER STATUS REGISTER (USTAT)
USB DEVICE ADRESS REGISTER (UADDR)

17.10.5 ENUMERATION

Cuando el dispositivo es inicialmente conectado al bus, el anfitrin comienza el proceso de


enumeracin, en un intento por reconocer el dispositivo, esencialmente el anfitrin interroga al
dispositivo, obteniendo informacin como el consumo energtico, tamao y muestreo de datos,
protocolo e informacin descriptiva, los descriptores contienen esta informacin. Un proceso tpico
de enumeracin ocurra de la siguiente manera:
El Host es el encargado de detectar cualquier dispositivo que se conecta al bus. Cuando un
dispositivo es detectado el Host necesita obtener informacin sobre el, a este proceso es al que se le
llama enumeracin. Esta informacin que necesita el Host se encuentra definida en el dispositivo en
los llamados descriptores. Los descriptores son datos que se guardan en la memoria no voltil del
PIC y contienen la siguiente informacin: El ID del vendedor (VID) y del producto (PID), consumo de
corriente del dispositivo, tipo de transferencia que se va ha utilizar, endpoint utilizados, versin USB
soportada, clase utilizada, etc.

El VID (Vendor ID) y el PIC (Product ID) son dos nmeros de 16 bits representados en Hexadecimal,
si se va a emplear la clase CDC (Communications Device Class) de CCS para la comunicacin USB
estos valores los podemos modificar en el archivo "usb_desc_cdc.h" y segn el sistema operativo
instalado en el Host deberemos modificarlos tambin en el archivo .inf .
Realmente el modificar estos valores solo es til si se quiere distribuir el producto comercialmente,
en ese caso existe una organizacin llamada USB Implementers Forum que se encarga de
proporcionarnos previo pago correspondiente (creo que unos 1500 $) un VID valido para que nuestro
dispositivo conviva sin problemas con el resto de dispositivos USB del mercado, adems tendremos
derecho a poner el logo USB en nuestro producto certificando de esta manera que ha pasado los
controles pertinentes y cumple con el estndar USB.

Si esto no estuviera regulado tal y como est y cada dispositivo tuviera el VID y PID que quisiera,
cuando coincidieran en un mismo sistema dos nmeros iguales se presentara un conflicto hardware
y ambos dispositivos dejaran de funcionar.

17.10.6 DESCRIPTORS

Existen 8 tipos distintos de estndares para los descriptores

17.10.6.1 DEVICE DESCRIPTOR

Este descriptor provee de informacin de informacin general, como el fabricante, el nmero del
producto, el nmero de serie, la clase del dispositivo as como el nmero de configuraciones, solo
existe un descriptor de este tipo.

17.10.6.2 CONFIGURATION DESCRIPTOR

Este descriptor provee de informacin como los requisitos energticos del dispositivo, y cuantas
distintas interfaces son soportadas en esta configuracin, puede haber ms de una configuracin
para el dispositivo.

17.10.7 BUS SPEED

Cada dispositivo USB debe indicar la presencia de su bus y la velocidad al anfitrin, esto se logra a
travs de una resistencia de 1.5Kohms, el cual es conectado al bus al momento de conectar
fsicamente el dispositivo USB.
Dependiendo de la velocidad del dispositivo, el resistor pone en estado de PULL-UP la lnea D+ D-
a 3.3V, para el modo de baja velocidad la resistencia se conecta en D-, mientras que en el modo de
alta velocidad se conecta del lado de D+.

17.10.8 CLASS SPECIFICATIONS AND DRIVERS

Las especificaciones del USB incluyen especificaciones de clases los cuales son respaldados
opcionalmente por los fabricantes de los sistemas operativos. Ejemplos de clases soportadas son
Audio, Mass storage, Comunications and Human Interface (HID)
En la mayora de los casos, un driver es requerido en el anfitrin para poder comunicarse con el
dispositivo USB, en aplicaciones especiales, un driver tendra que ser desarrollado en conjunto.
Afortunadamente existen gran cantidad de drivers disponibles para las clases de dispositivos ms
comunes.

Funciones del oscilador para comunicacin USB

El microcontrolador PIC18F4550 cuenta con mltiples opciones para la


generacin de la oscilacin necesaria para su correcto funcionamiento, es
capaz de operar con cristales, osciladores RC, entradas externas de reloj y con
el oscilador interno RC.
Sin embargo para establecer la comunicacin USB de alta velocidad se
recomienda al empleo de cristales de cuarzo, los cuales presentan una mejor
estabilidad de frecuencia para un amplio margen de temperaturas.
El modulo oscilador interno del microcontrolador cuenta con un Lazo de
seguimiento de fase PLL, el cual proporciona una salida de 96MHz al
ingresarle una onda de 4MHz, esto aunado a un preescaler a la entrada del PLL
nos permite emplear una gran variedad de cristales para el funcionamiento de
nuestro circuito.
En la siguiente imagen se presenta el circuito oscilador del PIC, se encuentran
marcados los valores de ejemplo para la configuracin del oscilador para
cristales de 20MHz.
La frecuencia de oscilacin de 20Mhz entra al preescaler del PLL, este permite
dividir la frecuencia entre 1,2,3,4,5,6,10 y 12, el #fuse asociado es el PLLDIV,
posteriormente la seal toma 2 caminos.
Un camino pasa por un divisor de frecuencia (f/2) para luego ir a un MUX
asociado al fuse USBDIV, al emplear el fuse USBDIV indicamos al
microcontrolador que la frecuencia proveniente del PLL es la que emplearemos
para el modulo USB, en caso contrario la frecuencia proveniente de la entrada
se utilizara en dicho modulo.
El otro camino que toma loa salida del PLL pasa por un postcaler, el cual
permite dividir los 96MHz de salida del PLL entre 2,3,4 y 6 para su empleo en el
resto de las funciones del microcontrolador.

Diagrama interno del preescaler

Libreras de CCS

El compilador CCS cuenta con libreras creadas para la configuracin y el manejo del mdulo USB
del microcontrolador, para la correcta programacin de la comunicacin USB es necesario mandar a
llamar varias libreras dentro de CCS. En el siguiente diagrama se muestra la interrelacin que
existen ntrelas distintas libreras.

Diagrama que muestra las relaciones entre las distintas libreras para manejo del puerto USB en
CCS

usb_cdc.h

Librera para crear un puerto COM virtual en la PC sobre USB, empleando la especificacin CDC, al
emplear este archivo en el cdigo, se agregaran las interrupciones y descriptores requeridos.
Esta librera crea un link virtual RS-232 entre la PC y el PIC, por lo que en esta librera
encontraremos funciones similares a aquellas empleadas para el manejo de datos de entrada y
salida del tipo UART.

usb_cdc_kbhit() Regresa un valor verdadero si existe uno o ms caracteres recibidos y


esperando en el buffer de entrada.

usb_cdc_getc() Obtiene un carcter del buffer de entrada, si no hay datos en el buffer


esperara hasta que se presenten, si no se quiere esperar en un bucle infinito se debe
emplear la instruccin usb_cdc_kbhit() primero para checar que existen datos antes de
mandar a llamar con la instruccin usb_cdc_getc().

usb_cdc_putc(char c) Pone un carcter en el buffer de salida, si est lleno espera a que


se vaci antes de colocar el carcter en el buffer, este buffer es ledo por la computadora
muy rpido, as que el buffer solo se encontrara lleno unos milisegundos, si esto le preocupa
y no quiere quedarse en un bucle infinito use usb_cdc_putready() para cerciorarse que
exista lugar en el buffer se salida.

usb_cdc_puts(*ptr) Enva el comando de cadena terminada al buffer de salida, a


diferencia de usb_cdc_putc() o usb_cdc_putc_fast(), esta rutina acomodara la cadena en
un solo paquete (mientras que las otras rutinas empujaran el paquete tan pronto como se
libere el endpoint). Esta funcin regresa un valor verdadero si el paquete se envi y falso si
el buffer aun se encuentra en uso. Podra dejar de copiar caracteres del apuntador (ptr) al
buffer de endpoint una vez que este est lleno, pero aun as podra regresar un valor
verdadero.

usb_cdc_putready() Regresa un valor verdadero si hay espacio disponible en el buffer de


salida para un carcter mas.

usb_cdc_putempty() Regresa un valor verdadero si el buffer de salida se encuentra vaco


y ha transmitido toda la informacin a la PC.

usb_cdc_connected() Regresa un valor verdadero si se recibi set_line_coding,en


muchos programas de terminal serial (como hyperterminal), estos envan un mensaje
set_line_coding cuando el programa inicia y este abre el puerto COM, esta es una
manera sencilla de determinar si la PC esta lista para desplegar los datos en el programa de
terminal serial, pero no se garantiza que funcione todo el tiempo o que funcione en otras
terminales virtuales.
usb_cdc_putc_fast(char c) Similar a usb_cdc_putc(), a excepcin que si el buffer de
salida esta lleno omitir la cadena.

usb_cdc_line_coding Una estructura usada para set_line_coding y get_line_coding, la


mayor parte del tiempo puedes ignorar esta instruccin.

usb_cdc_break Si la PC ha enviado el comando BREAK, esta podr mantenerse el


tiempo de interrupcin (BREAK TIME en ms), si la PC enva un valor de 0xFFFF el
dispositivo debe mantener la interrupcin hasta que se le envi un valor de 0.

usb_cdc_carrier donde se almacena el valor de (set_control_line_state).

usb_cdc_serial_state(state) Transmite al anfitrin el SERIAL_STATE (estado serial), este


contiene informacin como DCD, DSR, ring, break y ms.

Las siguientes funciones tambin son provista, y son puertos de las funciones de entrada y salida en
input.c

get_float_usb() Lee un numero tipo float del usuario


get_long_usb() Lee un numero tipo long del usuario
get_int_usb() Lee un numero tipo entero del usuario
get_string_usb(char *s, int max) Lee una cadena del usuario
gethex_usb() Lee un byte en hexadecimal del usuario
gethex1_usb() Lee un character hexadecimal

USB_CDC_ISR() puede ser definido si se desea una rutina especfica para se llamada cuando hay
datos entrantes del puerto COM virtual. Esto es til si se quiere actualizar de cdigo antiguo RS232,
en donde se empleaba #int_rda para manejarlos datos entrantes en el RS232 ISR.

Normalmente usb_cdc_putc() y usb_cdc_putc_fast trataran de descargar los datos tan pronto sea
posible, sin embargo esto en ocasiones puede llegar a ser bastante ineficiente y podra descargar
paquetes con 1 byte.

La opcin US_CDC_DELAYED_FLUSH tratara de descargar al inicio de usb_cdc_putc() y


usb_cdc_putc_fast() si el buffer local se encuentra lleno, esta funcin tambin tratara de descargar
el paquete en cada llamado a usb_task().
Es recomendable que solo se emple esta funcin si se cuenta con un loop principal que
peridicamente llame a usb_task().
Este driver cargara el resto del cdigo para USB, y establecer los descriptores que adecuadamente
describirn el dispositivo como CDC para una terminal COM virtual, esto se hace con una llamada a
la librera usb_desc_cdc.h

TAMAOS DEL BUFFER

USB_CDC_DATA_IN_SIZE controla el tamao del buffer de salida, el tamao total del buffer de
salida ser ((USB_CDC_DATA_IN_SIZE*2)-1).Los dispositivos de alta velocidad (full-speed)
limitaran este valor a 64.

Para incrementar el tamao del buffer local del PIC tambin se puede definir
USB_CDC_DATA_LOCAL_SIZE, si este se define entonces el tamao total del buffer de salida ser
USB_CDC_DATA_LOCAL_SIZE+USB_CDC_DATA_IN_SIZE.

Si USB_CDC_DATA_LOCAL_IN_SIZE no se define, se emplea un valor por default de 64, si


USB_CDC_LOCAL_SIZE no se define, esta opcin no es empleada.

LIMITACION DE LAS INTERRUPCIONES

Esta seccin solo es relevante si se est empleando interrupciones USB y no la opcin


USB_ISR_POLLING.

El manejo del puerto USB es complejo, comnmente requiere el envio de muchos paquetes para
completar la transferencia de un bloque de datos, la mayor parte de este proceso se realiza en la
USB ISR, es por eso que no puedes llamar usb_cdc_putc() dentro de otra ISR, USB ISR o cuando
las ISRs estas inhabilitadas.

Para resolver este problema usa usb_cdc_putc_fast() y la opcin USB_CDC_DELAYED_FLUSH,


aunque esta no es la mejor opcin porque si se emplea usb_cdc_putc_fast() para desbordar el buffer
de salida los datos se perdern.

CONFIGURACION DEL PUERTO RS-232 VIRTUAL

Dentro de esta librera es posible cambiar las caractersticas de la comunicacin serie, al llamar la
rutina de inicializacin esta asigna los valores preestablecidos, es posible cambiarlos en la librera
para as tener ms control de cmo queremos que sea la comunicacin serie.
Captura de pantalla de la seccin del archive usb_cdc.h donde podemos configurar valores de la
comunicacin serie como lo son la velocidad del puerto en bps, paridad y bits de datos

Descriptores

usb_desc_cdc.h

La librera usb_cdc.h hace un llamado a usb_desc_cdc.h que es la librera encargada de asignar los
descriptores del dispositivo.
En esta seccin es posible configurar los descriptores de dispositivo, de configuracin, de cadena,
de interfaz, con el fin de lograr desarrollar un producto acorde a las necesidades del desarrollador.
Cuando un dispositivo USB es conectado se identifica a si mismo al anfitrin a travs de la
combinacin del PID y el VID, el VID es un numero de 16bits del vendedor, el PID es un numero de
16 bits del nmero de producto, la PC emplea esta combinacin para encontrar los drivers a
emplear.
Esta librera no cuenta con instrucciones, solo es para definir los descriptores, para este caso
emplearemos como VID el 0X04D8 que es el nmero que define al dispositivo como un producto de
Microchip, como PID emplearemos el 0x0007, este queda a consideracin del desarrollador, sin
embargo conviene investigar un poco si la combinacin PID/VID a emplear no causara conflictos con
dispositivos registrados.
Captura de pantalla de la seccin del archivo usb_cdc_desc.h donde podemos modificar los
valores PID y VID.

En la siguiente parte podemos definir la informacin que es desplegada por el wizard de WINDOWS
agregar hardware

Captura de pantalla de la seccion del archive usb_cdc_desc.h donde podemos modificar los
valores de las cadenas de texto.

Al modificar las cadenas de texto debemos de tener en cuenta establecer el tamao de las mismas,
asi como el offset de todas las cadenas respecto al inicio
1. El offset indica el inicio de cada cadena, es decir, tendr tantos elementos como cadenas
tenga el descriptor, para este caso 3, o indica el inicio de la primera cadena, que es la que
define el idioma, como esta tiene una dimensin de 4bytes el siguiente offset es de 4 y
como la segunda cadena tiene una dimensin de 8bytes el tercer offset es la suma de las 2
dimensiones (12).

2. Por default el descriptor viene con el descriptor para el idioma ingles 0x0409, sin embargo si
quieren usarse smbolos especiales de algn otro idioma, debe indicarse en esta parte el
idioma a emplear.

3. La longitud de la cadena incluye el comando de trmino NULL , por lo que al nmero de


caracteres de la cadena debemos de sumarle 2 bytes.

Programas de generacin de descriptores y archivos


.inf

Aunque se puede optar por modificar el archivo de los descriptores usb_cdc.h manualmente con la
ayuda de algn editor de texto, tambin se tiene la opcin de emplear programas especializados
para tal fin.
Uno de ellos es el denominado INF Enumeracin Datos uC PIC-USB el cual podemos encontrarlo
gratuitamente en la red, este programa est diseado para generar los archivos de los descriptores y
el archivo inf.
Captura de pantalla del programa

El programa nos permite definir: nombre de la categora, VID, PID, la Ubicacin, Descripcin
Fabricante, Versin y Fecha, por default esta seleccionada la opcin de PICC CCS como lenguaje
de programacin, adems nos permite seleccionar el tipo de transferencia que emplearemos para la
comunicacin USB, nos da la opcin de emplear un archivo multipropsito o uno especializado para
RS-232 sobre la clase CDC.
Al guardar debemos de seleccionar previamente la opcin de guardar ambos, la cual nos permitir
guardar el archivo del descriptor para emplearlo en la compilacin en CCS y el archivo mchpcdc.inf
para indicarle al sistema operativo que Controlador debe instalar con el dispositivo.
DRIVER

Descripcin general

Un driver o tambin conocido como controlador de dispositivo es un programa informtico el cual


permite al sistema operativo interaccionar con un perifrico, haciendo una abstraccin de hardware y
proporcionando una interfaz para su uso.
Existen tantos tipos de controladores como tipo de perifricos, y es comn encontrar ms de un
controlador disponible para el mismo dispositivo, cada uno ofreciendo distintas funcionalidades,
entre los principales encontramos los oficiales (disponibles en la pgina del fabricante), los
proporcionados por el sistema operativo y versiones hechas por terceros.
Si el firmware de nuestro dispositivo no cumple con las especificaciones de alguna de las clases
beneficiadas por el uso de drivers genricos instalados en WINDOWS, la nica opcin es disear el
driver para nuestro dispositivo, si no la PC nunca lo reconocer.
Disear un driver desde cero es complicado ya que se requieren conocimientos de arquitectura de
PC, as como del sistema operativo, para evitar el desarrollo de un driver emplearemos un driver
genrico de microchip.
El driver que proporciona microchip consta de los siguientes archivos

mchpusb.sys es el archivo binario

mchpusb.ini este archivo contiene la informacin del driver y es requerido por el sistema
operativo para la primera conexin, para que el S.O. determine que driver asignarle al
dispositivo, adems el S.O. obtiene informacin de aqu para configurar correctamente el
dispositivo, este es un archivo de texto que se puede editar, en si debemos de hacer que los
valores del VID y el PID coincidan con el de nuestro dispositivo, adems es posible editar
algunas cadenas de texto que se mostraran como informacin del dispositivo una vez
instalado el driver

DLL mpusbapi una DLL es una capa de software, que en este caso facilita por medio de
funciones la comunicacin entre la aplicacin de escritorio y el driver del dispositivo.

usbser.sys es el driver genrico de Windows para brindar servicios tipo modem via USB,
las seales de los mdems DSL y seales RS-232 son parecidas, asi que tambin sirve para
crear un puerto COM virtual.
Servicio Plug & Play de Windows

En computacin un servicio de Plug and Play es una especificacin que facilita la integracin de
nuevo hardware en la PC anfitrin, sin la necesidad de configurar el dispositivo o la intervencin del
usuario para resolver conflictos.
La instalacin de un nuevo dispositivo en Windows implica tres pasos:
1. Conectar el dispositivo al equipo
2. Cargar los controladores del dispositivo correspondientes
3. Configurar las propiedades y los valores del dispositivo

Una vez que se conecta un nuevo dispositivo el servicio Plug and Play de Windows solicita
informacin a este, generalmente son los descriptores (PID, VID) los cuales le indicaran al sistema
operativo de que dispositivo se trata en cuestin.

Administrador de dispositivos

Si es exitoso este procedimiento el dispositivo en cuestin aparecer en el administrador de


dispositivos, como hardware desconocido, en ese momento se dice que el nuevo dispositivo ha
sido enumerado por el sistema operativo, el cual crea un registro con las caractersticas dadas por el
dispositivo y es guardado en HKEY_LOCAL_MACHINE\CurrentControlSet\Enum.
Windows cuenta con drivers genricos, as como drivers de los dispositivos de entrada y salida ms
comunes en el mercado, por lo que si no se conect algn dispositivo considerado por Windows el
servicio de Agregar nuevo hardware empezara una bsqueda del mismo en Windows Update, en
base a los descriptores obtenidos.
Si no se encuentra con el controlador en la base de datos de Windows, el servicio Agregar nuevo
hardware pasa a revisar una base de archivos .inf dentro del propio Windows, esta base de archivos
se encuentra en Windows\inf.
Si en dicha carpeta no se encuentra un archivo inf que corresponda con las caractersticas del
dispositivo, Windows nos solicitara la introduccin manual de la ruta del controlador.
En este punto queda a criterio del desarrollador decidir de que manera proceder con la instalacin de
sus dispositivo, es decir, se pueden emplear nmeros PID, VID genricos para que la instalacin se
realice con los archivos propios de Windows, se puede instalar manualmente o se puede agregar el
archivo inf a Windows de antemano para que la instalacin del controlador sea sin intervencin del
usuario.
Captura de pantalla del registro hecho al enumerar el dispositivo

Creacin del instalador del controlador con


INSTALLSHIELD

Una opcin es incluir algn medio con el dispositivo el cual cuente con un programa de instalacin,
el cual se encargue en automtico de garantizar la correcta instalacin del controlador del
dispositivo.
Dado que en el dispositivo a desarrollarse se emplearan descriptores propios, los servicios de
Windows no sern capaces de instalarlo por cuenta propia, por lo que se hace necesario agregar el
archivo .inf que define el controlador a utilizar en el dispositivo a instalar.
Windows busca en varias carpetas en el equipo el archivo .inf necesario para la correcta instalacin
y configuracin del hardware nuevo, una de esas carpetas se encuentra en [DISCO
LOCAL]\Windows\INF.
Si de antemano colocamos nuestro archivo .inf en esta carpeta, Windows ser capaz de instalar el
dispositivo por su cuenta al conectar el dispositivo a la computadora anfitrin por primera vez.
Para automatizar este paso podemos hacer uso de software especializado en creacin de
instaladores, para este caso emplearemos la versin de prueba de INSTALLSHIELD 2014.
Captura de pantalla de INSTALLSHIELD 2014

Para comenzar daremos clic en File-New Project, lo cual nos desplegara la siguiente ventana

En esta ventana seleccionaremos la opcin Express Project, el idioma lo cambiamos a espaol y


nombramos el proyecto, despus dar clic en OK
Seleccionamos la pestaa de Installation designer, por default nos va a abrir la ventana de
General information, en esta debemos de Ingresar 3 datos.
1. En el campo Product name ingresamos el nombre del producto

2. En el campo INSTALLDIR damos clic y nos va a abrir mltiples carpetas del sistema donde
podemos colocar nuestros archivos, seleccionaremos la carpeta [WindowsFolder] y damos
clic nuevamente, ahora despus escribimos el nombre de la carpeta destino, en este caso
es la carpeta inf.

3. En el campo Tag Creator ID colocamos nuestro id con el formato: regid.AAAA-


MM.com.nombredepaginaweb

Posteriormente nos vamos a la ventana Files la cual est en el punto 2 Specify Application data
En esta seccin incluiremos los archivos que se van a instalar en la computadora anfitrin, es decir
el archivo inf que indicara a la computadora el driver que debe instalarse al conectar nuestro
dispositivo, posteriormente damos clic en el icono de la barra e hasta abajo que dice Installation
overview [1]
En esta pantalla tenemos la opcin de brindar ciertos requisitos o permisos al momento de ejecutar
el instalador, dado que nuestra instalacin solo colocara un archivo en una carpeta definida podemos
definir todas las opciones como no [2].

Posteriormente damos clic en el icono build aplication [1]

En esta pantalla dar clic en la opcin single executable [2] , el cual creara un solo archivo .exe
para la distribucin de la instalacin, por ultimo basta dar clic en Build installations [3] para que se
cree el archivo ejecutable en la carpeta que seleccionamos para guardar el proyecto.
El archivo ejecutable se encuentra en la ruta:
\NOMBREDELPROYECTO\Express\SingleImage\DiskImages\DISK1

Una vez creado el ejecutable este se puede distribuir de la manera que lo decida el desarrollador, no
necesita ningn software adicional, sin embargo debido a que realiza cambios en la carpeta de
Windows en algn momento de la instalacin solicitara privilegios de administrador.

A continuacin se muestran las capturas de pantalla del instalador.


Primera pantalla de bienvenida

Segunda pantalla donde se muestran los datos generales de la instalacin


Tercera pantalla, donde se muestra el progreso de la instalacin

Cuarta pantalla, donde se da por concluida la instalacin


IMPLEMENTACION

La implementacin de la comunicacin USB es posible realizarla mediante dispositivos diseados


para tal fin como lo es el controlador USB960X o mediante dispositivos embebidos que cuenten con
mdulo de comunicacin USB.
A continuacin se desarrollara la implementacin de la comunicacin USB en modo te transferencia
CDC mediante un PIC18F4550 para la realizacin de una terminal de simulacin RS-232.
Para la programacin se ha elegido el entorno de programacin PIC CCS, el cual es un compilador
C muy completo, debido a que cuenta con libreras integradas tanto para la realizacin de la
comunicacin USB como para la simulacin del puerto RS-232.

Programa de ejemplo

Para comenzar a trabajar con la implementacin del programa para comunicacin serie, primero
debemos de comenzar identificando los parmetros que deber llevar el archivo descriptor, entre los
que destacan:

Id de fabricante
Id de modelo
Corriente requerida al puerto USB
Versin
Tipo de transferencia

Estos datos pueden modificarse manualmente en el archivo: usb_desc_cdc.h, lo recomendable es


cambiar el nombre a este archivo para conservar los archivos originales con los que viene el
programa, adicionalmente se deber crear un archivo inf con los mismos datos para la correcta
instalacin del dispositivo por parte del sistema operativo.
Otro camino es emplear el programa de generacin de descriptores y archivos .inf, del cual se habla
en la pgina 31 de este manual.
Una vez obtenidos el archivo descriptor y el archivo inf, procedemos a la realizacin del programa en
CCS.

CODIGO FUENTE
#include <18F4550.h>
#fuses
HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
//El fuse HSPLL se emplea para activar la funcin del PLL en conjunto con un
crisal
//El fuse USBDIV le indica al microcontrolador que la frecuencia proveniente
del PLL ser la //utilizada para las funciones USB
//PLL5 indica la divisin del preescaler, esta es para el empleo de un cristal de
20MHz
//CPUDIV1 indica la divisin del postcaler, indica que el microcontrolador
trabajara con la frecuencia de salida del postcaler/2
#use delay (clock=48000000)
//La frecuencia empleada para el delay es de 48MHz debido al empleo del PLL y
posterior division //sobre 2
#define LCD_ENABLE_PIN PIN_C2
#define LCD_RS_PIN PIN_A4
#define LCD_RW_PIN PIN_A5
#define LCD_DATA4 PIN_A0
#define LCD_DATA5 PIN_A1
#define LCD_DATA6 PIN_A2
#define LCD_DATA7 PIN_A3
#include <KBD.C>
#include <LCD.C>
#include <usb_desc_cdc.h>
//En esta seccin se incluyen las libreras, entre ellas el archive de descriptores
de nuestro //dispositivo, el cual a su vez llama a las otras libreras USB

#BYTE TRISA = 0xF92


#BYTE PORTA = 0xF80
#BYTE LATA = 0xF89

#BYTE TRISB = 0xF93


#BYTE PORTB = 0xF81
#BYTE LATB = 0xF8A

#BYTE TRISC = 0xF94


#BYTE PORTC = 0xF82
#BYTE LATC = 0xF8B

//VARIABLES GLOBALES
char a,b;
//INICIO DE PROGRAMA
void main()
{
//INICIALIZACION DE LOS PUERTOS
setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
setup_adc(ADC_OFF );
setup_adc_ports(NO_ANALOGS|VREF_VREF);
setup_ccp1 (CCP_OFF);
setup_ccp2 (CCP_OFF);
port_b_pullups(TRUE);
//COMPROBACION DE FUNCIONAMIENTO DEL PIC
lcd_init();
delay_ms(100);
printf(lcd_putc, " Interfaz USB");
lcd_gotoxy(1,2);
lcd_cursor_on(1);
delay_ms(150);
//INICIALIZACION DE LIBRERIAS
usb_cdc_init();
//Inicializacion de la librera USB en modo CDC
usb_init();
//Inicializacion de las funciones USB
kbd_init();
//COMPROBACION DE CONEXION USB
if(usb_attached()==1)
{
while (TRUE)
{
a=kbd_getc();
if (a!= '\0')
{
printf(usb_cdc_putc, "%c", a );
output_high(PIN_C6);
delay_ms(10);
output_low(PIN_C6);
}
if (usb_cdc_kbhit()==1)
{
b=usb_cdc_getc();
if (b=='\b')
{
printf(lcd_putc, "%c", b );
printf(lcd_putc, " ");
}
printf(lcd_putc, "%c", b );
}
delay_ms(1);
}
}
}

Circuito

A continuacin se presenta el diagrama el diagrama de la terminal serie, el


cristal empleado es de 20MHz.
Simulacin

La simulacin en PROTEUS no fue posible, debido a que los drivers para la


simulacin USB solo estn disponibles para sistemas de 32 bits.
Prueba

Una vez armado el circuito y programado el PIC, se procede a la instalacin del


driver. El driver debe de instalarse antes de conectar el dispositivo, para que
Windows sea capaz de instalar los drivers requeridos.
Una vez instalada nos aparecer una terminal COM virtual en el administrador
de dispositivos.

Posteriormente procedemos a abrir una terminal un monitor de actividad serie


en la computadora.

Una vez establecida la conexin podemos comenzar a enviar y recibir datos por
nuestra terminal.