Introducción Al Bus Usb
Introducción Al Bus Usb
Introducción Al Bus Usb
• Baja velocidad (1.0): Soportado por las especificaciones 1.1, 2.0 y 3.0.Tasa
de transferencia de hasta 1,5 Mbit/s (188 Kb/s). Utilizado en su mayor parte
por dispositivos de interfaz humana (Human Interface Device), o HID en
inglés) como los teclados, los ratones (mouse), las cámaras web, etc.
• Velocidad completa (1.1): Soportado por USB 1.1, USB 2.0 y USB 3.0. Tasa
de transferencia de hasta 12 Mbit/s (1,5 MB/s). Ésta fue la versión más
rápida antes de la especificación USB 2.0.
Alta velocidad (2.0): Solo USB 2.0 y USB 3.0. Tasa de transferencia de hasta
480 Mbit/s (60 MB/s) pero con una tasa real práctica máxima de 280
Mbit/s (35 MB/s). Ejemplo transmisiones de video.
Superalta velocidad (3.0): Sólo soportado en dispositivos USB 3.0 Tiene una
tasa de transferencia de hasta 4,8 Gbit/s (600 MB/s). La velocidad del bus es
diez veces más rápida que la del USB 2.0, debido a que han incluido 5
contactos adicionales, desechando el conector de fibra óptica propuesto
inicialmente, y es compatible con los estándares anteriores. En octubre de
2009 la compañía taiwanesa ASUS lanzó la primera placa base que incluía
puertos USB 3.0, tras ella muchas otras le han seguido y actualmente se ve
cada vez más en placas base y portátiles nuevos, conviviendo junto con el
USB 2.0. Otra de las características de este puerto es su "regla de
inteligencia": los dispositivos que se enchufan y después de un rato quedan
en desuso, pasan inmediatamente a un estado de bajo consumo.
Un bus USB soporta hasta 127 dispositivos (limitado por un campo de direcciones
de 7 bits teniendo en cuenta que la dirección 0 no se utiliza, ya que tiene un
propósito especial) conectado a través de una cable serie de cuatro hilos de hasta
tres o incluso cinco metros de longitud. Muchos dispositivos USB pueden ser
conectados al mismo bus usando hubs, los cuales pueden tener 4, 8, o incluso 16
puertos.
Un dispositivo puede ser conectado a un hub que se conecta a otro hub, y así
sucesivamente. El número máximo de niveles permitido es de seis. De acuerdo con
la especificación, la distancia máxima de un dispositivo a su host es de unos treinta
metros, realizada usando cinco hubs. Para la comunicaciones de mayor distancia,
se recomienda otros métodos como el uso de Ethernet.
USB es una interfaz de cuatro hilos implementada usando un cable blindado con
impedancia de 90 Ω ± 15% . Las señales USB se transmiten utilizando un par de
hilos denominados D+ y D-, utilizando señalización diferencial en half duplex
excepto el USB 3.0 que utiliza un segundo par de hilos para realizar una
comunicación en full Duplex. La razón por la cual se realiza la comunicación en
modo diferencial es simple, reduce el efecto del ruido electromagnético en
enlaces largos.
Cuenta con tecnología "Plug&Play" la cuál permite conectar, desconectar y
reconocer dispositivos sin necesidad de reiniciar ó apagar la computadora. Este
puerto sólo admite la conexión de dispositivos de bajo consumo, es decir, que
tengan un consumo máximo de 100 mA por cada puerto; sin embargo, en caso de
que estuviese conectado un dispositivo que permite 4 puertos por cada salida USB
(extensiones de máximo 4 puertos), entonces la energía del USB se asignará en
unidades de 100 mA hasta un máximo de 500 mA por puerto. Con la primera
fabricación de un PC con USB 3.0 en 2009, ahora tenemos 1 A por puerto, lo cual da
5 W en lugar de 0,5 A o 2,5Wcomo máximo.
CONECTORES USB
Los puertos USB 1.0 y USB 2.0 tienen 4 contactos, mientras que el puerto USB 3.0
cuenta con 9; usan tres tipos de conectores especificados como tipo A, tipo B y
MiniUSB.
1 VCC Rojo +5 V
2 D− Blanco Data −
3 D+ Verde Data +
Variante del
Puerto USB integrado en la Variante del puerto USB
puerto USB integrado en
tarjeta principal integrado en dispositivos
dispositivos grandes
("Motherboard") pequeños
En esta técnica de codificación de datos, NRZI (Non return to zero invert), el nivel
de la señal es invertida por cada cambio a un 0 lógico. El nivel de la señal para cada
1 lógico no es cambiada. Existe un bit de relleno (stuffing bit) para comprobar que
se está manteniendo una comunicación adecuada y depurar errores, este bit
stuffing consiste en generar una cambio en la señal cuando esta se mantenga en
uno "1" durante seis periodos consecutivos. En la siguientes figuras se observan la
codificación de datos en NRZI.
Codificación NRTZI
TERMINOLOGÍA USB
Stream Pipes: se trata de un flujo sin formato USB definido, esto significa qLos
acostumbrados a utilizar interfaces de comunicación más simples, como el RS-232,
se encuentra que en la comunicación USB aparecen una serie de términos nuevos
como: Endpoint, Pipes, Transacciones, Clases, Enumeración, Descriptores etc. que
al principio pueden resultar difíciles de entender, por lo que abordaremos
primeramente algunos de estos término:
Hub: Dispositivo que contiene uno o mas conectores o conexiones internas hacia
otros dispositivos usb, el cual habilita la comunicación entre el host y con diversos
dispositivos. Cada conector representa un puerto USB.
Puerto USB: Cada host soporta sólo un bus, cada conector en el bus representa un
puerto USB por lo tanto sobre el bus puede haber varios conectores , pero sólo
existe una ruta y sólo un dispositivo puede transmitir información a un tiempo.
Tuberías (Pipes): Es una conexión lógica o virtual entre un Endpoint del dispositivo
USB y el software del controlador del host (la PC) que se produce tras el proceso de
enumeración. Este enlace configura los parámetros asociados con el ancho de
banda, que tipo de transferencia se va a utilizar (Control, Bulk, Isocrona o Interrupt)
dirección del flujo de datos IN OUT y el máximo y/o mínimo tamaño de los
paquetes/buffers. Cada enlace está caracterizado por su banda de paso (Token), su
tipo de servicio, el número de punto terminal (EndPoint) y el tamaño de los
paquetes. Estos enlaces se definen y crean durante la inicialización del USB.
Siempre existe un enlace virtual 0 que permite tener acceso a la información de
configuración del periférico USB (estado, control e información). Los Pipes se usan
mucho en Sistemas Operativos como UNIX/LINUX para enlazar la salida de un
proceso con la entrada de otro, en este caso el concepto es el mismo. La norma
USB define 2 tipos de enlaces virtuales; stream y message.ue se puede enviar
cualquier tipo de dato. Este tipo de pipe soporta las transferencias bulk, isocronas, y
interrupt.
Message Pipes: este tipo de enlace virtual tiene un formato USB definido y sólo
puede soportar la transferencia Control.
COMUNICACIÓN USB
TRANSFERENCIAS USB
Control: Modo utilizado para realizar configuraciones. Existe siempre sobre el Punto
terminal 0 (EndPoint 0). Todos los dispositivos USB deben soportar este tipo de
transferencia.
Bulk: Este tipo transfiere grandes cantidades de datos. Estos datos son
normalmente mucho más numerosos que los transmitidos por la transmisión tipo
interrupción. Es usado normalmente por los dispositivos que necesitan transferir
cualquier cantidad de información sin pérdida de datos. Estas transferencias no
están garantizadas por el protocolo USB. Si no hay suficiente espacio en el bus para
enviar el paquete en su totalidad, se separan a través de múltiples transferencias
hacia o desde el dispositivo. Estos tipos son comunes en las impresoras,
almacenamiento y dispositivos de red.un ejemplo de esta aplicación. Si ésta no se
transmite correctamente, pueden llegar a oírse parásitos (glich) y la aplicación
puede detectar ciertos errores de los llamados underruns.
PAQUETES
ENUMERACION
Cuando un dispositivo USB es conectado al bus USB del Host, este es reconocido
por el Host a través de un proceso llamado Enumeración. Los pasos que se siguen
en el proceso de enumeración son los siguientes:
DESCRIPTORES
Todo dispositivo USB tiene una jerarquia de descriptores que describen varias
características del dispositivo: la identificación del fabricante, la versión de USB que
soporta, que dispositivo es, sus requerimiento de energía, el número y tipo de
endpoints, etc.
Los descriptores USB más comunes son:
• Descriptores de dispositivos: Contiene información sobre el máximo
tamaño de paquete que soporta el Endpoint0, cuántas configuraciones
soporta el Esclavo, y otra información. Es el primero que lee el Host.
• Descriptores de configuracion: Existe uno por cada posible forma de
operar del Esclavo (solo puede haber una configuración activa en un
determinado momento). Tiene información sobre cuántas Interfaces existen
por configuración.
• Descriptores de Interfaces: Tiene información sobre el número de
Endpoints (excepto el Endpoint0) que utiliza al Interface y sobre la Clase a la
que pertenece.
• Descriptores HID: Ideada con el propósito de englobar a dispositivos que
permitan la interacción del usuario (ser humano) con el Host. Mouse,
teclado.
• Descriptores de Endpoints: Existe uno por cada Endpoint de una Interface.
Tiene información sobre el número de Endpoint. También sobre el tipo de
Transferencia que realiza (Control, Interrupt, Bulk o Isochronous). Y también
tiene información sobre el tamaño máximo de paquete del Endpoint.
La Clase MSD
MSD (Mass Storage Device Class): Como su propio nombre indica es usada en
dispositivos de almacenamiento masivo como discos duros, memorias flash,
cámaras digitales, dispositivos ópticos externos como lectores y grabadoras de CD
y DVD, etc. Esta clase se puede utilizar solo en dispositivos que soporten
velocidades Full y High Speed. El tipo de transferencias utilizadas es Bulk o una
combinación formada por transferencias del tipo Control, Bulk y Interrupt. El CCS C
también implementa ejemplos sobre esta clase. No se necesita la instalación de un
driver específico, se utilizan drivers genéricos instalados ya en los Sistemas
Operativos, en Windows se utiliza el driver llamado usbstor.sys ubicado en
C:\Windows\Sistem32\drivers.
Existe una clase genérica llamada "Custom Class" que se utiliza cuando el
dispositivo no se asemeja a las características de ninguno de los miembros
pertenecientes a otras clases. un ejemplo de dispositivo que utiliza esta clase es el
ICD2 o ICD3 de Microchip.
USB EN WINDOWS
Si el firware de nuestro dispositivo no cumple con las especificaciones de alguna de
las clases que se benefician del uso de drivers genéricos ya instalados en el sistema
operativo, no queda otra que diseñar un driver para nuestro dispositivo, sino el
dispositivo no será reconocido por el PC. Diseñar un driver desde cero es muy
complicado ya que se requiere profundos conocimientos tanto de la arquitectura del
PC como del Sistema Operativo que tenga instalado. Afortunadamente ya hay
drivers personalizados que podemos utilizar en nuestros proyectos, algunos de ellos
son los siguientes:
La DLL mpusbapi: una dll es una capa software que en este caso facilita por medio
de funciones la comunicación entre la aplicación de escritorio y el driver del
dispositivo. Esta dll está compilada con el compilador de Borland C++ Builder 6.
Microchip facilita su código fuente, por lo que hay dos formas de utilizarla. Si
utilizamos el mismo IDE de Borland para crear nuestra aplicación de escritorio,
simplemente tendremos que añadir la librería (el archivo mpusbapi.lib) a nuestro
proyecto como una librería más. Si se utiliza otro compilador, se debe compilar de
nuevo los fuentes de la librería para obtener una nueva versión del archivo
mpusbapi.lib que sea compatible con el compilador utilizado. La otra opción de
utilización de la librería es añadirla a nuestro proyecto de forma dinámica, para ello
solo se necesita el archivo con extensión .dll (mpusbapi.dll) proporcionado también
por Microchip, de esta forma si utilizamos un compilador diferente como los que nos
proporciona Microsoft en su plataforma .NET u otros como LabVIEW, Matlab,
RealBAsic, etc. No tendremos que modificar el código fuente de la DLL,
simplemente la utilizaremos importando las funciones públicas de la DLL desde
nuestra aplicación de escritorio.
Microchip proporciona ejemplos de ambas formas. Como veis todo esto del USB da
pie a realizar las cosas de diferentes formas, más adelante en otro ejemplo veremos
estás dos posibilidades. Pero ¿por que utilizar esta opción y no utilizar siempre las
clase CDC, MSD o HID que a priori parece más fácil su utilización? Simplemente
porque utilizando un driver personalizado en vez de los genéricos que proporciona
Windows obtenemos una comunicación USB más versátil y con mayores
prestaciones. Por ejemplo, en cuanto a velocidad podremos alcanzar velocidades de
hasta 1MB/s frente a los 64 KB/s de la clase HID y los 80 kBytes/s de la clase CDC,
además el driver de Microchip soporta todos los tipos de transferencia (Control,
Isócronas, Interrup y Bulk), cosa que no ocurre igual si utilizamos las otras clases
como ya hemos visto.
En su última versión este driver está soportado por los siguientes sistemas
operativos: Windows 2000, Windows Server 2003, Windows XP, Windows XP 64,
Windows Vista, Windows Vista 64 y Windows 7.
cuando utilizamos el driver personalizado de Microchip los datos se transmiten en
raw (crudo) y la aplicación de escritorio intercambia información con el PIC
directamente a través de los enpoints utilizados por este, en este caso se usa un
protocolo de comunicación que a priori no está definido. Es importante que
copiemos del archivo .INF el valor del campo definido como GUI (Global Unique
Identifier), que es un número que sirve para que la aplicación pueda acceder al
dispositivo, luego accederemos a la dll desde el IDE que hallamos elegido para
desarrollar la aplicación de escritorio editaremos las propiedades y funciones
publicas de la dll buscando un campo que se llame GUI (o algo así) y si no coincide
tendremos que pegar ese número, si no lo hacemos no se podrá crear la tubería de
conexión (pipe) entre nuestra aplicación y el driver.
Cuando utilizamos la clase CDC esto no es necesario ya que la comunicación está
definida a través del puerto serie virtual creado y la información se transmite por
defecto en forma de caracteres ASCII al igual que un puerto serie físico.
Otros drivers que podemos utilizar para nuestro PIC 18fx550 son:
WinUSB: es el driver genérico para USB que propone utilizar Microsoft cuando
nuestro dispositivo no puede ser manejado directamente por los drivers que ya
incluye por defecto en su sistema operativo. Para ello al igual que Microchip
proporciona los siguientes archivos: Winusb.sys, Winusb.ini y la librería dinámica
Winusb.dll que al igual que la dll de Microchip nos proporciona una serie de
funciones públicas para acceder fácilmente al driver y a las APIs win32 de Windows
desde nuestra aplicación de escritorio.
Toda la información que proporcionada Microsof sobre este driver se puede
encontrar en el siguiente enlace.
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
USB en CCS C
CCS suministrar librerías para comunicar PIC con el PC utilizando el bus USB,
mediante perifericos internos (PIC18F4550 o el PIC16C765) o mediante dispositivos
externos al pic (del tipo USBN9603).
Las librerías suministradas son:
El VID (Vendor ID) y el PID (Product ID) son dos números de 16 bits representados
en Hexadecimal. Si se utiliza la clase CDC (Communications Device Class) de CCS
para la comunicación USB estos valores los podemos modificar en el archivo
"usb_desc_cdc.h", y si se utiliza la clase HID en el archivo “usb_desc_hid.h”. Según
el sistema operativo instalado en el Host, se debe modificar también en el archivo
.inf del driver utilizado.
/////////////////////////////////////////////////////////////////////////
//// ////
//// ex_usb_hid.c ////
//// ////
//// A simple demo that shows how to use the HID class to send ////
//// and receive custom data from the PC. Normally HID is used ////
//// with pre-defined classes, such as mice and keyboards, but ////
//// can be used for vendor specific classes as shown in this ////
//// example. ////
//// ////
//// The first byte sent by the PIC is the ADC reading ////
//// on channel 0 (AN0), the second byte is the status of the ////
//// pushbutton. The two bytes sent by the PC are LED on/off ////
//// toggle status. ////
//// ////
//// Hemos realizado un programa ejemplo para windows usando ////
//// visual basic express 10 que lee y escribe el dispositivo HID ////
//// de este ejemplo y que denominamos USBHID.exe, usa el controlador////
//// EasyHid mcHID.dll ////
/// ////
//// Normally this program sends and receives 2 bytes. These ////
//// sizes can be changed with USB_CONFIG_HID_TX_SIZE and ////
//// USB_CONFIG_HID_RX_SIZE. Changing these values will cause ////
//// hiddemo.exe to not work. ////
//// ////
//// This file is part of CCS's PIC USB driver code. See USB.H ////
//// for more documentation and a list of examples. ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// ////
//// ABOUT HID: ////
//// ////
//// HID devices are useful because HID drivers are generally ////
//// installed and supplied with modern operating systems. ////
//// However, since HID is a general device with general drivers ////
//// there are limitations to what a HID device can do: ////
//// ////
//// - A report (message) can't be larger than 255 bytes. ////
//// (A report or message != A packet) ////
//// ////
//// - On slow speed devices the max packet size is 8. ////
//// On a full speed device the max packet size is 64. ////
//// ////
//// - Data is obtained on the host / PC through polling the HID ////
//// device (PC polls the PIC) ////
//// ////
//// - On a full speed device, max polling rate is 1 transaction ////
//// per 1ms. This is 64000 bytes per second (64 byte packets ////
//// every 1ms). ////
//// ////
//// - On a slow speed device, max polling rate is 1 transaction ////
//// per 10ms. This is 800 bytes per second (8 byte packets every ////
//// 10ms) ////
//// ////
//// - No guarantee that polls will happen at a guaranteed rate. ////
//// If you want guaranteed transfer rate you must use Isochronous ////
//// transfers, which HID is not. ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// ////
//// WINDOWS DRIVERS: ////
//// ////
//// USB HID drivers come included with all Windows, starting ////
//// with Windows 98 and up. Windows 95 does not include USB ////
//// support, unless you are running Windows 95 Gold (aka OSR2, or ////
//// Windows 95b). ////
//// ////
//// If you plug in the USB device, and it is working, a "Found new ////
//// device" window should pop-up. The Add Device wizard then will ////
//// install the HID drivers automatically. ////
//// ////
//// If you plug in the USB device and do not get this window then ////
//// the device is not working, or USB does not work on your ////
//// computer. Goto the Device Manager (Right Click on my Computer, ////
//// it is located under one of the Tabs. It is located under the ////
//// Hardware tab of Windows2000), and make sure that "Universal ////
//// Serial Bus controllers" is installed. Open "Universal Serial ////
//// Bus controllers" and you should see 1 or more "USB Root Hubs". ////
//// If you see these then that's a good indication that USB is ////
//// working on your computer. If you see a question mark and ////
//// an unkown USB device then this is quite possibly your USB ////
//// device that is not working. ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// ////
//// NOTE ABOUT ENDPOINT BUFFER SIZE: ////
//// ////
//// Although this application sends and receives only 2 bytes from ////
//// the PC, this demo defines USB_EP1_TX_SIZE and USB_EP1_RX_SIZE ////
//// to 8 to allocate 8 bytes for these endpoint. These constants ////
//// are also used in the endpoint descriptor to specify the ////
//// endpoint max size. If you were concious of RAM savings you ////
//// could redefine these to 2 (or even 1!), but you would lose ////
//// throughput. The reason for throughput loss is that if you send ////
//// a packet that is the same size as the max packet size then ////
//// you need to send a 0 len packet to specify end of message ////
//// marker. The routines usb_puts() and usb_gets() send and ////
//// receive multiple packet message, waiting for a 0 len packet ////
//// or a packet that is smaller than max-packet size. ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// ////
//// VERSION HISTORY ////
//// ////
//// Oct 15th, 2010: ////
//// Potential bug in CDC that causes lost PIC->PC chars resolved? ////
//// Added initial 18F47J53 family support. ////
//// Added USB_ISR_POLLING support. Define this and interrupts ////
//// will not be used. usb_task() must be called periodically ////
//// in your main loop. If it is not called faster than once ////
//// per millisecond, USB may not work (PIC18 and PIC24 only). ////
//// ////
//// April 28th, 2010: ////
//// Added ex_usb_common.h. ////
//// Initial support for CCS PIC24USB board. ////
//// ////
//// March 5th, 2009: ////
//// Cleanup for Wizard. ////
//// PIC24 Initial release. ////
//// ////
//// June 20th, 2005: 18fxx5x initial release. ////
//// ////
//// March 22nd, 2005: Cleanup to work with PIC18Fxx5x ////
//// ////
//// June 24th, 2004: Cleanup to work with updated USB API ////
//// ////
/////////////////////////////////////////////////////////////////////////
#include <ex_usb_common.h>
new_connected=usb_attached();
new_enumerated=usb_enumerated();
if (new_enumerated)
LED_ON(LED1);
else
LED_OFF(LED1);
last_connected=new_connected;
last_enumerated=new_enumerated;
}
HW_INIT();
LED_OFF(LED1);
LED_OFF(LED2);
LED_OFF(LED3);
#ifdef __PCH__
uart_printf("\r\nPCH: v");
uart_printf(__PCH__);
#elif defined(__PCD__)
uart_printf("\r\nPCD: v");
uart_printf(__PCD__);
#else
uart_printf("\r\nPCM: v");
uart_printf(__PCM__);
#endif
usb_init_cs();
#if !(__USB_PIC_PERIF__)
uart_printf("\r\nUSBN: 0x%X", usbn_get_version());
#endif
uart_printf("\r\n");
setup_adc_ports(HW_ADC_PORTS);
setup_adc(HW_ADC_CONFIG);
set_adc_channel(HW_ADC_CHANNEL);
while (TRUE)
{
usb_task();
usb_debug_task();
if (usb_enumerated())
{
if (!send_timer)
{
send_timer=250;
out_data[0]=read_adc();
out_data[1]=BUTTON_PRESSED();
if (usb_put_packet(1, out_data, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE))
{
uart_printf("\r\n<-- Sending %u bytes:", USB_CONFIG_HID_TX_SIZE);
display_array(out_data, USB_CONFIG_HID_TX_SIZE);
}
}
if (usb_kbhit(1))
{
usb_get_packet(1, in_data, USB_CONFIG_HID_RX_SIZE);
uart_printf("\r\n--> Received %u bytes:", USB_CONFIG_HID_RX_SIZE);
display_array(in_data, USB_CONFIG_HID_RX_SIZE);
if (in_data[0]) {LED_ON(LED2);} else {LED_OFF(LED2);}
if (in_data[1]) {LED_ON(LED3);} else {LED_OFF(LED3);}
}
send_timer--;
delay_ms(1);
}
}
}
Programa Ejemplo para el PC utilizando HID
'*****************************************************************
' disconnect from the HID controller...
'*****************************************************************
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As
System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
DisconnectFromHID()
End Sub
'*****************************************************************
' a HID device has been plugged in...
'*****************************************************************
Public Sub OnPlugged(ByVal pHandle As Integer)
If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
ConState.Text = "HID Device Connect"
End If
End Sub
'*****************************************************************
' a HID device has been unplugged...
'*****************************************************************
Public Sub OnUnplugged(ByVal pHandle As Integer)
If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
hidSetReadNotify(hidGetHandle(VendorID, ProductID), False)
ConState.Text = "HID Device Disconnect"
End If
End Sub
'*****************************************************************
' controller changed notification - called
' after ALL HID devices are plugged or unplugged
'*****************************************************************
Public Sub OnChanged()
' get the handle of the device we are interested in, then set
' its read notify flag to true - this ensures you get a read
' notification message when there is some data to read...
Dim pHandle As Integer
pHandle = hidGetHandle(VendorID, ProductID)
hidSetReadNotify(hidGetHandle(VendorID, ProductID), True)
End Sub
'*****************************************************************
' on read event...
'*****************************************************************
Public Sub OnRead(ByVal pHandle As Integer)
' read the data (don't forget, pass the whole array)...
If hidRead(pHandle, BufferIn(0)) Then
' ** YOUR CODE HERE **
' first byte is the report ID, e.g. BufferIn(0)
TextBoxReceived.Text = Str$(BufferIn(1))
End If
End Sub
Imports System
Imports System.Threading
Imports System.Runtime.InteropServices
Module HIDDLLInterface
' this is the interface to the HID controller DLL - you should not
' normally need to change anything in this file.
'
' WinProc() calls your main form 'event' procedures - these are currently
' set to..
'
' MainForm.OnPlugged(ByVal pHandle as long)
' MainForm.OnUnplugged(ByVal pHandle as long)
' MainForm.OnChanged()
' MainForm.OnRead(ByVal pHandle as long)
' This is the procedure that intercepts the HID controller messages...
Private Function WinProc(ByVal pHWnd As Integer, ByVal pMsg As Integer, ByVal wParam As
Integer, ByVal lParam As Integer) As Integer
If pMsg = WM_HID_EVENT Then
Select Case wParam
End If
' next...
WinProc = CallWindowProc(FPrevWinProc, pHWnd, pMsg, wParam, lParam)
End Function
End Module
/////////////////////////////////////////////////////////////////////////
//// ////
//// ex_usb_serial.c ////
//// ////
//// A demonstration of the USB CDC API that is provided by CCS. ////
//// The USB CDC API that CCS provides will create a virtual UART ////
//// port. USB CDC drivers are included with most versions of ////
//// Microsoft Windows, and when properly loaded will create a COMx ////
//// port from which you can write and read to your PIC device ////
//// like any serial device that has a COMx port. ////
//// ////
//// This example creates a USB<->UART converter. Open ////
//// Hyperterminal to COM1 or putty(or whatever COM port is your ////
//// usual RS232 ////
//// serial COM port). Plug the PIC to USB. Open Hypertimernal to ////
//// the new COM port that is the USB<->UART COM port (for this ////
//// example say it is COM2). Typing a character in COM1 will cause ////
//// it to be sent out COM2, and vice-versa. ////
//// ////
//// See usb_cdc.h for API documentation. ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// ////
//// VERSION HISTORY ////
//// ////
//// July 1st, 2005: Initial Release. ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2005 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS ////
//// C compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, ////
//// reproduction or distribution is permitted without written ////
//// permission. Derivative programs created using this software ////
//// in object code form are not restricted in any way. ////
/////////////////////////////////////////////////////////////////////////
#if !defined(__PCH__)
#error USB CDC Library requires PIC18
#endif
#if __USB_PIC_PERIF__
#DEFINE LED1 PIN_A5
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#else //use the National USBN960x peripheral
#DEFINE LED1 PIN_B3
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif //endif check to see which peripheral to use
/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here. If you are
// not using connection sense, comment out this line. Without connection
// sense you will not know if the device gets disconnected.
// (connection sense should look like this:
// 100k
// VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
// |
// +----/\/\/\/\/\-----GND
// 100k
// (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
///only the 18F4550 development kit has this pin
#if __USB_PIC_PERIF__ && defined(__PCH__)
#define USB_CON_SENSE_PIN PIN_B2
#endif
/////////////////////////////////////////////////////////////////////////////
//
// Configure the demonstration I/O
//
/////////////////////////////////////////////////////////////////////////////
#define LED2 PIN_B4
#define LED3 PIN_B5
#DEFINE BUTTON PIN_A4
#define LED_ON output_low
#define LED_OFF output_high
/////////////////////////////////////////////////////////////////////////////
//
// usb_debug_task()
//
// When called periodically, displays debugging information over serial
// to display enumeration and connection states. Also lights LED1 based upon
// enumeration and status.
//
/////////////////////////////////////////////////////////////////////////////
void usb_debug_task(void) {
static int8 last_connected;
static int8 last_enumerated;
int8 new_connected;
int8 new_enumerated;
static int8 last_cdc;
int8 new_cdc;
new_connected=usb_attached();
new_enumerated=usb_enumerated();
new_cdc=usb_cdc_connected();
if (new_enumerated)
LED_ON(LED1);
else
LED_OFF(LED1);
if (new_cdc)
LED_ON(LED2);
else
LED_OFF(LED2);
if (usb_cdc_carrier.dte_present)
LED_ON(LED3);
else
LED_OFF(LED3);
last_connected=new_connected;
last_enumerated=new_enumerated;
last_cdc=new_cdc;
}
void main(void) {
char c;
LED_OFF(LED1);
LED_OFF(LED2);
LED_OFF(LED3);
#ifdef __PCH__
printf("PCH: v");
printf(__PCH__);
#else
printf("PCM: v");
printf(__PCM__);
#endif
printf("\r\n");
usb_init_cs();
#if !(__USB_PIC_PERIF__)
printf("USBN: 0x%X", usbn_get_version());
printf("\r\n\n");
#endif
while (TRUE) {
usb_task();
usb_debug_task();
if (kbhit()) {
c=getc();
if (c=='\n') {usb_cdc_putc('\r'); usb_cdc_putc('\n');}
if (c=='\r') {usb_cdc_putc('\r'); usb_cdc_putc('\n');}
else {usb_cdc_putc(c);}
}
if (usb_cdc_kbhit()) {
c=usb_cdc_getc();
if (c=='\n') {putc('\r'); putc('\n');}
if (c=='\r') {putc('\r'); putc('\n');}
else {putc(c);}
}
}
}
PROGRAMAS SNIFER
USBDeview
SnoopyPro