View previous topic :: View next topic |
Author |
Message |
asdf85
Joined: 03 Jan 2011 Posts: 34
|
Getting Windows to recognize USB connection |
Posted: Wed Jan 18, 2012 12:27 am |
|
|
Hi,
I've been trying for days now trying to get windows to recognize my usb connection but all i keep getting is a 'usb device not recognized message'.
I just need to be able to transfer data through this connection.
I'm using pic18f25j50, running a 20Mhz crystal, and using compiler 4.093.
Im trying to connect to Windows 7 32bit.
What do I have to do on the windows side? I downloaded the 'Microchip Application Libraries v2011-12-05 Windows' framework, but I'm not sure how do I use it. Which driver exactly do I have to use when I try installing the unrecognized usb device?
I tried the examples provided by ccs, but none of the examples seem to even get windows to realise theres a USB trying to connect to it. Then when i tried this following code, the 'usb device not recognized' message appears. But I cant install any drivers for it. I really need some help here. Thanks
Code: |
#include "18F25j50.h"
#fuses HS, NOWDT, NOPROTECT,NODEBUG, PLL5,NOCPUDIV,RTCOSC_T1
#use delay(clock=20000000)
//#define USB_CON_SENSE_PIN PIN_B2
// Includes all USB code and interrupts, as well as the CDC API
#include <usb_cdc.h>
void main(void)
{
BYTE i;
UPUEN=1;
usb_init_cs();
while(TRUE)
{
usb_task();
if (usb_enumerated())
{
if (usb_cdc_kbhit())
{
i = toupper(usb_cdc_getc());
if (i == 'R')
{
printf(usb_cdc_putc, "Sending a R Back");
}
if (i == 'W')
{
printf(usb_cdc_putc, "Sending a W Back");
}
}
}
}
}
|
|
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Jan 18, 2012 12:34 am |
|
|
Usually, problems of this kind are caused by device hardware problems, e.g. wiring errors and not related to Windows. |
|
|
asdf85
Joined: 03 Jan 2011 Posts: 34
|
|
Posted: Wed Jan 18, 2012 1:17 am |
|
|
Normally when I try installing the cdc9Xpt1.inf file as its driver, it does show 'usb to rs232'. But when i click next to install, it says 'windows encountered a problem installing the driver for your device'. 'The system cannot find the file specified'.
What file is it referring to? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Wed Jan 18, 2012 3:09 am |
|
|
Minor comment (should still work, but 'pushing things'). Usb_init_cs, is the version for where you _are_ using a connection sense pin. You have this disabled, so should be using usb_init instead.
Then you are using the wrong driver file. cdc9xpt1, is for win '9x'. 95, 98 etc.. The one for Windows NT/XP/7, is cdcntxpvista.inf. It is in the nt,2000,XP,VISTA,7 subdirectory off the 'drivers' subdirectory of the compiler.
This is probably the main problem.
Best Wishes |
|
|
asdf85
Joined: 03 Jan 2011 Posts: 34
|
|
Posted: Wed Jan 18, 2012 6:51 pm |
|
|
I've tried using just usb_init(). And also the cdcntxpvista.inf driver. It still doesnt work. Windows says it 'found driver software for your software but encountered an error while attempting to install it. The system cannot find the file specified'. However it does show the driver as 'usb to rs232'.
What about the Microchip Framework thing? What am i supposed to do with that? |
|
|
asdf85
Joined: 03 Jan 2011 Posts: 34
|
|
Posted: Wed Jan 18, 2012 11:19 pm |
|
|
Also, should the 'usb_task()' function automatically get the usb connection enumerated? Or is there something else I need to add after that?
And, does the D+ and D- lines have to be pulled up or down? Currently I'm connecting it directly to the USB port.
Anothing question ive been wondering, whenever i try running the "ex_usb_serial.c", the program always gets stuck at the printf commands. I notice this coz when i run the debugger and stop it, its never moves past that first printf command, and the arrow points to the '#use rs232(UART1, baud=9600, errors)' line. whats causing it to stop there? |
|
|
asdf85
Joined: 03 Jan 2011 Posts: 34
|
|
Posted: Thu Jan 19, 2012 2:17 am |
|
|
Thats strange...I just realised a simple program to send a byte over rs232 also doesn't work with this chip. And I've used rs232 many times with other chips. It just hangs when it reaches the putc or printf commands. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Thu Jan 19, 2012 2:27 am |
|
|
Two fuses:
VREGEN - absolutely essential turns on the voltage regulator for USB.
USBDIV - also essential - says to clock the USB from the PLL. Otherwise it'll try to clock it directly from the crystal.
With these added I suspect you will find it'll now run.
The default USB code, uses the internal pullup's in the PIC for the USB lines. You don't want anything else on the D+/D- lines.
Best Wishes |
|
|
asdf85
Joined: 03 Jan 2011 Posts: 34
|
|
Posted: Thu Jan 19, 2012 2:35 am |
|
|
These 2 fuses you mentioned, aren't among the list of fuses for the 18f25j50. How do I go about to turning it on in that case? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Thu Jan 19, 2012 3:50 am |
|
|
Apologies, thought you were running the standard 4550/2550.
Reason though is that the clock fuses you have are wrong for your chip....
With the 26J50:
1) You have got 3.3v connected to the Vusb pin?. On the other chips there is an internal regulator for this (which is what Vregen enables). On your chip, _you_ must provide this (hence no Vregen fuse).
2) You can't run the CPU at 20MHz using USB with this chip.
To run full speed USB on this chip, the 'master clock' line inside the chip, _must_ be running at 48MHz (node 2 in the oscillator data). To do this, requires that the incoming clock is fed to the PLL, and divided to give 4MHz, then multiplied to give 48Mhz. This then generates this master line. Unlike the 4550/2550, where you can still take the incoming clock and feed it to the CPU, on your chip you can't.
So you need the fuses to say:
HSPLL - You _must_ use the PLL. Unlike the older chips where the USB uses the PLL whatever the CPU is doing, on this one, you have to enable it, and once enabled, it is used for both the CPU and the USB..
CPUDIV2 - this will bring the CPU clock back to 24MHz - closest you can get to the 20MHz rate you wanted to run.
Change your clock statement to 24MHz.
Currently your CPU will be running at 20MHz, but you'll be trying to run the USB at 20MHz, which won't work.....
Best Wishes |
|
|
asdf85
Joined: 03 Jan 2011 Posts: 34
|
|
Posted: Fri Jan 20, 2012 3:15 am |
|
|
Hmm. In that case do I use a 4MHz crystal? And if I do, should my clock statement be 16MHz since Im running PLL? Actually I dont know much about PLL, just that i think it multiplies the crystal frequency by 4, right?
And thank you very much Ttelmah |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Fri Jan 20, 2012 8:48 am |
|
|
The PLL on the USB chips, is very different from the one on the other chips. The 'standard' PLL, just multiplies the incoming clock by 4. On the USB chips, the PLL, multiplies it's incoming frequency by _24_.
It _must_ have a 4MHz source.
In front of the USB PLL, there is a programmable divider, to divide the incoming clock to get 4MHz. The PLL5 fuse says to divide the incoming clock by 5, before feeding the USB PLL, so your 20MHz crystal will work fine.
The output of the PLL, is then divided by 2 before being fed to the rest of the circuitry (to ensure that the signal at this point has exactly a 50:50 mark/space ratio). This 48MHz signal feeds the USB.
On the 2550/4550 and their derivative chips, you have a choice at this point of feeding the CPU from the PLL source, or from the incoming clock, and applying a number of dividers before feeding the actual CPU.
However on your chip this option is not available. So the CPU clock has to be derived from the 48MHz generated by the PLL. The CPU can run at 48MHz, 24MHz, 16MHz, or 8Mhz from this, _or_ can be fed from the internal RC source.
So your 20MHz crystal is fine, but you can't run the CPU itself at 20Mhz and use the USB.
Best Wishes |
|
|
asdf85
Joined: 03 Jan 2011 Posts: 34
|
|
Posted: Fri Feb 03, 2012 2:53 am |
|
|
Thanks Ttelmah. I was on a long break. Anway this helps my understanding better.
So if I use a 20MHz crystal, I must set PLL5. Then at the #USE DELAY, do I write it as #USE DELAY(clock=48MHz) even though the crystal is actually 20Mhz? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Fri Feb 03, 2012 5:44 am |
|
|
If you are using CPUDIV1, then 'yes'.
The number used in the #use delay statement, must _always_ be the actual clock fed into the CPU. When using any of the PLL's, this differs from the actual 'crystal' frequency.
Best Wsihes |
|
|
|