Autor Tema: Dudas USB y 12Mbps  (Leído 41641 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #30 en: 31 de Marzo de 2009, 19:38:55 »
Puff con razón  :D

Gracias Jeremy.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #31 en: 01 de Abril de 2009, 14:36:23 »
Todavía no logro echarlo a andar.

Ya modifiqué la función OpenPipes y aún así no me regresa handles válidos.



Mi programa en el pic es así...

Código: [Seleccionar]
while(TRUE)
   {
   if(usb_enumerated())
      {
      //Si la pc ya pidió el paquete
      if(usb_kbhit(1))
         {
         usb_get_packet(1, buffer_in, 2);
         //Si el comando es envío de muestras 0xee
         if(buffer_in[0]==0xee)
            envio_pend=1;
         }
      //Si hay envío pendiente y ya hay paquete de 50 bytes armado
      if((envio_pend)&&(apunta>49))
         {
         //Envía arreglo de mediciones
         usb_put_packet(1, buffer_out, 64, USB_DTS_TOGGLE);
         //En último byte de paquete indica las muestras que contiene
         buffer_out[63]=apunta;
         apunta=0;
         envio_pend=0;
         }     
      }   
   }

Lo que hace es enviar el paquete de 64 bytes solo cuando la pc lo pide (buffer_in[0]==0xee).

¿Hay algún otro detalle sobre el modo HID que yo esté ignorando? ¿Hay que hacer envíos en todo momento para mantener viva la conexión usb?

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #32 en: 01 de Abril de 2009, 22:05:26 »
migsantiago, has cambiado los drivers en el pic para configurarlo de Bulk a HID ?? Me refiero al archivo descriptor y el uso de los endpoints como USB_ENABLE_INTERRUPT y esas cosas.

Prueba tb modificando los pid y reinstalando todo d nuevo.

salu2.
« Última modificación: 01 de Abril de 2009, 22:10:49 por jeremylf »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5470
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #33 en: 02 de Abril de 2009, 13:30:35 »
Estoy haciendo la prueba con el modo HID y el programa para el pic ya funciona. El problema que tengo es que no he podido comunicarme con el PIC usando la mpusbapi.dll. Me ha funcionado bien con el modo bulk pero ahora con HID no sé qué pasa.

...

un par de preguntas:

¿con HID lograste hacer transferencias exitosas pc<->pic?

no entiendo porque mezclas bulk con hid, si el modo permitido en hid es interrupt.


....¿Hay algún otro detalle sobre el modo HID que yo esté ignorando? ¿Hay que hacer envíos en todo momento para mantener viva la conexión usb?

Aún no me he metido con la libreria HIDLibrary, pero esos pipes que ellos mencionan allí no tienen relación con la dll de microchip (para corroborar mira el source code de HIDLibrary)

la forma en la que la he probado, se basa en usar apis de windows, allí para iniciar una conexión, se llama  la api CreateFile.

una vez checado CreateFile, la única forma de cerrar el "pipe" es con la api CloseHandle


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #34 en: 02 de Abril de 2009, 14:46:16 »
migsantiago, has cambiado los drivers en el pic para configurarlo de Bulk a HID ?? Me refiero al archivo descriptor y el uso de los endpoints como USB_ENABLE_INTERRUPT y esas cosas.

Prueba tb modificando los pid y reinstalando todo d nuevo.

salu2.

Hola Jeremy y Pedro

Los drivers del pic ya están como HID, usé el archivo usb_desc_hid.h para configurarlo y el archivo principal está basado en el ex_usb_hid.c de CCS. EL VID&PID (04d8 y 0101) que uso, también ya está configurado en el descriptor hid. Adjunto el archivo usb_desc_hid.h por si ustedes creen que merece una 2da revisión.

http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=25188.0;attach=8839

Al conectar el PIC al puerto USB de la PC se reconoce como HID y Windows lo instala sin problemas; aparece en el administrador de dispositivos 2 veces (cosa rara).

Una dice HID\VID_04D8&PID_0101\6&3907A97F&0&0000
Y la otra dice USB\VID_04D8&PID_0101\5&11DAD59D&0&1



Mi problema está en que no logro comunicar el pic con mi aplicación en C# usando la mpusbapi.dll ni la HIDLibrary.  :8}
« Última modificación: 02 de Abril de 2009, 14:49:11 por migsantiago »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #35 en: 08 de Abril de 2009, 17:34:57 »
Hola

Descubrí que para implementar comunicaciones HID con reportes de envío y recepción mayores a 2 bytes no basta con declarar:

Código: [Seleccionar]
#DEFINE USB_HID_DEVICE  TRUE
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //allocate 8 bytes in the hardware for transmission
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE    8  //allocate 8 bytes in the hardware for reception

También hay que modificar el archivo descriptor en la parte de los reportes. El reporte INPUT es el tamaño de transmisión hacia la pc (punto de vista invertido) y el OUTPUT es el recibido por el pic. Las modificaciones están marcadas:

Código: [Seleccionar]
   const char USB_CLASS_SPECIFIC_DESC[] = {
      6, 0, 255,    // Usage Page = Vendor Defined
      9, 1,            // Usage = IO device
      0xa1, 1,       // Collection = Application
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum

      0x15, 0x80,        // Logical minimum (-128)
      0x25, 0x7F,        // Logical maximum (127)

      0x75, 8,        // Report size = 8 (bits)
      //0x95, 2,        // Report count = 16 bits (2 bytes)
      0x95, 64,        // Report count = 64 bytes (MODIFICACION)
      0x81, 2,        // Input (Data, Var, Abs)
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      //0x95, 2,        // Report count = 16 bits (2 bytes)
      0x95, 8,        // Report count = 8 bytes (MODIFICACION)
      0x91, 2,        // Output (Data, Var, Abs)
      0xc0            // End Collection
   };

Para probar mi programa estoy usando una aplicación que encontré llamada GenericHID en VC#:

http://www.lvr.com/hidpage.htm



El programa envía un reporte del tamaño declarado en el descriptor y recibe un reporte de parte del pic. Cuando yo no había configurado el descriptor, el programa se trababa y mandaba excepciones o a veces sólo indicaba que no pudo leer el reporte de entrada.

Ahora que ya entablo correcta comunicación con la pc tendré que estudiar el generichid para ver si lo puedo usar. Por ahora ya me quité de otro peso de encima :)

