|
|
View previous topic :: View next topic |
Author |
Message |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
Re: SPI Help |
Posted: Sun Dec 03, 2006 3:59 pm |
|
|
das wrote: | Looking at the Mode 0 0 it generates 4 bytes - not three based on the Figure 5-7. | You are right, I reversed 0,0 and 1,1. |
|
|
das Guest
|
SPI Help |
Posted: Sun Dec 03, 2006 4:11 pm |
|
|
Thank you for the help. I am having some issues compiling the low level changes in. I am getting errors on your recommendation. Do these need another specification? |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun Dec 03, 2006 4:22 pm |
|
|
What is the version number of your compiler? |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun Dec 03, 2006 5:05 pm |
|
|
A problem in your program is that you are trying to read the _RDY signal from PIN_C4. This will return undefined values as the pin is used by the SPI module.
Not tested, but could you give the following program a try?
Code: | #include <16F877.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#define SPI_MODE_0_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_0_1 (SPI_L_TO_H)
#define SPI_MODE_1_0 (SPI_H_TO_L)
#define SPI_MODE_1_1 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
#define LF 10
#define CR 13
#bit SSPEN=0x14.5
void main()
{
int8 byte_1, byte_2, byte_3;
int8 i;
int32 value;
output_high(PIN_D0); //Start with CS high
setup_spi(SPI_MASTER | SPI_MODE_1_1 | SPI_CLK_DIV_4 );
puts("Initialized"); //Output string for debug
while(TRUE)
{
// Toggle CS in order to start AD conversion
output_low(PIN_D0);
output_high(PIN_D0);
// Wait for AD conversion to finish
SSPEN = 0; // disable SPI so we can access the data line.
do
{
// The Ready state is latched on each falling edge of CS and will not
// dynamically update if CS is held low. CS must be toggled high
// through low.
output_low(PIN_D0);
if (input(PIN_C4) == 0) // Check to see if the conversion is completed
break; // Break out of the loop, leaving _CS active.
output_high(PIN_D0);
} while (TRUE);
SSPEN = 1; // Enable SPI again
// Read value from ADC
byte_3 = spi_read(0);
byte_2 = spi_read(0);
byte_1 = spi_read(0);
output_high(PIN_D0); // De-select ADC
value = make32(0, byte_3, byte_2, byte_1);
for (i = 32; i>0; i--)
{
putc(bit_test(value, i-1) + '0');
}
putc(CR);
putc(LF);
delay_ms(10000);
}
} |
|
|
|
Ttelmah Guest
|
|
Posted: Mon Dec 04, 2006 3:43 am |
|
|
PIN C4, should read OK.
If you look at the 'logic' for the I/O pin, there is a pickoff for read, and a picoff for the SPI, and both should be working. When SPI is enabled, it overrides the logic feeding the 'output' connections, but doesn't affect the input connections in this case.
I have driven the ADC involved here OK, but have only used it in single conversion mode, not continuous conversion mode.
I used a pull up on the SD line, and read PIN C4 fine.
Best Wishes |
|
|
Ttelmah Guest
|
|
Posted: Mon Dec 04, 2006 3:48 am |
|
|
I think there is a critical misnderstanding about the useable 'modes' going on here.
If you use the four byte transfer, you cannot read C4, to get the RDY status. When four byte transfer is used, the RDY bit is transferred as the first _bit_ of the fourth byte, and from then he line sits high. To have the bit available to read on pin C4, you need to use the 25bit transfer mode.
Best Wishes |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Dec 04, 2006 8:01 am |
|
|
Ttelmah wrote: | PIN C4, should read OK.
If you look at the 'logic' for the I/O pin, there is a pickoff for read, and a picoff for the SPI, and both should be working. When SPI is enabled, it overrides the logic feeding the 'output' connections, but doesn't affect the input connections in this case. | You are right. Because the digital output is disabled when using SPI I assumed the same to be true for the input. Instead of only reading the table of PortC functions I should have looked at the diagrams as well.
Quote: | I think there is a critical misnderstanding about the useable 'modes' going on here.
If you use the four byte transfer, you cannot read C4, to get the RDY status. When four byte transfer is used, the RDY bit is transferred as the first _bit_ of the fourth byte, and from then he line sits high. To have the bit available to read on pin C4, you need to use the 25bit transfer mode. | Sorry, I don't agree with you here. As I read Figure 5-7 the RDY bit is in the first bit of the _first_ byte. At first I thought we had a misunderstanding in numbering the bytes, which one is first and which one fourth? But then you wrote 'from then the line sits high', this is only true for the byte most right in the picture which I also see as fourth. The fourth byte contains the LSB data bit, not the RDY status bit !
Besides the 3 or 4 byte transfer 'mode' there is also the choice of 'single conversion' and 'continuous conversion' mode. The behaviour of the RDY pin is different in both modes:
1) In the continuous mode the CS pin is always low and the RDY pin dynamically changes depending on the state of the internal conversion process.
2) In 'single conversion' mode the RDY pin shows the Ready state at the time of falling _CS edge. There are no dynamic updates of the RDY pin, in order to get a status update CS must be toggled high through low.
So, in 'single conversion' mode you can always read the RDY status by toggling the CS line, this is independent of reading the data with 3 or 4 byte transfers.
Although my posted code can be simplified by removing all lines referring to SSPEN, I guess it should work as it is. I don't have access to a MCP3551 chip to confirm this, so shoot and tell me if I'm wrong. |
|
|
das Guest
|
SPI Help |
Posted: Mon Dec 04, 2006 8:13 am |
|
|
I can change it to single conversion mode... I just need it to work ASAP. Can I see your code that you used to drive it in single conversion mode? |
|
|
Ttelmah Guest
|
|
Posted: Mon Dec 04, 2006 8:16 am |
|
|
The more I read this part of the sheet, the more I am inclined to go back to my original statement, that you cannot (sensibly) use the 4 byte mode, for continuous conversions!.
The diagram that shows the status in the first bit, is from a mode with CS enabled, where the bit becomes available when CS is lowered, and is then clocked in as the first bit of the first byte. The description text for the two wire transfer (without CS), says that the RDY line activates one clock after 24 bits are transferred, and a transfer cannot be interrupted. As such then, four byte mode cannot be used this way. Look at paragraph 5.4.1. It is the only one that refers to the mode being used, and makes no mention of using a four byte transfer.
Best Wishes |
|
|
das Guest
|
SPI Help |
Posted: Mon Dec 04, 2006 9:47 am |
|
|
Does anyone have code that I can test? I tried ckielstra's code (above), but it still yields zero... |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Dec 04, 2006 9:58 am |
|
|
Back to the basics:
1) What is your compiler version (check the top of the *.lst file)
2) Which processor are you using?
3) What frequency and voltage are you running the processor at?
4) How is the MCP3551 connected? Pull-up / pull-down resistors, etc.. Schematic picture if possible.
5) Other connected hardware?
6) Do you want to run the A/D in continuous or single conversion mode?
7) Provide any other information that might slightly be important to us. |
|
|
das Guest
|
|
Posted: Mon Dec 04, 2006 10:05 am |
|
|
Back to the basics:
1) What is your compiler version (check the top of the *.lst file)
The compiler is new... the latest compiler version.
2) Which processor are you using?
PIC16F877A
3) What frequency and voltage are you running the processor at?
4MHz
4) How is the MCP3551 connected? Pull-up / pull-down resistors, etc.. Schematic picture if possible.
Temporary pull up on CS, otherwise no pullups. C3 is the clock, D0 is the CS, DI is C4. All have 1K resistors inline.
5) Other connected hardware?
The 3551 is routed thru a CS3002 dual Op-amp per the weight application
6) Do you want to run the A/D in continuous or single conversion mode?
It does not matter if I run in continuos or single. I just thought it was easier to run in continuous. If it is not I will run in single.
7) Provide any other information that might slightly be important to us |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Dec 04, 2006 10:21 am |
|
|
Quote: | The compiler is new... the latest compiler version. | If you mean it is a compiler in the 4.xxx series than I have to suggest you stop using it and return to v3.249 (also available for download on the CCS website). The v4.xxx compilers are to be considered Beta versions, do a search on this forum for more information. |
|
|
das Guest
|
SPI Help |
Posted: Mon Dec 04, 2006 12:36 pm |
|
|
This is the downloaded Demo version. I would like to make sure that this will work before I will buy it. |
|
|
das Guest
|
SPI Help |
Posted: Mon Dec 04, 2006 12:38 pm |
|
|
ckielstra's code still yielded zeros. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|