View previous topic :: View next topic |
Author |
Message |
dmendesf
Joined: 31 Dec 2005 Posts: 32
|
Making USB work with PIC18F45K50 |
Posted: Tue Aug 27, 2013 9:54 am |
|
|
Hi, I'm trying to make USB CDC work with this PIC because it's a cheap and good replacement for PIC18F4550. It's not working. I'll list everything I did so maybe anyone has new ideas about what can be wrong:
1) Oscillator setup
I'm using a 12MHz external osciillator, so I set up:
Code: |
#FUSES PLL4X
#FUSES PLLEN
#FUSES NOCPUDIV
#FUSES ECM
|
2) Porting of existing libs
I looked at the CCS provided code and seems that only pic18_usb.c needs modifications. It was a lot of #define's based on the exactly PIC you're using. I decided to create a new #define mimiking 18F4550 (because it seems to be the most similar PIC amog the supported ones). So I did:
Code: |
#elif ((getenv("DEVICE")=="PIC18LF45K50") || (getenv("DEVICE")=="PIC18F45K50"))
#define __USB_45K50__
#define USB_TOTAL_RAM_SPACE ((unsigned int16)0x400)
#define USB_RAM_START 0x400
#define USB_NUM_UEP 16
#define USB_LAST_ALLOWED_ENDPOINT 16
|
Then I went to the registers adresses:
Code: |
#elif defined(__USB_45K50__)
#byte UFRML = 0xF68
#byte UFRMH = 0xF69
#byte UIR = 0xF65
#byte UIE = 0xF64
#byte UEIR = 0xF67
#byte UEIE = 0xF66
#byte U1STAT = 0xF61
#byte UCON = 0xF60
#byte UADDR = 0xF63
#byte UCFG = 0xF62
#define UEP0_LOC 0xF6A
|
They're completely diferent from the PIC18F4550 map. I looked the datasheet to get the correct adresses. I looked them to see if the same bits existem in the same places and found no great diferences (most of them related to the external phy support that's missing in this new processor and the streaming parallel port that's also missing).
Finally I did also this:
Code: |
#if defined((__USB_4550__)||(__USB_45K50_))
#define __USB_UCFG_UOEMON 0x40
|
Anyone has new ideas? Thanks! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Wed Aug 28, 2013 12:43 am |
|
|
Hm.
Used this chip myself, and didn't have to change anything. Support was added in February.
They don't directly allocate the memory addresses, but use getenv to get them for this chip. So:
#byte UFRML = getenv("SFR:UFRML")
#byte UFRMH = getenv("SFR:UFRMH")
etc..
They don't actually define UEP0_LOC for this chip (alters the way the driver behaves).
Maybe something is wrong here.
You don't show your clock rate?. Have you tested this?. Always start by verifying the chip is running, and at the right rate - saves a lot of wasted time later....
They don't do any TRIS operations for the pins on this chip (they aren't shared with GPIO operations).
Obvious comments apply about good smoothing on Vusb. How are you generating this?. Using 5v, and the internal regulator, or are you generating this yourself?
Best Wishes |
|
|
dmendesf
Joined: 31 Dec 2005 Posts: 32
|
|
Posted: Wed Aug 28, 2013 11:50 am |
|
|
Hi, I wrote about it to CCS and they told me that this PIC was supported. I was using V4.141 so I installed V5.011 and made a very simple program at V5.011 using USB with this PIC and it works (with a minor flaw that pic18usb.h / pic18usb.c doensn´t recognize PIC18LF45K50, only PIC18F45K50, but that´s easy to fix). I concluded that I have no hardware problems.
So I copied back pic18usb.h / pic18usb.c and 18F45K50.h back from V5.011 to V4.141 and it first gave me a strange error about the fuse "#FUSES MCLR" not being recognized... I commented it out and then it compiled, but the program doesn´t work.
I´m still looking at it, but seems that for this PIC i´ll have to use V5... |
|
|
|