Clases en USB

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 10

Clases en USB: USB maneja muchas clases, como por ejemplo, audio, almacenamiento masivo, HID (Human Interface

Device) dispositivo de interfaz humana, de comunicacin, etc Tipos de Transferencias: Isochronus----permite mover grandes cantidades de datos con el tiempo de entrega asegurado pero no garantiza la integridad de los datos. Se usa por ejemplo en audio y video donde la perdida de pequeas porciones de datos no son criticas ya que es el nico tipo que no soporta retranmision automtica de datos recibidos con errores. No regresa un handshake. Bulk---------impresoras y los puertos COM virtuales lo usan, permite mover grandes cantidades de datos asegurando la integridad de estos, la desventaja es que no asegura el tiempo de entrega de los paquetes. Regresa un paquete Handshake, que contiene el cdigo que indica el xito o fracaso de la transaccin. Interrupt---se usa en HID, porque entrega los paquetes muy rpido (paquetes pequeos) por ejemplo en un raton o teclado usb no notas que tarda nada o que se retrase cuando escribes o mueves el raton. La desdentaja aqu es que no tiene correccin de errores. Regresa un paquete Handshake, que contiene el cdigo que indica el xito o fracaso de la transaccin. Control-----transporta las solicitudes estardar que hace un host para saber como instalar cada dispositivo. Todos los dispositivos deben soportar este tipo, y usa el pipe default y el endpoint cero, solo se necesita 1 endpoint para control a si que tener mas de uno es innecesario. Al necesitar enviar datos en ambas direcciones usa un IN y un OUT endopoint.

CDC es una clase que se encuentra dentro del protocolo USB, CDC (communications device class) o clase para comunicacin de dispositivos, abarca un gran rango de dispositivos incluyendo terminales ISDN, puertos COM virtuales, etc. Cada dispositivo debe tener un archivo .INF que contiene el Vendor ID y Product ID. Un puerto COM virtual usa el driver usbser.sys, para conectarse. Un dispositivo de comunicacin debe tener en su descriptor bInterface-Class = 0Ah para indicar que es una interface de datos, y para CCS est en usb_desc_cdc.h: //interface descriptor 1 (data class interface) USB_DESC_INTERFACE_LEN, //length of descriptor =44 USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04) =45 0x01, //number defining this interface (IF we had more than one interface) ==46 0x00, //alternate setting ==47 2, //number of endpoints ==48 0x0A, //class code, 0A = Data Interface Class ==49

0x00, //subclass code ==50 0x00, //protocol code ==51 0x00, //index of string descriptor for interface ==52 Un Puerto virtual emula un Puerto serial y las aplicaciones pueden usar ese Puerto para comunicarse como si estuvieran usando un puerto RS-232. Esto fue un poco de datos tcnicos, pero no me meter tanto en eso, aqu solo explicare como hacer un enlace, si necesita ms informacin tcnica, consulte el libro:

USB Complete: The Developers Guide, Fourth Edition by Jan Axelson

El VID y el PID que se encuentran dentro del mchpcdc (host), y el de la librera usb_desc_cdc deben de coincidir

#include "usb_cdc.h"-------esta llamada invoca la librera que incluye instrucciones de control para la comunicacin, y dentro de esta se llama a usb_desc_cdc, que es en la que se encuentra el VID y PID a sique dentro del cdigo basta con llamar a esta. #fuses XTPLL,..,PLL1, -------aqui declare que usare un crystal (yo use de 4 MHz) y PLL1 indica que no usare el divisor Phase Locked Loop, este divisor se usa por ejemplo si usaramos un cristal de 20MHz, tendramos que usar PLL5 ya que 20 entre 5 = 4,,,,, y el PLL divisor solo acepta 4 MHz,,,, es por esto que tendramos que dividir. El PLL acepta 4 MHz y entrega 96 MHz que luego divide entre 2 para obtener 48 MHz que son los que se necesitan en USB.

Dentro del PIC::::::::: USB dentro del PIC se maneja mediante una cosa llamada table descriptor o tabla de descriptores, esta tabla se ubica en el banco 4, se supone que todo el banco 4( desde 400h hasta 4ffh) debera estar llena de descriptores pero si no ocupas muchos descriptores puedes usar lo que te sobre de espacio para almacenar datos.

Y como saber cuales esta ocupados y cuales no en el banco 4???? USB indica como obligatorio un endpoint 0 para datos de control ( uno para entrada y otro para salida) y asi que en ese endpoint 0 se ocupan los primeros 8 bytes del banco 4. Porque 8 bytes????? Un buffer descriptor es asi::::