Si no, tendré que seguir probando con la mpusbapi.  :P
« Última modificación: 08 de Abril de 2009, 17:48:01 por migsantiago »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #36 en: 17 de Abril de 2009, 18:43:04 »
Ya logré comunicar el pic con la pc con esta configuración:

HID con polling in y out de 1ms (descriptor)
Endpoint 1
64bytes por paquete

El paquete lo envío hasta que acumulo 25 mediciones de la señal (2bytes x 25 = 50bytes). Lo curioso es que el pic no puede enviar paquetes cada 1ms, lo hace cada 1.73ms aproximadamente. Esto lo mido con osciloscopio y sabiendo que usb_put_packet confirma la entrega del paquete (regresa un bool = 1).

Código: [Seleccionar]
      //debug
      output_high(USBOK);
      //Pone el buffer en el endpoint y espera hasta que se haya enviado
      while(!(usb_put_packet(1, buffer_out, 64, USB_DTS_TOGGLE)));     
      //debug
      output_low(USBOK);

El retraso se debe en parte a que usb_put_packet hace muchas cosas:

Código: [Seleccionar]
int1 usb_put_packet(int8 endpoint, int8 * ptr, int16 len, USB_DTS_BIT tgl) { //done
   int16 j;
   int8 i;
   int8 * buff_add;   

   i=EP_BDxST_I(endpoint);
   if (!bit_test(i,7)) {

      buff_add=EP_BDxADR_I(endpoint);

      for (j=0;j<len;j++) {
         *buff_add=*ptr;
         buff_add++;
         ptr++;
      }

      return(usb_flush_in(endpoint, len, tgl));
    }
    else {
        debug_usb(debug_putc,"\r\nPUT ERR");
    }
    return(0);
}

Así es como entiendo lo que hace putpacket:
- Primero verifica si la SIE no está manipulando el arreglo del endpoint de envío (bit 7 de i UOWN)
- Luego obtiene la dirección ram de dónde empieza el arreglo del endpoint
- Luego copia byte por byte el arreglo que se va a enviar al arreglo del endpoint
- Por último, ejecuta usb_flush_in que hace lo siguiente:

