View previous topic :: View next topic |
Author |
Message |
stoyanoff
Joined: 20 Jul 2011 Posts: 375
|
Problem with MCP2515 and PIC18F86J65 |
Posted: Wed Jul 08, 2015 11:12 am |
|
|
Greetings! I've connected MCP2515 to PIC18F86J65:
MCP2515 CLK -> PIC18F86J65 CLK
SI->SO
SO->SI
Here comes the problem. When I use this spi configuration:
Code: |
#define EXT_CAN_CS PIN_C2
#define EXT_CAN_SI PIN_C4
#define EXT_CAN_SO PIN_C5
#define EXT_CAN_SCK PIN_C3
#use spi(MASTER,MODE=0,DI=EXT_CAN_SO,DO=EXT_CAN_SI,CLK=EXT_CAN_SCK,bits=8,stream=MCP2510)
|
everything works fine!
If I change the pins as they should be (PIN_C4 is SDI and PIN_C5 is SDO) it doesn't work and blocks on the #use spi row.
What's going on here?
Thanks!
PP: Now I`m seeing I`ve put 25MHz quartz, but the MCP2515 max speed is 10MHz. May be this is the problem. Is there any problem if I put 10MHz to the driver and 25MHz to the controller?! I`ll decrease the spi baud rate! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Wed Jul 08, 2015 3:09 pm |
|
|
Lets get this clear. When you switch configuration, you switch the wires as well?.
If so, then speed could be a problem. When you switch to the alternative configuration, you are using software SPI. This runs typically at least 20* slower than the hardware is capable of going. However the hardware SPI can be turned down. The speed you can run the SPI bus at, is dependant on the capacitances you have on your connections, the tendency to ringing etc.. not just the abilities of the chips. The clock speeds of the two devices can be anything you want (suitably supported), it is the interface timing you have to get right.
The 86J at 25MHz, will only be clocking the SPI at 6.25MHz (Fosc/4 is normally the maximum for SPI). The connection should work fine at this, but it suggests you may have a signalling issue at the high rate. You may need to terminate the signal wires at their receive ends to avoid ringing.
Try turning the rate down 1.5625MHz. If this works, and is adequate, 'smile' otherwise you are going to need to look at the actual lines and how they are laid out. |
|
|
stoyanoff
Joined: 20 Jul 2011 Posts: 375
|
|
Posted: Thu Jul 09, 2015 1:37 am |
|
|
No, may be this is the problem. I assumed MCP2515 has software SPI too. It seems it doesn`t. So I need to change the wires and the pin configuration simultaneously.
Thanks! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Thu Jul 09, 2015 2:40 am |
|
|
If you are not swapping the pins, then it says you have a wiring error.
Slaves can't do 'software' SPI (well they can, but only with processors running hundreds of times faster than the SPI rate). So if it is working with the pins reversed, it means you have got the pins reversed somewhere between the chips...
Bus it through with a meter. SDO on the 86J is pin 46 (TQFP package), Then again depending on the package SDI on the 2515, is pin 16 (TSSOP package). Check the connection pin by pin. |
|
|
RF_Developer
Joined: 07 Feb 2011 Posts: 839
|
Re: Problem with MCP2515 and PIC18F86J65 |
Posted: Thu Jul 09, 2015 3:19 am |
|
|
SDO on the master doesn't go to SDO on the slave, and SDI doesn't go to SDI! SDO (Serial Data Out) on the slave goes to SDI (Serial Data In) on the master and vice-versa.
There is no standard for SPI, and there are several alternative names for the signals. I prefer the arguably some what clunkier MISO and MOSI - Master In Slave Out and Master Out Slave In - labels as its a bit clearer as to how to wire them.
I2C is a bit easier in this respect as the labels for the data lines are standardised and the same for all parts.
The MCP2515 will clock up to 40MHz at 5V and 25MHz at 3.3V. The CCS driver assumes its running off a 20MHz clock, so it'll work well above 10MHz. The SPI on the MCP2515 can only run to 10MHz, but that's different from its clock rate. Personally, I'd probably want to run both the PIC and the MCP2515 from the same clock, probably 10, 16 or 20MHz, generated in the PIC from a crystal. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Thu Jul 09, 2015 3:52 am |
|
|
He actually says that in his first post!.
However it sounds as if it has gone wrong somewhere....
On the clocks, I'd slightly 'differ'. Prefer to use an external oscillator _module_ and run everything off this. Don't like tapping extra lines off the PIC oscillator, always tends to result in slight frequency errors. |
|
|
stoyanoff
Joined: 20 Jul 2011 Posts: 375
|
|
Posted: Sat Jul 11, 2015 12:42 am |
|
|
OK! I fixed this. There is a new problem. I've tried to use CAN bus with TCPIP stack. It seems the CCS TCPIP stack v2011-01-26 prevents the usage of SPI interface. How is that possible and how to override it? I couldn't find in the stack files other #use spi definition.
Help, please! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Sat Jul 11, 2015 7:20 am |
|
|
There should be SPI configurations there, but only used if you have selected one of the SPI interfaced modes. They should be there though....
Step back and do a really basic test. Forget about the chip you are actually driving, and configure SPI to some default slow speed, and just have it outputting single bytes at different points scattered through the program. See if it does output them (scope), and if you make the byte values different, then you should be able to which values it outputs, and where these stop. |
|
|
|