CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

PIC24 - USB Device Not Recognized
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
NWilson



Joined: 30 Jun 2011
Posts: 21
Location: King's Lynn. England

View user's profile Send private message

PIC24 - USB Device Not Recognized
PostPosted: Mon Aug 18, 2014 7:28 am     Reply with quote

Device PIC24FJ128GC006
PCD 5.026

Hi All,
Saw this device advertised a few months back and thought it would be ideal for my next project as it contains many peripheral's like, USB, Op-Amps, DAC's, and a 16 bit ADC that I would like to use.
Anyway I've built a development PCB to test the device, but when I plug my test board into my PC, I get 'USB Device Not Recognised'

Test Code.

Code:

//*****************************************************************
// 24FJ128GC006 USB Test PCB
// Jig.c
// Rev         : 1.00
// Start Date  : 18th Aug 2014
// Authors     : Neil Wilson
//*****************************************************************

#include <24FJ128GC006.h>

#device ADC=16
#device ICSP=2

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES NOJTAG                   //JTAG disabled

#use delay(crystal=24000000,USB_FULL)

#case

#include <usb_cdc.h>
#include <Flex_lcd.h>

int1 usb_cdc_oldconnected=FALSE;

#define   DISP_POWER               PIN_E0
#define   USB_CABLE_IS_ATTACHED() TRUE

void main()
{
   output_high(DISP_POWER);      // Apply power to the display
   lcd_init();                     // Initialise the display
   printf(lcd_putc,"\fHello");   // Test Display - This works OK
   
   usb_init_cs();
     
   do {
      usb_task();
      if (usb_enumerated()){
         if (usb_cdc_carrier.dte_present){
            if (usb_cdc_oldconnected==FALSE){
               printf(usb_cdc_putc,"Your 'connected' message");
               lcd_gotoxy(1,2);
               printf(lcd_putc,"Connected");
               usb_cdc_oldconnected=TRUE;
            }
            //Do something
         }
         else
            usb_cdc_oldconnected=FALSE;
      }
      else
         usb_cdc_oldconnected=FALSE;
   } while (TRUE);   
}



Has anyone successfully managed to get this pic working?
If so, could they please point me in the right direction.

Many thanks


Code:
temtronic



Joined: 01 Jul 2010
Posts: 9081
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Mon Aug 18, 2014 8:16 am     Reply with quote

hmm...did you install the USB dotINF files onto the PC ?
I don't use the 24 series but in the USB driver files for the 18F4550 USB stuff there's a few comments about what's needed to get 'Windows' to recognize a PIC/USB device.

'silly thing' are D+,D- wired correctly ?
hth
jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19195

View user's profile Send private message

PostPosted: Mon Aug 18, 2014 8:22 am     Reply with quote

Start with USB.

USB, when attached to a device that has it's own power _requires_ (not optional), cable attached detection. You are disabling this.

This is in the chip's data sheet:
"To meet compliance specifications, the USB module
(and the D+ or D- pull-up resistor) should not be enabled
until the host actively drives VBUS high. One of the 5.5V
tolerant I/O pins may be used for this purpose."

Then look at the chip.
Have you followed/met the section 2.1 connection requirements?.

Then I would specify a clock speed. It's a bit borderline whether the setup as posted can work. Basically you can only use 'crystal=xxx', if you are not using the PLL. However the USB _requires_ the PLL.
NWilson



Joined: 30 Jun 2011
Posts: 21
Location: King's Lynn. England

View user's profile Send private message

PostPosted: Mon Aug 18, 2014 8:34 am     Reply with quote

Hi temtronic,

Thanks for the quick reply.

My Development PCB appears as an 'Unknown Device' under the device manager. Also, I've tried to update the driver with 'cdc_NTXPVista78.inf' to no avail.

Scoped D+ and D- and both appear OK and correctly wired. Not sure what's going on at the moment, I've used the PIC18F46J50 with similar code in the past and not had this problem.

Regards Neil
NWilson



Joined: 30 Jun 2011
Posts: 21
Location: King's Lynn. England

View user's profile Send private message

PostPosted: Mon Aug 18, 2014 8:47 am     Reply with quote

Hi Ttelmah,