Código: [Seleccionar]
int1 usb_flush_in(int8 endpoint, int16 len, USB_DTS_BIT tgl) {
   int8 i;

   debug_usb(debug_putc,"\r\nPUT %X %U %LU",endpoint, tgl, len);

   i=EP_BDxST_I(endpoint);
   if (!bit_test(i,7)) {

      EP_BDxCNT_I(endpoint)=len;

     debug_display_ram(len, EP_BDxADR_I(endpoint));

     #if USB_IGNORE_TX_DTS
      i=0x80;
     #else
      if (tgl == USB_DTS_TOGGLE) {
         i=EP_BDxST_I(endpoint);
         if (bit_test(i,6))
            tgl=USB_DTS_DATA0;  //was DATA1, goto DATA0
         else
            tgl=USB_DTS_DATA1;  //was DATA0, goto DATA1
      }
      else if (tgl == USB_DTS_USERX) {
         i=EP_BDxST_O(endpoint);
         if (bit_test(i,6))
            tgl=USB_DTS_DATA1;
         else
            tgl=USB_DTS_DATA0;
      }
      if (tgl == USB_DTS_DATA1) {
         i=0xC8;  //DATA1, UOWN
      }
      else if (tgl == USB_DTS_DATA0) {
         i=0x88; //DATA0, UOWN
      }
     #endif

      //set BC8 and BC9
      if (bit_test(len,8)) {bit_set(i,0);}
      if (bit_test(len,9)) {bit_set(i,1);}

      debug_usb(debug_putc," %X",i);

      EP_BDxST_I(endpoint)=i;//save changes

      return(1);
   }
    else {
         debug_usb(debug_putc,"\r\nPUT ERR");
    }
   return(0);
}

   + Vuelve a verificar si la SIE está haciendo algo con el endpoint
   + Escribe en un registro USB (CNTI) los bytes que se enviarán del arreglo del endpoint
   + Por último copia los 2 bits más significativos de len y los anexa a BDSTAT
   + Todo lo anterior solo si la SIE no está manipulando el endpoint, y regresará un 1
   + Si la SIE estaba trabajando, entonces no se ejecuta lo anterior y se regresa un 0