Como ven son 4 bytes: STAT---- se usa para conocer el estado del buffer CNT---- indica el tamao del buffer ADRL Y ADRH, se concatenan ( unen) para formar la direccin de inicio del buffer que apunta a otra direccin entre el banco 5 a 7 (o 4 si nos sobra espacio) en el ejemplo apunta a la direccin 0500h, que seria el inicio del banco 5, asique ese buffer empezara ahi,,, como es obvio ya no necesitamos la direccin de fin del buffer ya que con el tamao de CNT, nos damos cuenta en donde termina. Biennnn, esto es un buffer descriptor y cada uno ocupa 4 bytes. Y la tabla de descriptores (banco 4) estara llena de estos, lo cual nos indicara donde estn los datos de donde se guardan cuando llegan al PIC. Y esto para que nos sirve??? if(usb_cdc_kbhit()){------ lnea de cdigo del pic. Kbhit, es el que va a checar si dentro de la tabla hay un buffer con datos y regresa a decirle al PIC si hay datos o no. BIEN, ahora si por ejemplo solo usamos un endpoint de 64 KB, podemos declarar su buffer descriptor dentro del banco 4 y aun declarar su byte de inicio dentro del mismo banco 4. Esto es un problema dentro de los lenguajes de alto nivel ya que asumen que usaremos todo el banco 4 para descriptores.

AHORA, la aplicacin para comunicacin dentro de host (computadora) la hice en Visual Basic 2010, aunque bastara con la hyperterminal o en que trae ccs pero bueno eso ya es decisin de cada uno, y lo que haces es simplemente enviar texto como ASCII, en mi caso al nico puerto COM virtual que crea el PIC, ya que mi LAP no cuenta con puerto serial. La compilacin se puede hacer desde el mismo PCW o desde MPLAB, es cuestin de comodidad en el entorno de programacin.

CCS

mplab

CONECTANDO EL PIC Al conectar el PIC, nos pedir instalar el driver adecuado ya que Windows no encontrara el adecuado, y lo direccionaremos al mchpcdc, para que pueda instalar el nuevo dispositivo.

AL TERMINAR DE INSTALAR EN CONTROLADOR ya la PC reconoce que tenemoxs un nuevo puerto COM

codigo visual basic:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Imports System Imports System.ComponentModel Imports System.Threading Imports System.IO.Ports

Public Class Form1

Dim puerto As Array Delegate Sub settextcallback(ByVal text As String) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load puerto = IO.Ports.SerialPort.GetPortNames For i = 0 To UBound(puerto) selpuerto.Items.Add(puerto(i)) Next selpuerto.Text = selpuerto.Items.Item(0) desconectar.Enabled = False End Sub Private Sub conectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles conectar.Click SerialPort1.PortName = selpuerto.Text SerialPort1.BaudRate = 9600 SerialPort1.DataBits = 8 SerialPort1.StopBits = IO.Ports.StopBits.One SerialPort1.Parity = IO.Ports.Parity.None SerialPort1.Open() conectar.Enabled = False desconectar.Enabled = True End Sub Private Sub desconectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles desconectar.Click SerialPort1.Close() conectar.Enabled = True desconectar.Enabled = False End Sub Private Sub enviaa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles enviaa.Click SerialPort1.Write(data.Text) End Sub Private Sub enviab_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) SerialPort1.Write(12) End Sub Private Sub selpuerto_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles selpuerto.SelectedIndexChanged If SerialPort1.IsOpen = False Then SerialPort1.PortName = selpuerto.Text Else MsgBox("desconectar primero", vbCritical) End If End Sub End Class

codigo ccs

#include <18F4550.h> #fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN #use delay(clock=48000000) #include <lcd.c> #include "usb_cdc.h" void main() { char g; int i; usb_cdc_init(); usb_init(); lcd_init(); while(!usb_cdc_connected()) { lcd_putc("\fconectado"); delay_ms(400);} do{ lcd_putc("\f\n"); usb_task(); if (usb_enumerated()){ if(usb_cdc_kbhit()){ for(i=0;i<16;i++){ g = (usb_cdc_getc()); lcd_gotoxy(1+i,2); lcd_putc(g); delay_ms(30); } } } }while (TRUE); }

descarga codigos https://hotfile.com/dl/156646373/af0...b_cdc.rar.html descarga libros https://hotfile.com/dl/156646745/9ea89ae/book.rar.html

También podría gustarte