I based my circuit on Fig 19-3 of the data sheet (Page 267) and everything else is as in Fig 2.1 (page 33).
I'll try connecting VBUS to one of the 5V tolerant pins and enable the cable attached in code and see if that works.
Many thanks
Neil
NWilson



Joined: 30 Jun 2011
Posts: 21
Location: King's Lynn. England

View user's profile Send private message

PostPosted: Tue Aug 19, 2014 6:17 am     Reply with quote

Hi All,

Many thanks for the help so far.

I've added the cable attached detection and changed the #fuses as suggested, however my problem still persists.

It seems that usb_enumerated() always returns FALSE.

Code:

//*****************************************************************
// 24FJ128GC006 USB Test PCB
// Jig.c
// Rev         : 1.00
// Start Date  : 18th Aug 2014
// Authors     : Neil Wilson
//*****************************************************************

#include <24FJ128GC006.h>

#device ADC=16
#device ICSP=2

#use delay(crystal=24000000, USB_FULL)

#FUSES NOWDT                        // No Watch Dog Timer
#FUSES NOJTAG// JTAG disabled
#FUSES HS                     // High speed Osc (>10mhz for PCD)
#FUSES PR_PLL                  // Primary Oscillator with PLL
#FUSES PLL6                     // Divide By 6(24MHz oscillator input)

#case

#define   DISP_POWER               PIN_E0
#define   USB_CON_SENSE_PIN         PIN_E1
#define   TELL_TAIL               PIN_E2

#define   PIN_USB_SENSE             USB_CON_SENSE_PIN
#define   USB_CABLE_IS_ATTACHED() input(PIN_USB_SENSE)

#include <usb_cdc.h>
#include <Flex_lcd.h>

int1 usb_cdc_oldconnected=FALSE;

void main()
{
   output_high(DISP_POWER);                     // Apply power to the display
   output_low(TELL_TAIL);
   lcd_init();                                    // Initialise the display
   printf(lcd_putc,"\fHello");                  // Test Display - This works OK
   usb_init_cs();
     
   do {
         if (usb_attached()){                     // USB now attaches correctly
         usb_task();
         if (usb_enumerated()){                  // Never seems to enumerate
            output_high(TELL_TAIL);
            output_low(TELL_TAIL);
            if (usb_cdc_carrier.dte_present){
               if (usb_cdc_oldconnected==FALSE){
                  printf(usb_cdc_putc,"Connected");
                  usb_cdc_oldconnected=TRUE;
               }
               //Do something
            }
            else
               usb_cdc_oldconnected=FALSE;
         }
         else
            usb_cdc_oldconnected=FALSE;
      }
      else
         usb_cdc_init();                      //clear buffers if disconnected
   } while (TRUE);   
}


After much head scratching I'm not sure how to proceed. Any idea's
Ttelmah



Joined: 11 Mar 2010
Posts: 19195

View user's profile Send private message

PostPosted: Tue Aug 19, 2014 8:53 am     Reply with quote

OK.

I would do the attached the standard way. All you need to do, is :
Code:

#define USB_CON_SENSE_PIN PIN_E1
#define __USB_PIC_PERIF__ 1 //This ensures the code selects the peripheral
#include <usb_cdc.h>

and the compiler will generate 'usb_attached' for you, using this pin.

This forces the code to use the PIC hardware, even if the chip is not one it recognises as having USB.

Have you actually got Vusb, connected to both Vbus, and to E1?.

Then the next obvious question, is whether the code is correctly configuring the USB as a standard slave.

In common with several other newer chips, this is one supporting USB 'on the go', so the peripheral has to be configured to use it like this. By default the PIC24 code should clear the U1CON register, before writing the bits it wants, which therefore should leave 'HOSTEN' (U1CON.3) turned off, and the peripheral setup as the normal USB peripheral.
Can you do a debug halt after the peripheral is configured, and verify that this is the case?.

Then, have you verified that the chip is actually running at the speed programmed (standard flash an LED test, or just write numbers one per second to the LCD, and verify these are incrementing every second)?.

I haven't tried this particular chip, but the driver works OK, on a couple of other 'close brethren', so I'd be triple checking everything. Silly things like D+, and D- being the opposite way round on the plug to what you expect, can be really annoying!...
I bought a different make of USB board connector, only to discover the manufacturer had done them for a 'special order', and crossed over D+, and D- internally. Aargh.
NWilson



