View previous topic :: View next topic |
Author |
Message |
gfbankston
Joined: 21 Jul 2014 Posts: 35
|
USB malfunction |
Posted: Wed Sep 03, 2014 9:18 am |
|
|
Hello,
Been struggling with the USB on the 18F45K50. As someone pointed out, I added a connection sense line, and that does work.
Whenever I plug in the USB cable, the PC knows that I have done it, and tells me the USB device has malfunctioned and Windows does not recognize it.
I see some data on the D+ and D- pins with the scope.
I am using CCS's VID and PID and have 'installed' the driver from the Driver folder in the Examples folder.
I have had devices without drivers, and they operate differently. They still make the "ker-clunk" sound, but then tell me they cannot find the proper driver. This is different, with a balloon window popping up on XP.
Any thoughts???
TIA
GlenB K4KV
Here is relevant code:
Code: |
#define USB_USE_FULL_SPEED TRUE
#define USB_INTERNAL_PULLUPS TRUE
#FUSES WDT256 //Watch Dog Timer uses 1:256 Postscale
#use delay(internal=48000000,USB_FULL,ACT=USB)
#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
#define USB_CONFIG_VID 0x2405
#define USB_CONFIG_PID 0x000B
#define USB_CONFIG_BUS_POWER 500
#define USB_STRINGS_OVERWRITTEN
char USB_STRING_DESC_OFFSET[]={0,4,12};
char const USB_STRING_DESC[]={...
#include <usb_cdc.h>
main{
usb_init_cs();
enable_interrupts(INT_USB);
for(;;)
{
usb_task();
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Wed Sep 03, 2014 10:40 am |
|
|
I'd open the LST file, and look at the fuses, to see if the compiler is correctly setting up the oscillator. I'd guess not. I'd say that the symptoms are classic for the oscillator not being at the correct frequency, so possibly the ACT is not being enabled, or the wrong PLL is being selected. What compiler version are you on?. I've always been 'explicit' with setting fuses myself for the clock.
Best Wishes |
|
|
gfbankston
Joined: 21 Jul 2014 Posts: 35
|
fuses |
Posted: Wed Sep 03, 2014 5:03 pm |
|
|
Thanks, I will check the fuses!
BTW, the CCS usb cdc serial2 example does not work, with the PC not responding at all. I suspect the internal pullup is not enabled!
Glen |
|
|
gfbankston
Joined: 21 Jul 2014 Posts: 35
|
compiler |
Posted: Wed Sep 03, 2014 6:34 pm |
|
|
latest version of the compiler... |
|
|
gfbankston
Joined: 21 Jul 2014 Posts: 35
|
fuses |
Posted: Thu Sep 04, 2014 7:27 am |
|
|
I did not find anything wrong with the fuses:
/*
Configuration Fuses:
Word 1: C82B PLL3X PLLEN CPUDIV2 LS48MHZ INTRC_IO PRIMARY_SW FCMEN IESO
Word 2: 2059 NOPUT NOBROWNOUT BORV19 NOLPBOR NOWDT WDT256
Word 3: D300 CCP2C1 PBADEN T3CKC0 SDOB3 NOMCLR
Word 4: 0020 NOSTVREN NOLVP ICSP2 NOXINST DEBUG
Word 5: C00F NOPROTECT NOCPB NOCPD
Word 6: E00F NOWRT NOWRTC NOWRTB NOWRTD
Word 7: 400F NOEBTR NOEBTRB
*/
OSCCON = 0x70
verified oscillator output at 6Mhz on pin.
Finally got CCS serial2 example code to show the same malfunction by adding #define USB_INTERNAL_PULLUPS TRUE
ACTCON =0x90 (enabled with USB source)
Next, I guess I will try Low Speed USB...
GlenB |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Thu Sep 04, 2014 8:51 am |
|
|
CPUDIV2????.
Think about it NOCPUDIV gives 48MHz from the 96MHz PLL. How can CPUDIV2 be right?. |
|
|
gfbankston
Joined: 21 Jul 2014 Posts: 35
|
max speed |
Posted: Thu Sep 04, 2014 10:37 am |
|
|
This chip 45k50 and the 25K50, which I am also using, have a 16Mhz internal osc. x3 yields 48Mhz (the clock necessary for USB full speed) and DIV2 yields
24Mhz which gives me a 6Mhz instruction cycle.
OK?
BTW, just tried the usb_cdc code on another board with a 25K50 and it worked. It recognized the usb and reported the model number string, but could not find the driver. Manually told it where the CCS driver was and it
installed, no problem...
It is a much simpler board than the one with the 45K50 on it, but I do not
see why the hardware connected to the chip should make any difference!
GlenB |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Sep 04, 2014 11:11 am |
|
|
The only way I can get something close to your reported fuses is if
I do this:
Quote: | #include <18F45K50.h>
#FUSES WDT256
#use delay(internal=24000000,USB_FULL,ACT=USB) |
Then I get your reported fuses:
Quote: | Word 1: C82B PLL3X PLLEN CPUDIV2 LS48MHZ INTRC_IO PRIMARY_SW FCMEN IESO
|
If I put 48 MHz in the #use delay() like you have, the fuses are shown
in the .LST file as:
Quote: | Word 1: C823 PLL3X PLLEN NOCPUDIV LS48MHZ INTRC_IO PRIMARY_SW FCMEN IESO
|
So there is something wrong, or something you are not telling us. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Thu Sep 04, 2014 11:13 am |
|
|
Exactly.
His original post shows the chip supposedly clocking at 48MHz, but the fuses he shows would not give this. |
|
|
gfbankston
Joined: 21 Jul 2014 Posts: 35
|
speed |
Posted: Thu Sep 04, 2014 2:07 pm |
|
|
I searched the data sheet and 96Mhz is not in the document. 48Mhz is the
highest speed listed or mentioned in the data sheet.
#use delay(clock=24000000,internal=48000000,USB_FULL,ACT=USB)
is one of the things I tried, yielding the following config:
Word 1: C82B PLL3X PLLEN CPUDIV2 LS48MHZ INTRC_IO PRIMARY_SW FCMEN IESO
#use delay(internal=24000000,USB_FULL,ACT=USB)
yields:
Word 1: C82B PLL3X PLLEN CPUDIV2 LS48MHZ INTRC_IO PRIMARY_SW FCMEN IESO
#use delay(internal=48000000,USB_FULL,ACT=USB)
yields:
Word 1: C823 PLL3X PLLEN NOCPUDIV LS48MHZ INTRC_IO PRIMARY_SW FCMEN IESO
which runs the instruction clock at 12Mhz.
The problem is board specific, since the software now works on another board with a 25K50 on it. |
|
|
|