CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

I require help with SPI.

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
theMagni



Joined: 21 May 2004
Posts: 48
Location: Victoria, BC

View user's profile Send private message Visit poster's website

I require help with SPI.
PostPosted: Thu Jun 03, 2004 3:25 pm     Reply with quote

Hello, forum.

I'm having trouble using the SPI interface. I'm using a 16F87 as the PIC, and trying to connect with a RTC chip (the 4574A to be precise).

One of my problems stems from the fact that some joker over-wrote the ex_spi.c file in the examples directory, so I haven't got the slightest idea how I'm supposed to set it up. I lookd through the examples on the forum, but I can't see how to decide the clock divisions or the edge that I should be interested in.

Further, I don't think the RTC has SPI. Can I still use SPI? There's an EEPROM with SPI on the same data wire, and I'd hate to have to send the boards back to production. (I didn't design the boards.)

Thanks for your help.
Neutone



Joined: 08 Sep 2003
Posts: 839
Location: Houston

View user's profile Send private message

PostPosted: Thu Jun 03, 2004 3:31 pm     Reply with quote

Install the compiler version you wish to use again. It will over write all files supplied by CCS. Because of this you should never modify the files supplied by CCS unless you first change the file name.
theMagni



Joined: 21 May 2004
Posts: 48
Location: Victoria, BC

View user's profile Send private message Visit poster's website

PostPosted: Fri Jun 04, 2004 4:35 pm     Reply with quote

I'm not really interested in reinstalling the software. I'm trying to find out how to initialize the SPI settings on a PIC16F87. Although the traget chip doesn't specifically support SPI, I'll be able to trick it into accepting the data, as long as I can send data down to the chip.

An oscilloscope shows that there's a pulse on the SCK, but there's nothing going down the data pipe. Do I have to initialize the pins, or does the compiler automagically know based on my chip?

Thanks.

Here's what I've got so far (snippets, of course):

Code:

  SSPCON =  0b00100000;
  SSPSTAT = 0b10000000;
  setup_spi( SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_64 );
  delay_ms(1000);

    //The point of this is to write the seconds, read the seconds,
    //then read the seconds (and print them) every 5 seconds for
    //15 seconds. Hopefully I'll see an increase.
    if( write_RTC_data( SEC, 5 ) )
    {
      printf("SEC: %u (default)\n\r", returned );
      returned = read_RTC_data( SEC );
      printf("SEC: %u\n\r", returned );
      returned = read_RTC_data( SEC );
      printf("SEC: %u\n\r", returned );
     }


int1 write_RTC_data( int address, int data )
{
  int data_out = 0;
  //turn the RTC chip on.
  CS_RTC = HIGH;
  //There is an 800ns CS delay. Refer to application notes.
  delay_us(1);
  //Takes the RTC_WRITE signal
  data_out = RTC_WRITE;
  //and moves it to the front of the outgoing signal.
  data_out = data_out << 4;
  //The first step is to disable the clock while it's being updated.
  //This is strongly recommended by the manufacturer. CONTROL2 is
  //the control register with the hold/reset/stop.
  //MAKE CERTAIN THAT BIT SIX IN THIS REGISTER IS ALWAYS LOW.
  data_out = data_out | 0b00001111; //0x0f is the CTRL2 register.
  printf("WRITING: %u\n\r", data_out );
  spi_write( data_out );
  spi_write( STOP_CLOCK );

  //In order to start writing again, we have to turn the CS on and
  //off. It's weird, but I couldn't see another way.
  CS_RTC = LOW;
  delay_us(1);
  CS_RTC = HIGH;
}

Kenny



Joined: 07 Sep 2003
Posts: 173
Location: Australia

View user's profile Send private message

PostPosted: Fri Jun 04, 2004 6:42 pm     Reply with quote

The data sheet shows that the clock needs to have a rising edge at mid-bit time. Also, the clock period minimum is 350nS so there's no need to divide down the pic clock frequency much.

setup_spi( SPI_MASTER | SPI_L_TO_H |SPI_CLK_DIV_16);
(leave out the SSPCON and SSPSTAT statements unless you need to change them as follows, in which case you would OR them with the the additional bits after the setup_spi directive).
The idle state of the clock is high according to the data sheet, so you may need to set the CKP bit as well since the compiler doesn't give this option I think (I'm not at work to check what I'm saying).

I would write a small program to test the spi interface on it's own to make sure that it's doing the right thing (you have an oscilloscope).

while(1)
{
spi_write(0x55); // send alternating ones and zeros
}
Guest








Re: I require help with SPI.
PostPosted: Thu Oct 06, 2005 8:50 am     Reply with quote

theMagni wrote:
Hello, forum.

I'm having trouble using the SPI interface. I'm using a 16F87 as the PIC, and trying to connect with a RTC chip (the 4574A to be precise).

One of my problems stems from the fact that some joker over-wrote the ex_spi.c file in the examples directory, so I haven't got the slightest idea how I'm supposed to set it up. I lookd through the examples on the forum, but I can't see how to decide the clock divisions or the edge that I should be interested in.

Further, I don't think the RTC has SPI. Can I still use SPI? There's an EEPROM with SPI on the same data wire, and I'd hate to have to send the boards back to production. (I didn't design the boards.)

Thanks for your help.
Mark



Joined: 07 Sep 2003
Posts: 2838
Location: Atlanta, GA

View user's profile Send private message Send e-mail

PostPosted: Thu Oct 06, 2005 9:05 am     Reply with quote

Must be the same DA that was quoting old posts in another topic Razz
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Thu Oct 06, 2005 9:33 am     Reply with quote

I couldn't find the datasheet for the RTC-4574A. Is the RTC-4574JE similar? http://www.eea.epson.com/go/Prod_Admin/Categories/EEA/QD/Real_Time_Clocks/displayItem?itemId=RTC-4574JE&categoryId=EEA.QD.Real_Time_Clocks

Quote:
Further, I don't think the RTC has SPI. Can I still use SPI? There's an EEPROM with SPI on the same data wire, and I'd hate to have to send the boards back to production. (I didn't design the boards.)

Assuming the RTC-4574JE is similar to the RTC-4574A you have a problem. The chip has a bidirectional data bus while SPI has seperate data lines for input and output. I've seen simple solutions to make this compatible to SPI but don't know the links anymore. The EEPROM on the same bus could make things complicated though. Maybe someone with more electronics knowledge can jump in here?
Mark



Joined: 07 Sep 2003
Posts: 2838
Location: Atlanta, GA

View user's profile Send private message Send e-mail

PostPosted: Thu Oct 06, 2005 9:35 am     Reply with quote

I wouldn't waste my time looking. The post is a year old and no one really asked a question!
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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