Este dispositivo no puede iniciarse. (Código 10) error en Windows 7

Estoy tratando de corregir un error Este dispositivo no puede iniciarse. (Código 10) con un dispositivo USB HID que estoy construyendo. Aquí hay algunos detalles sobre mi proyecto:

IDE : MPLABX en Mac OS X
MCU : PIC32MX250F128B
Programador : Microstick II
Git Repositorio : https://github.com/josefvanniekerk/pic32_usb

Consulte el código anterior, no es grande, estoy tratando de no inundar la pregunta con el código fuente;)

Circuito de dispositivo USB + Microstick II

El dispositivo enumera y puedo ver que Windows 7 y Mac OS X pueden identificar el dispositivo.

Enumeración en Mac OS X

Sin embargo, en Windows, recibo un error: Este dispositivo no puede iniciarse. (Código 10)

Error del administrador de dispositivos Win7

He estado tratando de arreglar esto por un tiempo. Después de rehacer el cableado de mi placa de prueba la semana pasada para intentar mejorar la calidad de la señal, he venido, tratando de modificar mi código para que todo funcione.

Estoy usando el modo USB_INTERRUPT y mi descriptor tiene el siguiente aspecto:

ROM USB_DEVICE_DESCRIPTOR device_dsc =  
 {  
     0x12,                       // Descriptor size in bytes  
     USB_DESCRIPTOR_DEVICE,      // Device descriptor type  
     0x0200,                     // USB spec release number in BCD format  
     0x00,                       // Class code  
     0x00,                       // Subclass code  
     0x00,                       // Protocol code  
     USB_EP0_BUFF_SIZE,          // Max packet size for EP0  
     MY_VID,                     // Vendor ID  
     MY_PID,                     // Product ID  
     0x0001,                     // Device release number in BCD format  
     0x01,                       // Manufacturer string index  
     0x02,                       // Product string index  
     0x00,                       // Device serial number string index  
     0x01                        // Number of possible configurations  
 };  

y el descriptor de informe HID (creado con la herramienta HID de usb.com):

ROM struct{BYTE report[HID_RPT01_SIZE];} hid_rpt01 =
{
    {
        0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
        0x09, 0x04,                    // USAGE (Joystick)
        0xa1, 0x01,                    // COLLECTION (Application)
        0x09, 0x04,                    //   USAGE (Joystick)
        0xa1, 0x00,                    //   COLLECTION (Physical)
        0x05, 0x09,                    //     USAGE_PAGE (Button)
        0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
        0x29, 0x08,                    //     USAGE_MAXIMUM (Button 8)
        0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
        0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
        0x95, 0x08,                    //     REPORT_COUNT (8)
        0x75, 0x01,                    //     REPORT_SIZE (1)
        0x81, 0x02,                    //     INPUT (Data,Var,Abs)
        0xc0,                          //     END_COLLECTION
        0xc0                           // END_COLLECTION
    }
};

Lo anterior representa un joystick con un botón, por lo que estoy tratando de comenzar poco a poco. Mi informe HID se ve así:

 typedef union _INPUT_CONTROLS_TYPEDEF
 {
     BYTE buttons;
 } INPUT_CONTROLS;

 INPUT_CONTROLS joystick_input INPUT_CONTROLS_ADDRESS_TAG;
 BYTE hid_report[8] HID_REPORT_ADDRESS_TAG;

También configuré el tamaño del descriptor en 28 bytes en usb_config.h:

#define HID_RPT01_SIZE 28

Esto es lo más lejos que he llegado con este proyecto, pero estoy cara a cara con una pared de ladrillos que no se mueve. Cualquier ayuda sería muy apreciada. El contenido completo de main.c está en mi repositorio de GitHub

Estoy probando mi dispositivo tanto en Mac como en Windows 7 a través de VMWare. El Microstick II no parece tener el mejor depurador, por lo que la depuración es limitada.

Lo que hice fue encender un LED en el pin 2 (RA0) cuando USBDeviceState == CONFIGURED_STATE , y todo lo que sé es que el dispositivo está en CONFIGURED_STATE , ya que el LED se enciende unos momentos después de enchufar el dispositivo. también logró obtener lo siguiente de la versión de prueba de USBLizer:

USBLizer

No puedo establecer puntos de interrupción en MPLABX y detener la MCU para investigar el problema, debido a los requisitos de temporización del reloj USB, por lo que realmente no sé cómo puedo solucionar este problema.

Por lo que vale, he establecido un punto de interrupción para el controlador EVENT_BUS_ERROR en main.c, y se establecen los siguientes bits de registros U1EIR:

  • DFN8EF - Bit de indicador de error de tamaño de campo de datos
  • CRC5EF_EOFE - Bit de indicador de error de host CRC5
  • PIDEF - Bit de indicador de falla de verificación de PID

ingrese la descripción de la imagen aquí

¿Estoy recibiendo estos errores porque ingresé al modo de depuración y el chip no está contento, y estos no son los errores reales en absoluto, y si estos errores son indicaciones correctas de mi problema, qué significa?

Si obtengo un DFN8EF - Bit de indicador de error de tamaño de campo de datos, ¿cómo averiguo qué campo de datos tiene el tamaño incorrecto? Es probable que sea mi descriptor o informe HID, pero no puedo encontrar la falla.

Respuestas (2)

He logrado rastrear el problema. Tenía que ver con mi descriptor de punto final. Utilicé una definición de PS_IN y PS_OUT donde debería haber usado _PS_IN y _PS_OUT con el prefijo de un guión bajo.

Por supuesto, esto no resultó en un error del compilador, ya que estas cuatro definiciones son válidas, pero _PS_IN != PS_IN, etc.

Tuve el mismo error con un PIC18.

El problema era la calidad del oscilador. USB requiere una estricta tolerancia en la frecuencia del oscilador. Estaba usando uno de cerámica para alimentar el PIC PLL y no era lo suficientemente estable.

En otro diseño, los problemas también se debían al XTAL, los límites de carga no tenían el valor correcto y la frecuencia estaba fuera de algunas ppm, lo que fue suficiente para que las ventanas lo detectaran y lo informaran como un dispositivo que funciona mal.

Espero que esto ayude.

Estoy usando un cristal NSK de 12 MHz. ¿No estás seguro si esto es bueno? Parece tener una estabilidad de frecuencia de ±10 ~ ±50 ppm. Realmente no puedo encontrar ningún detalle del fabricante sobre qué tapas usar, etc., así que elegí 22pF.
Encuentre una manera de medir la frecuencia de su sistema. Pero no pruebe los pines XTAL, la tapa adicional de la sonda alterará la frecuencia. Es posible que tenga un pin que pueda configurarse como reloj de salida. Luego use un analizador de espectro si tiene acceso a eso, o la función FFT de su osciloscopio para conocer la frecuencia central. luego ajuste las tapas para tener exactamente el nominal.
Por cierto, si tiene acceso a la hoja de datos, debería tener la capacidad de carga en alguna parte.
Gracias por la respuesta. Desafortunadamente, no tengo un osciloscopio, así que eso no es para mí. Decidí construir el circuito como una PCB adecuada, ya que la configuración de la placa tiene demasiada capacitancia parásita, inductancia, etc. en todas partes.