Joined: 30 Jun 2011
Posts: 21
Location: King's Lynn. England

View user's profile Send private message

PostPosted: Tue Aug 19, 2014 9:37 am     Reply with quote

Hi Ttelmah,
Thanks for replying, I've just tried the standard way and it made no difference.
Triple checked D+, D-, Vbus and E1 and all OK.
The chip seems to be running at the correct speed as toggling the 'Tell Tail' with delay_us(10) gives a 10uS pulse.
Was wondering whether OTG was the problem, but couldn't work out how to configure it as a slave, so I will debug it tomorrow and see if the registers you mentioned have been set.
Hopefully I can fix this problem and mark it as solved.
Once again, many thanks for you help.
Regards Neil
NWilson



Joined: 30 Jun 2011
Posts: 21
Location: King's Lynn. England

View user's profile Send private message

PostPosted: Wed Aug 20, 2014 7:51 am     Reply with quote

OK.

Still no joy. Stepping through the code I found the following registers had changed:
breaking after usb_init_cs(); gave
U1CON = 0b01000010
U1IR = 0b00000001
U1OTGCON = 0b10000000
U1PWRC = 0b10000001
U1IE = 0b00000000

breaking after usb_attached() { gave
U1CON = 0b01000010
U1IR = 0b00000001
U1OTGCON = 0b10000000
U1PWRC = 0b00000001
U1IE = 0b00000000

and finally after usb_task();
U1CON = 0b01000011
U1IR = 0b00000000
U1OTGCON = 0b10000000
U1PWRC = 0b10000001
U1IE = 0b00010001

It appears that 'HOSTEN' (U1CON.3) is '0' I.E. device mode and not host mode.

Code:

//*****************************************************************
// 24FJ128GC006 USB Test PCB
// Jig.c
// Rev         : 1.00
// Start Date  : 18th Aug 2014
// Authors     : Neil Wilson
//*****************************************************************

#include <24FJ128GC006.h>

#device ICD=TRUE
#device ADC=16
#device ICSP=2

#use delay(crystal=24000000, USB_FULL)

#FUSES HS               // High speed Osc (>10mhz for PCD)
#FUSES PR_PLL        // Primary Oscillator with PLL
#FUSES PLL6            // Divide By 6(24MHz oscillator input)
#FUSES NOWDT       //No Watch Dog Timer
#FUSES NOJTAG      //JTAG disabled

#case

#bit      U1OTGSTAT_SESVD=getenv   ("BIT:SESVD")      //look at the SFR bit U1OTGSTAT.SESVD to determine if USB is connected.
#define   USB_CABLE_IS_ATTACHED()   (U1OTGSTAT_SESVD)

#define   DISP_POWER   PIN_E0
#define   TELL_TAIL   PIN_E2

#include <usb_cdc.h>
#include <Flex_lcd.h>

int1 usb_cdc_oldconnected=FALSE;

void main()
{
   output_high(DISP_POWER);             // Apply power to the display
   output_low(TELL_TAIL);
   lcd_init();                                       // Initialise the display
   printf(lcd_putc,"\fHello");                   // Test LCD Display - This works OK
   
   usb_init_cs();                                 //Initializes the USB stack, run even if it's not connected to USB
     
   while (TRUE)
   {
      if (usb_attached()){
                  
         output_high(TELL_TAIL);     // 1uS pulse, USB Attached
         delay_us(1);
         output_low(TELL_TAIL);            
         usb_task();
         if (usb_enumerated()){              // Never seems to enumerate
            if (usb_cdc_carrier.dte_present){
                 if (usb_cdc_oldconnected==FALSE){
                    printf(usb_cdc_putc,"Connected");
                    usb_cdc_oldconnected=TRUE;
               }
                  //Do something here
            }
            else
                 usb_cdc_oldconnected=FALSE;
         }
         else
              usb_cdc_oldconnected=FALSE;
      }
      else
           usb_cdc_init();                            //clear buffers if disconnected
   }
}


Here is the code that I have so far, still pulling my hair out!
NWilson



Joined: 30 Jun 2011
Posts: 21
Location: King's Lynn. England

View user's profile Send private message

PostPosted: Tue Sep 09, 2014 3:19 am     Reply with quote

Been a few weeks now since I last tackled the USB on this chip.
Just wondering if anyone has got it going yet?
drolleman



Joined: 03 Feb 2011
Posts: 116

View user's profile Send private message

PostPosted: Sat Sep 13, 2014 6:54 pm     Reply with quote

First do you have a device in device manager? This has to be there before a driver can be assigned to it. It may be yellow flagged, this means the there is no driver for it. Look in the properties of the yellow flagged device for the pid/vid and compare it to the inf file. If these don't match it won't work. Alter the inf file so they do match.

good luck
juliogtd



Joined: 01 Jan 2009
Posts: 6

View user's profile Send private message

PostPosted: Mon Oct 27, 2014 1:47 am     Reply with quote

I think there must be something inherent to 24FJ128GC006 that we are ignoring. For example, the following code perfectly works with 24FJ256GB106 (PC recognizes the USB as a serial port).
Code:
#include <24FJ256GB106.h>
#fuses NOWDT, FRC, FRC_PLL, PLL1         
#use delay(clock=32M,USB_FULL, act=USB)
#include <usb_cdc.h>

void main(){
   usb_cdc_init();
   usb_init_cs();
   do{
      if (usb_attached()){
                      usb_task();
                      if(usb_enumerated()){


                                     }                                 
                     }            
   }while(true);
}

However, replacing <24FJ256GB106.h> by <24FJ128GC006.h> (and pin-compatible microcontrollers too, of course) no longer works.

MPLABX code (for the starter kit for intelligent.integrated.analog - 24FJ128GC010 based) works correctly.
One difference I see in the code is that the "USB module" is activated (_USBMD = 0)... could be that command the difference between work or not?
Code:
int main() {
    _NSTDIS = 1;    // Disable nested interrupts

    //Initliaze USB //Enable interrupts
    _USB1IF = 0;    //Interrupt Flag Status bit    1 = Interrupt request has occurred
    _USB1IP = 5;    //Interrupt Priority bits 000..111 (highest priority interrupt)
    _USB1IE = 1;    //1 = Interrupt request is enabled
    USBDeviceInit();
    _USBMD = 0;     //0 = Peripheral Module is "not" Disable

    while (1) {
            if (USBGetDeviceState() == DETACHED_STATE)
            {
                USBDeviceAttach();
            }
           
            CDCTxService();
    }
    return 0;
}
Ttelmah



Joined: 11 Mar 2010
Posts: 19195

View user's profile Send private message

PostPosted: Mon Oct 27, 2014 4:02 am     Reply with quote

By default the CCS code enables the USB port when init is called.

As already said, the obvious thing is the OTG configuration. Though this is meant to default to device mode, rather than host mode, the obvious thing to do, is manually ensure the bits for this are set. So:
Code:

#bit OTGEN=getenv("BIT:OTGEN")
#bit USBEN=getenv("BIT:USBEN")
#bit USBPWR=getenv("BIT:USBPWR")
#bit DPPULUP=getenv("BIT:DPPULUP")

   OTGEN=FALSE;
   USBEN=TRUE;
   USBPWR=TRUE;
   DPPULLUP=TRUE;
   usb_init;
juliogtd



Joined: 01 Jan 2009
Posts: 6

View user's profile Send private message

PostPosted: Mon Oct 27, 2014 10:49 am     Reply with quote

Ttelmah: You're right, the solution to the problem is not activating the USB module (I've confirmed, activating it manually). But neither is the OTG configuration: I tried your suggestion and it does not work.