Todo esto toma mucho tiempo y pues talvez se pueda mejorar. Voy a ver si mejoro esta función y si logro un polling menor a 1.73ms. Todo basándome en el tema de Modulay en el que gestiona una parte de la interrupción USB. :mrgreen:
« Última modificación: 18 de Abril de 2009, 15:21:30 por migsantiago »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5470
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #37 en: 18 de Abril de 2009, 01:16:34 »
a eso es lo que microchip le llama overhead, todo el código que tiene que procesar de forma tranasparente al programador. siempre habrá overhead, la pregunta es si con los otros modos, podrás disminuir ese tiempo. :(

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #38 en: 18 de Abril de 2009, 15:10:45 »
a eso es lo que microchip le llama overhead, todo el código que tiene que procesar de forma tranasparente al programador. siempre habrá overhead, la pregunta es si con los otros modos, podrás disminuir ese tiempo. :(



Hey Pali, ¿a qué otros modos te refieres?

En el modo pingpong podría ahorrarme la copia del buffer a enviar hacia el buffer del endpoint, pero hay mucho que modificar para que el pingpong se habilite  :?
« Última modificación: 18 de Abril de 2009, 15:23:35 por migsantiago »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5470
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #39 en: 18 de Abril de 2009, 22:51:54 »
me refiero a bulk ó cdc.

cada vez reconozco que cualquier transmisión de datos sea por el puerto que sea debe ser asíncrona, es decir, aún la transmisión de datos en tiempo real se monta sobre un proceso asincrono, es como el tema de enviar voz sobre ip.

yo creo santiago que la clave es enviar mas datos en cada transacción para compensar el muestreo que quieres mantener.

hay que estudiar la posibilidad de usar los otros endpoints, no importa si usas hid, cdc o bulk por mpusbaapi.dll, ahora el problema no es enviar datos sino mantener el tiempo de muestreo máximo.




La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #40 en: 19 de Abril de 2009, 12:11:23 »
Sí, ahora solo uso 1 endpoint y con el máximo de 64bytes. Dame chance de escribir una función usb_put_packet súper ligera y luego veo si puedo implementar al menos un 2do endpoint.  :mrgreen:

Desconectado ElVale

  • PIC10
  • *
  • Mensajes: 31
Re: Dudas USB y 12Mbps
« Respuesta #41 en: 27 de Abril de 2009, 01:55:23 »
Esta discusión está interesante y la he seguido con atención aunque no la he entendido 100% ya que no estoy tan versado en USB como ustedes pero mi objetivo es al parecer el mismo: aclarar las dudas sobre la máxima velocidad de transmisión por USB. Al respecto comento que leyendo un pdf (AN1164) de microchip sobre implementación cdc en 18f4550 me llamó la atención un parrafo:

Citar
The following macros define the default line coding settings
that the CDC serial driver reports in response to
the host’s GET_LINE_CODING request. Keep in mind
that, in a USB environment, communication occurs at
speeds defined by the USB protocol and most hosts
will set the line coding parameters as desired. None the
less, the default values reported can be changed by
changing the following macros.
// Bit Rate
CDC_DEFAULT_BPS 115200

// 1 stop bit
CDC_DEFAULT_FORMAT 0
// No parity
CDC_DEFAULT_PARITY 0
// 8-bits per word
CDC_DEFAULT_NUM_BITS 8

Osea que los baudios que uno conoce en rs232 son solo una formalidad en cdc pero que en realidad uno pone lo que quiere, o mas bien lo que puede. A respecto encontré un post en un foro (link)en donde se expone como en teoría se pueden alcanzar hasta 700KB/s en cdc aunque no quedarían ciclos de CPU suficientes para hacer algo útil al respecto.

Respecto a los endpoints, leyendo el pic18_usb.h se tienen hasta 16 endpoints en el 18f4550, no lo he probado pero entonces llamando el MPUSBRead() con tamaño de buffer de 1024 al pic le llegarían 16 tokens por cada trama de 1ms serían 1048576 Bytes por segundo o más de 8Mbps. Referencia: link

Respecto a isocrono, bueno al parecer CCS está en pañales al respecto y por lo que he leído el data packet no es de 64 sino de 1023 bytes y no se pero parece que es un data packet por 1ms alcanzando los 8Mbps pero sin los tiempos muertos sin embargo como los 18f solo tienen 200 bytes de ram usb, esto no se puede.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #42 en: 27 de Abril de 2009, 11:02:53 »
Hola Vale

Cierto lo del modo CDC, en CCS se modifica en usb_cdc.h en esta sección:

Código: [Seleccionar]
void usb_cdc_init(void) {
   usb_cdc_line_coding.dwDTERrate=921600;
   usb_cdc_line_coding.bCharFormat=0;
   usb_cdc_line_coding.bParityType=0;
   usb_cdc_line_coding.bDataBits=8;
   (int8)usb_cdc_carrier=0;
   usb_cdc_got_set_line_coding=FALSE;
   usb_cdc_break=0;
   usb_cdc_put_buffer_nextin=0;
   usb_cdc_get_buffer_status.got=0;
   usb_cdc_put_buffer_free=TRUE;
}

El máximo que acepta la hyperterminal es de 921600. Si dividimos entre 10 (1 bit de inicio, 8 bits dato, 1 bit stop) tenemos 92160 bytes por segundo, 92.16kB/s.

Además el envío de este tipo es con velocidad no constante como lo vi en una prueba. Todavía tengo que experimentarlo más, pero por ahora me está gustando el modo HID ya que es con polling constante.

Lo malo es que esta semana va a estar difícil experimentar porque dejé mi programador en la escuela y acá en México estamos en cuarentena  :(

Sobre la ram usb, el pic18f2550 tiene 1kByte de ram específica para USB, donde el banco 4 (256bytes) se usa para control y el 5, 6 y 7 para datos (768bytes en endpoints).

« Última modificación: 27 de Abril de 2009, 11:30:22 por migsantiago »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5470
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #43 en: 28 de Abril de 2009, 17:12:41 »
Esta discusión está interesante y la he seguido con atención aunque no la he entendido 100% ya que no estoy tan versado en USB como ustedes...

no te creas, yo también estoy en pañales con esto del usb, las cosas que he hecho han sido por mas de pruebas de ensayo y error. La teoría es muy bonita pero cuando toca entender una implementación, todo se viene abajo  :D

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #44 en: 28 de Abril de 2009, 17:56:57 »
Cierto, yo también aprendo con prueba y error. El saberse el USB completo está muuuy difícil.