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;)
El dispositivo enumera y puedo ver que Windows 7 y Mac OS X pueden identificar el dispositivo.
Sin embargo, en Windows, recibo un error: Este dispositivo no puede iniciarse. (Código 10)
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:
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:
¿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.
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.
josef.van.niekerk
Blup1980
Blup1980
josef.van.niekerk