It's something else. Rolling Eyes
juliogtd



Joined: 01 Jan 2009
Posts: 6

View user's profile Send private message

PostPosted: Sat Mar 21, 2015 1:49 pm     Reply with quote

Hello, I keep thinking about why the USB 24FJ128GC006 not work with the CCS compiler.

In order to discover the reason, I followed the following steps:

1. I mounted two identical printed circuit boards, one with the PIC24FJ256GB106 and other with the PIC24FJ128GC006 (see photo).

2. I have programmed both microcontrollers with the same code, which is the minimum one so that, when connected to the USB port of PC, it recognizes that connected a virtual serial device (the PIC24FJ256GB106 works correctly and PIC24FJ128GC006 does not work. See the screenshots 1 and 2. I used "USBlyzer" software to confirm the communication).

Code:

#include <24FJ256GB106.h>
#fuses NOWDT, FRC, FRC_PLL, PLL1         
#use delay(clock=32M,USB_FULL, act=USB)

#include <usb_cdc.h>

void main(){
   usb_init_cs();
   usb_task();
}


Code:

#include <24FJ128GC006.h>
#fuses NOWDT, FRC, FRC_PLL, PLL1         
#use delay(clock=32M,USB_FULL, act=USB)

#include <usb_cdc.h>

void main(){
   usb_init_cs();
   usb_task();
}



