View previous topic :: View next topic |
Author |
Message |
DaveThib
Joined: 17 Oct 2004 Posts: 15 Location: New Hampshire USA
|
Using SPI Functions in Slave Mode |
Posted: Fri May 20, 2005 1:05 pm |
|
|
In a recent project I used two pics. They communicated using SPI with one in slave mode. I am exchanging two byte commands between the PICs so using SPI is very handy. Every time they communicate they either send real data or null data to each other at the same time. My programs in both chips have a lot going on and cannot wait for the data to clock in or out. I am using state machines and I go away while the data is clocking and come back when it is ready. On the master side it is quite easy by using SPI_Data_Is_In() and then just using a SPI_READ() to read the data without a clock. When I start the clock I use SPI_WRITE(data) to clock and send data.
Now moving over to the slave side of things. When the master processor signals that the slave needs to load the buffer I then need to load the buffer. I can use the SPI_WRITE(data) to do this but then I noticed that it waits around for all eight bits to clock in before continuing. I DO NOT want to hang around and wait for the data to clock in. I do not see anywhere in the refenerence manual where I can load the SSPBUF and not wait around for the data. Is there something I am missing?
I got around this problem by mapping the SSPBUF memory location to a variable and writing directly to it. I then can go on doing other things and I keep checking back using SPI_Data_Is_In() and it is working just great. It just seems to me there should be a way to do this using standard functions.
Thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri May 20, 2005 1:27 pm |
|
|
Quote: | It just seems to me there should be a way to do this using standard functions. |
Not necessarily. The standard functions only have whatever features
that the programmer at CCS decided to put into them. Whenever you
want more advanced features, you may have to write your own
functions.
See this thread. CCS didn't (or doesn't) support the 2nd MSSP
channel on a particular PIC. So I show how to add SPI support
for the 2nd channel. You're interested in the SPI write function,
so you could look at the C code for it, and modify it to remove
the BF flag check.
http://www.ccsinfo.com/forum/viewtopic.php?t=22705 |
|
|
DaveThib
Joined: 17 Oct 2004 Posts: 15 Location: New Hampshire USA
|
Thanks |
Posted: Fri May 20, 2005 1:41 pm |
|
|
OK, Well I guess I was not that far off since that is basically what I did. I do have a project starting soon that I will need to use two MSSP modules so you just saved me a couple of hours of "how do I?" frustrations!
I also noticed in this last project that there is no standard argument in Setup_SPI to disable the Slave Select. It was not a big deal since I am getting used to how to get around unsupported features.
Thanks Again! |
|
|
Ttelmah Guest
|
|
Posted: Fri May 20, 2005 2:22 pm |
|
|
For doing the 'slave' in the past, I had the similar problem, and used:
Code: |
#byte SSPBUF = 0xFC9
#byte SSPCON = 0xFC6
#byte I2CBUF = 0xFC8
#byte SSPSTAT = 0xFC7
/* Now the SSP handler code. Using my own, since the supplied routines test the wrong way round for my needs */
#DEFINE READ_SSP() (SSPBUF)
#DEFINE WAIT_FOR_SSP() while((SSPSTAT & 1)==0)
#DEFINE WRITE_SSP(x) SSPBUF=(x)
#DEFINE CLEAR_WCOL() SSPCON=SSPCON & 0x3F
|
These allow 'lower level' access, just putting the byte into the or reading the byte from the buffer, with seperate tests if required.
Best Wishes |
|
|
|