View previous topic :: View next topic |
Author |
Message |
searuff
Joined: 22 Mar 2012 Posts: 13
|
PIC16F887 SPI help |
Posted: Thu Mar 22, 2012 4:25 pm |
|
|
Hi, guys. I am trying to work on a project which involved a PIC16887 SPI communication with TDC-GP21. On my code I try this
Code: |
#include <16F887.h>
#FUSES INTRC,NOWDT,NOPUT,NOMCLR,NOPROTECT,NOCPD,NOBROWNOUT,NOIESO,NOFCMEN,NOLVP
#use delay(internal=4000000)
#use spi(DI=PIN_C4, DO=PIN_C5, CLK=PIN_C3, ENABLE=PIN_C0, BITS=16)
#define SSEL PIN_C0
#define D0 PIN_C5
#define DI PIN_C4
#define CLK PIN_C3
main()
{
setup_spi( SPI_L_TO_H | SPI_CLK_DIV_16);
while(1){
SPI_WRITE(0x020F);
spi_write(0x0101);
}
}
|
It seems like that nothing is writing on the chip. I hook PIN C3 and C5 to a oscilloscope and they are always low. Did I miss anything? How can I make sure SPI work on PIC16F887.
Thanks for anyone's help |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19546
|
|
Posted: Thu Mar 22, 2012 4:32 pm |
|
|
You are mixing up two different and incompatible ways of setting up/using the SPI.
_Either_ use #use SPI, in which case you should also select the mode required in this, and then use spi_xfer to send/receive data, _or_ use setup_spi, and spi_write. The latter mode _only_ supports 8bit transfers, and will always talk to the hardware SPI pins.
Best Wishes |
|
|
searuff
Joined: 22 Mar 2012 Posts: 13
|
|
Posted: Thu Mar 22, 2012 4:52 pm |
|
|
Ttelmah wrote: | You are mixing up two different and incompatible ways of setting up/using the SPI.
_Either_ use #use SPI, in which case you should also select the mode required in this, and then use spi_xfer to send/receive data, _or_ use setup_spi, and spi_write. The latter mode _only_ supports 8bit transfers, and will always talk to the hardware SPI pins.
Best Wishes |
Hi, Thanks for the information. I am not familiar with spi. If I have to send 32 bit data to TDC chip, I have to use #use SPI right? I got some code using spi_write and spi_read. I wonder how can I send/read 32bit data using spi_write and spi_read. I will take a look at spi_xfer. Thanks for the help. |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Thu Mar 22, 2012 5:02 pm |
|
|
If you read the datasheet data is sent in 8 bit bytes. Also the chip is
3.3V NOT 5V so be careful! _________________ Google and Forum Search are some of your best tools!!!! |
|
|
searuff
Joined: 22 Mar 2012 Posts: 13
|
|
Posted: Thu Mar 22, 2012 5:17 pm |
|
|
dyeatman wrote: | If you read the datasheet data is sent in 8 bit bytes. Also the chip is
3.3V NOT 5V so be careful! |
I read the datasheet I think the opcode is 8bits, and the register I need to initial is 32 bits. So can I just send out 32bit in 4 times? Thanks for the tips. I was about to send 5V to the Chip. |
|
|
cheeloh1
Joined: 24 Mar 2012 Posts: 3
|
|
Posted: Sat Mar 24, 2012 3:06 pm |
|
|
I am working with searuff on the project. So in our case, we need two types of communication the spi_read and the spi_write. From what I understand, we need the spi_read to read the data from the TDC chip into the PIC. We need the spi_write to send the read data from the PIC to a 7 segment display.
In this case, we should only use the setup_spi command and disregard the #use spi?
Also, one other urgent question that we had was where can we find the definitions of spi_write and spi_read? We believed they would be located in the 16F887.h file, but they are not there. There is no complaints from the compiler about not finding the functions, but we would like to see how they are defined and simply cannot find them anywhere.
Thank you for any help. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Mar 24, 2012 3:35 pm |
|
|
The functions are built-in to the compiler. There is no compilable C source
code in a driver file. But see this thread. It shows the ASM code for
spi_read() and spi_write(). You can look at the .LST file and see what
the compiler is doing:
http://www.ccsinfo.com/forum/viewtopic.php?t=35442
With regard to your questions about the SPI interface to theTDC-GP21,
you need to post a link to the data sheet for that chip. |
|
|
cheeloh1
Joined: 24 Mar 2012 Posts: 3
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Mar 24, 2012 4:40 pm |
|
|
Yes, you can call spi_write() multiple times to write a value larger than
a byte.
Don't do this. It won't work:
Quote: |
SPI_WRITE(0x020F);
|
Instead, do this:
Code: |
spi_write(0x02);
spi_write(0x0F);
|
Of course, you also have to follow the rest of the protocol. If a command
byte is required, then you have to write that first. Also, you have to set
the Slave Select line to a low level during the complete SPI transaction
(command + data bytes). The above example also assumes the MSB
is sent first. You need to carefully read the TDC chip's documentation
and follow it exactly.
Examples of how to write an SPI driver:
http://www.ccsinfo.com/forum/viewtopic.php?t=44786&start=3
http://www.ccsinfo.com/forum/viewtopic.php?t=41059
http://www.ccsinfo.com/forum/viewtopic.php?t=38199 |
|
|
searuff
Joined: 22 Mar 2012 Posts: 13
|
|
Posted: Mon Mar 26, 2012 8:49 pm |
|
|
Hi, now I have a problem of using 2 different interface. One of them is SPI_H_TO_L another one is SPI_L_TO_H. I try to use
Code: |
setup_spi(SPI_MASTER | SPI_CLK_DIV_16|SPI_H_TO_L);
setup_spi2(SPI_MASTER | SPI_CLK_DIV_16|SPI_L_TO_H);
|
and change any spi_write() that use the second one to spi_write2(). but it seems like it doesn't write any data out. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Mar 26, 2012 9:36 pm |
|
|
The 16F887 only has one hardware SPI module, so you can't use
spi_write2() with that PIC.
I tested compiling that function with vs. 4.130 with a 16F887 and it
doesn't give an error message. It should. That's a bug and I'll report
it to CCS. It generates a few lines of useless ASM code, but it doesn't
do anything.
If you want a 2nd SPI port, it will have to be a software port. You can
do that with the #use spi() statement. You must use the spi_xfer()
function to send or receive SPI data. See the CCS manual.
Also, you can't use software SPI to make the PIC be an SPI slave, if
that is your intention. Only hardware SPI should be used for that. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19546
|
|
Posted: Tue Mar 27, 2012 4:15 am |
|
|
It is perhaps worth pointing out that you can mix devices using different SPI standards, onto a single SPI bus, _provided_ they have chip select lines. Sequence is:
setup spi for the device you want to talk to.
_Then_ lower the CS line for this device
Handle the comms to this device
Raise the CS line
So long as you make your 'communication' routine, perform the required setup before the CS is activated, what has happened on the bus the rest of the time, doesn't matter. This also applies to mixing device speeds.
Generally makes things a lot easier than having to implement both a soft, and a hardware SPI, and saves pins as well.
Best Wishes |
|
|
searuff
Joined: 22 Mar 2012 Posts: 13
|
|
Posted: Sat Mar 31, 2012 6:07 pm |
|
|
I use spi seting as this:
Code: | setup_spi(SPI_MASTER |SPI_CLK_DIV_4|SPI_L_TO_H); |
when I do spi_write. I check the output of my PIC and it did have the clk and data I intend to write. I want to check the respond of TDC-GP21. Then I do a read. My read function is as below:
Code: |
int32 read_4byte(byte address)
{
int32 result = 0;
int i;
output_low(tcs);
spi_write(address);
result |= spi_read(0xFF);
result = result<<8;
result |= spi_read(0xFF);
result = result<<8;
result |= spi_read(0xFF);
result = result<<8;
result |= spi_read(0xFF);
output_high(tcs);
return result;
}
|
Seems like I am always reading 0. I don't think I ever successfully wrote data in TDC-GP21. I need some help for the spi interface. Thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Mar 31, 2012 6:18 pm |
|
|
Are you running the 16F887 at +5v and the TDC chip at +3.3v ?
With no level translators ? If so, hardware SPI will not work.
You probably would read all 0's or some other bad data.
You should get the "LF" version of the PIC, such as 16LF887 and run it
at 3.3v, so both the PIC and the TDC chip are at +3.3v. Then hardware
SPI will work. |
|
|
searuff
Joined: 22 Mar 2012 Posts: 13
|
|
Posted: Sat Mar 31, 2012 7:53 pm |
|
|
PCM programmer wrote: | Are you running the 16F887 at +5v and the TDC chip at +3.3v ?
With no level translators ? If so, hardware SPI will not work.
You probably would read all 0's or some other bad data.
You should get the "LF" version of the PIC, such as 16LF887 and run it
at 3.3v, so both the PIC and the TDC chip are at +3.3v. Then hardware
SPI will work. |
I source 16F887 using 3.3 V. I measure the output of SI pin of it. PIC is giving out 3.3 V data. But seems like TDC chip doesn't respond. I tried initialize the register in TDC chip and start a measure. But the Fire_UP pin of TDC never generate any respond. I assumed data was not written. I tried spi_write to a Max7219. Only changing setup to SPI_H_to_L, and I can write on max7219. So I think SPI_write works, but it doesn't work on TDC chip? |
|
|
|