3. To verify that the PIC24FJ128GC006 hardware works properly, I programmed the microcontroller with microchip XC16 compiler minimal code, based on the evaluation board example... and the hardware (the USB communication) works correctly (See the screenshot 3).

Code:

#include <xc.h>
#include "main.h"
_CONFIG4(DSWDTPS_DSWDTPS1F  // 1:68719476736 (25.7 Days)
        & DSWDTOSC_LPRC     // DSWDT uses LPRC as reference clock
        & DSBOREN_OFF       // DSBOR Disabled
        & DSWDTEN_OFF       // DSWDT Disabled
        & DSSWEN_OFF        // Deep Sleep operation is always disabled
        & RTCBAT_OFF        // RTC operation is continued through VBAT
        & PLLDIV_NODIV      // Oscillator divided by 2 (8 MHz input)
        & IOL1WAY_OFF)      // The IOLOCK bit can be set and cleared using the unlock sequence
_CONFIG3(WPFP_WPFP0         // Page 0 (0x00)
        & SOSCSEL_ON        // SOSC circuit selected
        & WDTWIN_PS25_0     // Watch Dog Timer Window Width is 25 percent
        & BOREN_OFF         // Brown-out Reset Disabled
        & WPDIS_WPDIS       // Disabled
        & WPCFG_WPCFGDIS    // Disabled
        & WPEND_WPSTARTMEM) // Write Protect from page 0 to WPFP
_CONFIG2(
         POSCMD_NONE        // GC006
        & WDTCLK_LPRC       // WDT uses SOSC input
        & FCKSM_CSDCMD      // Clock switching and Fail-Safe Clock Monitor are disabled
        & FNOSC_FRCPLL      // GC006 - Fast RC Oscillator with PLL module (FRCPLL)
        & WDTCMX_LPRC       // WDT always uses LPRC as its clock source
        & IESO_OFF)         // Disabled
_CONFIG1(WDTPS_PS32768      // 1:32,768 (not used)
        & FWPSA_PR128       // 1:128
        & WINDIS_OFF        // Standard Watchdog Timer
        & FWDTEN_WDT_DIS    // WDT disabled in hardware; SWDTEN bit disabled
        & ICS_PGx1          // GC006 - Emulator functions are shared with PGEC1/PGED1
        & LPCFG_ON          // Low voltage regulator controlled in sw by RETEN bit
        & GWRP_OFF          // Disabled
        & GCP_OFF           // Code protection is disabled
        & JTAGEN_OFF)       // Disabled
#define FOSC 32000000   /*Hz*/

void main() {
    USBDeviceInit();
    USBDeviceAttach();
    while(1);
}


3. I studied the USB registers associated with each microcontroller and they are virtually identical except for two details:
a. The U1PWMCON register appears in the PIC24FJ128GC006 set of registers and it does not appear in the PIC24FJ256GB106 set. But this should not affect because the code generated by the CCS compiler does not call this register (ie it is not used) ..
b. In the U1CNFG2 register of the PIC24FJ128GC006 microcontroller there is a UVCMPSEL bit that does not appear in the U1CNFG2 register of the PIC24FJ256GB106 microcontroller. But this should not affect because the code generated by the XC16 compiler does not use this bit.

- - -

Now I can only compare the assemblers codes generated by both compilers... but it is not easy to do it because the way to resolve the issue is different and they follow different paths.

- - -

It should not be so complicated! Both microcontrollers (PIC24FJ128GC006 and PIC24FJ256GB106), on the USB working, should be identical! And, if PIC24FJ256GB106 works... ¿what happen with the PIC24FJ128GC006?...

- - -

Does anyone have any idea or suggestion for discover the mistery? Smile
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group