Autor Tema: USB error (Packet size is too big)  (Leído 2632 veces)

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

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
USB error (Packet size is too big)
« en: 25 de Noviembre de 2013, 14:38:47 »
Buenas, acabo de actualizar mi compilador CCS de la versión 4 a la versión 5. He notado un aumento tanto en RAM como en ROM a la hora de compilar. El problema que tengo es que estoy  trabajando con el USB y enviada una cadena de carácteres de 300 elementos de números enteros.

Al actualizar el CCS a la versión 5, me da el siguiente error (Packet size is too big) y solamente puedo enviar cadena de caracteres de 64 posiciones ya que si la aumento me salta un error en la librería USB.c  ( Packet size is too big).

¿A alguien le ha pasado algo parecido?

Un saludo.
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: USB error (Packet size is too big)
« Respuesta #1 en: 25 de Noviembre de 2013, 15:02:07 »
Hola,

bajo la norma USB 2.0 Full Speed(12Mbps) el tamaño máximo de paquete, excepto modo Isochronous, es de 64 bytes. Qué tipo de dispositivo USB estás creando y qué función estás utilizando para enviar los datos IN (hacia la PC).

Saludos.
« Última modificación: 25 de Noviembre de 2013, 15:05:15 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: USB error (Packet size is too big)
« Respuesta #2 en: 26 de Noviembre de 2013, 06:01:56 »
Muchas gracias Bruno por contestar. Estoy utilizando el USB Full Speed y la función para enviar datos que uso es:
Código: [Seleccionar]
usb_put_packet(1, Array, Elementos, USB_DTS_TOGGLE); (Datos In hacia el PC)
Donde elementos lo defino al principio del programa como:
Código: [Seleccionar]
#define  Elementos  64y array lo defino como:

Código: [Seleccionar]
unsigned int      Array[Elementos];
Antes con el compilador la versión 4 funcionaba muy bien y no me daba ese error, por lo visto no lo tendría implementado.¿Sabrías alguna forma de poder enviar un array de 300 posiciones? Una solución es crearme 5 array de 64 posiciones.

Un saludo.
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: USB error (Packet size is too big)
« Respuesta #3 en: 26 de Noviembre de 2013, 07:54:13 »
lo tienes que enviar por paquetes de 64 bytes, si quieres mandar 300, pues 300/64 casi 5

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: USB error (Packet size is too big)
« Respuesta #4 en: 26 de Noviembre de 2013, 08:01:46 »
Ok, eso me imaginaba. Pero sabéis porque con la versión V4 de CCS no ocurría esto???

Saludos
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: USB error (Packet size is too big)
« Respuesta #5 en: 26 de Noviembre de 2013, 11:41:57 »
Hola,

te ha faltado decir qué tipo de dispositivo USB has creado. Asumo que será un HID? Y qué tipo de HID si lo es?

Deberías usar la función:

usb_puts (endpoint, data, len, timeout)

ya que es la apropiada para enviar múltiples paquetes. En cambio usb_put_packet([...]) sólo acepta enviar un paquete a la vez.

Igualmente, no sé de qué tamaño has definido el endpoint IN (0x81 en este caso) y dependerá del tipo de dispositivo USB que has generado que funcione o no. Por ejemplo, si el dispositivo declarado es de tipo Bulk, puedes enviar tamaños de paquete que no necesariamente coincidan con el valor declarado para dicho endpoint pero si, por ejemplo, es de tipo interrupt (HID está dentro de este tipo) los paquetes deben si o si tener el tamaño definido en los descriptores. La única excepción es si utilizas HID ID's que debes definir en el descriptor HID, y que te permite para cada ID definir un nuevo tamaño de paquete.

A esto lo digo porque 300 no es múltiplo de 64. Claro que siempre podrías agrandar el array hasta 320 rellenándolo y descartando el relleno del lado de la PC, o bien cambiar el tamaño del endpoint a, por ejemplo, 50 bytes, que es un divisor entero de 300.

Saludos.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: USB error (Packet size is too big)
« Respuesta #6 en: 27 de Noviembre de 2013, 05:17:38 »
Perdona Bruno por mi mala explicación. Te cuento, el USB que tengo defino es el USB desencadenado, BULK transfer. Lo tengo definido como:

Código: C++
  1. #define  Elementos 64
  2. #define USB_HID_DEVICE     FALSE  //deshabilitamos el uso de las directivas HID
  3. #define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
  4. #define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
  5. #define USB_EP1_TX_SIZE    Elementos                 //size to allocate for the tx endpoint 1 buffer..1
  6. #define USB_EP1_RX_SIZE    Elementos                 //size to allocate for the rx endpoint 1 buffer

Miranlo la librería:
Código: C++
  1. #include <pic18_usb.h>      //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver

La abrimos he visto los descriptores del endpoint

Código: C++
  1. #IFNDEF __PIC18_USB_H__
  2. #DEFINE __PIC18_USB_H__
  3.  
  4. #DEFINE __USB_HARDWARE__
  5.  
  6. //let the USB Stack know that we are using a PIC with internal USB peripheral
  7. #DEFINE __PIC__   1
  8.  
  9. #ifndef USB_USE_FULL_SPEED
  10.  #define USB_USE_FULL_SPEED   1
  11. #endif
  12.  
  13. #ifndef USB_MAX_EP0_PACKET_LENGTH
  14. #if ((getenv("DEVICE")=="PIC18F2450") || (getenv("DEVICE")=="PIC18F4450") || (getenv("DEVICE")=="PIC18F13K50") || (getenv("DEVICE")=="PIC18F14K50") || (getenv("DEVICE")=="PIC18LF13K50") || (getenv("DEVICE")=="PIC18LF14K50"))
  15.    //due to limited ram, force max packet length to 8 for this chip
  16.    #define USB_MAX_EP0_PACKET_LENGTH   8
  17. #else
  18.    #if USB_USE_FULL_SPEED==0
  19.       //slow speed requires 8byte max packet size for endpoint 0
  20.       #DEFINE USB_MAX_EP0_PACKET_LENGTH   8
  21.    #else
  22.       //for full speed you can still use 8bytes, but 64 will be faster
  23.       #DEFINE USB_MAX_EP0_PACKET_LENGTH   64
  24.    #endif
  25. #endif
  26. #endif
  27.  
  28. #if (!USB_USE_FULL_SPEED && (USB_MAX_EP0_PACKET_LENGTH!=8))
  29.  #error Slow speed devices must use a max packet size of 8 for endpoint 0!
  30. #endif
  31.  
  32. #if USB_MAX_EP0_PACKET_LENGTH < 8
  33.  #error Max Endpoint 0 length can't be less than 8!
  34. #endif
  35.  
  36. #if USB_MAX_EP0_PACKET_LENGTH > 64
  37.  #error Max Endpoint 0 length can't be greater than 64!
  38. #endif

En vez de enviar 64 bytes (máxima longitud del end point definida) voy a cambiarlo por otro valor divisible por 8.
« Última modificación: 27 de Noviembre de 2013, 05:41:24 por umalrovi »
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: USB error (Packet size is too big)
« Respuesta #7 en: 27 de Noviembre de 2013, 13:40:05 »
Hola,

si estás usando bulk puedes enviar datos no múltiplos del tamaño del endpoint definido. Sólo que debeerás usar o bien la función usb_puts([...]) o bien enviar varios usando usb_put_packet([...]) de manera:

usb_put_packet(1, &Array[0], 64, USB_DTS_TOGGLE);
usb_put_packet(1, &Array[64], 64, USB_DTS_TOGGLE);
usb_put_packet(1, &Array[128], 64, USB_DTS_TOGGLE);
usb_put_packet(1, &Array[192], 64, USB_DTS_TOGGLE);
usb_put_packet(1, &Array[256], 44, USB_DTS_TOGGLE);

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: USB error (Packet size is too big)
« Respuesta #8 en: 28 de Noviembre de 2013, 12:13:26 »
Bruno una pasada muchas gracias por tu contestación!!! cuando te vea te invito a lo que quieras!!

Un slaudo!!
Aplicaciones Electrónicas
http://www.neoingenia.com/


 

anything