4
\$\begingroup\$

I'm trying to fix an error This device cannot start. (Code 10) with a USB HID device I'm building. Here are some details on my project:

IDE: MPLABX on Mac OS X
MCU: PIC32MX250F128B
Programmer: Microstick II
Git Repository: https://github.com/josefvanniekerk/pic32_usb

Please refer to the code above, it's not big, I'm trying not to flood the question with source code ;)

USB + Microstick II Device circuit

The device enumerates, and I'm able to see that Windows 7 and Mac OS X is able to identify the device.

Enumeration on Mac OS X

However in Windows, I'm getting an error: This device cannot start. (Code 10)

Win7 Device Manager Error

I've been trying to fix this for a while. After redoing my breadboard wiring last week to try and improve the signal quality, I've come, trying to alter my code to get things working.

I'm using USB_INTERRUPT mode, and have my descriptor looks as follows:

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 
 }; 

and the HID report discriptor, (built with HID Tool from 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
 }
};

The above represents a Joystick with one button, so I'm trying to start small. My HID report looks like this:

 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;

I've also set the descriptor size to 28 bytes in usb_config.h:

#define HID_RPT01_SIZE 28

This is about the furthest I've come with this project ever, but I'm face to face with a brick wall, that won't budge. Any help would be much appreciated. The full contents of main.c is at my GitHub repository

I'm testing my device on both Mac and Windows 7 via VMWare. The Microstick II doesn't appear to have the best debugger, so debugging is limited.

What I've done is light up an LED on Pin 2 (RA0) when USBDeviceState == CONFIGURED_STATE, and all I know is that the device is in CONFIGURED_STATE, as the LED lights up a few moments after the device is plugged in. I also managed to get the following from the USBLizer trial version:

USBLizer

I can't set breakpoints in MPLABX, and halt the MCU to investigate the issue, because of USB clock timing requirements, so really stuck as to how I can troubleshoot and fix this.

For what it's worth, I've set a breakpoint for the EVENT_BUS_ERROR handler in main.c, and the following U1EIR registers' bits are set:

  • DFN8EF - Data Field Size Error Flag bit
  • CRC5EF_EOFE - CRC5 Host Error Flag bit
  • PIDEF - PID Check Failure Flag bit

enter image description here

Am I getting these errors because I'v entered debug mode and the chip isn't happy, and these aren't the actual errors at all, and if these errors are in fact correct indications of my problem, what does it mean?

If I'm getting a DFN8EF - Data Field Size Error Flag bit, how do I figure out what data field is the wrong size? It's likely to be my descriptor, or HID report, but I can't find the fault.

asked Jun 23, 2013 at 21:03
\$\endgroup\$

2 Answers 2

4
\$\begingroup\$

I've managed to track down the issue. It was to do with my endpoint descriptor. I used a define PS_IN and PS_OUT where I should have used _PS_IN and _PS_OUT prefixed with an underscore.

This off course didn't result into a compiler error, since all four of these defines are in fact valid, yet _PS_IN != PS_IN etc.

answered Jul 3, 2013 at 12:20
\$\endgroup\$
0
\$\begingroup\$

I had the same error with a PIC18.

The issue was the oscillator quality. USB requires a tight tolerance on the oscillator frequency. I was using a ceramic one to feed the PIC PLL and it was not stable enough.

In another design, the issues was also due to the XTAL, the load caps were not of the right value and the frequency was some ppm off, which was sufficient to be detected by windows and reported as malfunctioning device.

Hope this would help.

answered Jun 24, 2013 at 12:23
\$\endgroup\$
4
  • \$\begingroup\$ I'm using a 12MHz NSK crystal. Not sure if this is any good? It appears to have a freq stability of ±10 ~ ±50 ppm. I can't really find any details from the manufacturer on which caps to use with it etc, so I just picked 22pF. \$\endgroup\$ Commented Jun 24, 2013 at 21:47
  • \$\begingroup\$ Find a way to measure your system frequency. But don't probe the XTAL pins, the added cap of the probe will alter the frequency. You may have a pin that can configured as clock out. Then use a spectrum analyser if you have access to that, or the FFT function of your scope to know the center frequency. then adjust the caps to have exactly the nominal. \$\endgroup\$ Commented Jun 26, 2013 at 5:47
  • \$\begingroup\$ By the way, If you have access to the datasheet, you should have the load capacitance somewhere. \$\endgroup\$ Commented Jun 26, 2013 at 5:50
  • \$\begingroup\$ Thanks, for the reply. Unfortunately I don't have an oscilloscope, so that's a no go for me. I've decided to build the circuit as a proper PCB, as the breadboard setup has too much parasitic capacitance, inductance etc. everywhere. \$\endgroup\$ Commented Jun 26, 2013 at 8:52

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.