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

Does I2c has a minimun clock freq ?

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



Joined: 28 Jan 2004
Posts: 15

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

Does I2c has a minimun clock freq ?
PostPosted: Mon Feb 09, 2004 1:48 pm     Reply with quote

Hello. So am I having trouble with I2C. I have the PC configured as Master with a Lib written by us.
The slave is a PIC 16F876.
Now I can have a million of problems (including PC-Side software problems), but first of all, after a day of insuccess and a lot of posts read, I have a doubt: is there a minimum clock freq for I2C ? The PC library, that uses parallel port to communicate I2C with the pic, every time has to generate a clock sleeps 1ms. This means that I'm going approx 1Kbit at second. Can this is a problem ? Or I can go as slow as I want ?

By the way at the moment I can't get the interrupt function start at all !

If can help here it is my simple simple slave code; at the moment I only would like to see a led turn on when a byte is received.... but it never happens !

:(

PS:
Compiler last version, downloaded yesterday!

Code:

#include <16F876.h>
#device *=16
#device ICD=TRUE
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,RC, NOPUT, NOPROTECT, BROWNOUT, LVP, NOCPD, NOWRT, NODEBUG
#use i2c(Slave,sda=PIN_C4,scl=PIN_C3,address=0xa0,FORCE_HW)

#byte SSPADD = 0x93

#int_SSP
SSP_isr()
{
   int8 InByte;
   output_high(PIN_B2);
   if (i2c_poll()==FALSE) return;
   else
   {
      InByte = i2c_read();
      output_high(PIN_B3);
   }

}


void main()
{
   int i=0;
   int8 InByte;

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_SSP);
   enable_interrupts(global);

   output_low(PIN_B3);
   output_low(PIN_B2);


   while (TRUE)
   {
      output_high(PIN_B5);

      delay_ms(500);
      output_low(PIN_B5);
      delay_ms(500);
   }
}
Felix Althaus



Joined: 09 Sep 2003
Posts: 67
Location: Winterthur, Switzerland

View user's profile Send private message

PostPosted: Mon Feb 09, 2004 2:08 pm     Reply with quote

Hi

According to the official I2C specs, there is no minimum clock frequency (p.32 in my version of the specs)

Felix
fadeout



Joined: 28 Jan 2004
Posts: 15

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

PostPosted: Tue Feb 10, 2004 2:32 am     Reply with quote

That's right. I found it. Thank you.
I'm going to search where is the error...

Bye
Ttelmah
Guest







PostPosted: Tue Feb 10, 2004 3:35 am     Reply with quote

I have done code very like what you are illustrating, but with some major differences. I don't use I2C_POLL inside the interrupt. Instead, I directly read the status of the R/W bit in SSPSTAT, together with the BF bit, and SSPOV. If the slave is meant to be reading, I read the byte, otherwise I write my 'return' data.
Assuming that your master only sends, your code should work.
However the 'inbuilt' functions, have some significant shortcomings, when dealing with interrupt driven I2C, and I have found it much more successful, to 'cook my own', simply following the tables given in the MicroChip data sheet, about which status bits are set in which conditions, and code these directly.
As a seperate comment, you talk about using the parallel port to generate I2C. There could potentially be problems with this, unless you have added open-collector drivers, since though you can potentially drive SCL, and SDA, for data transfers from the PC to the PIC, when a transfer is wanted in the other direction, and the PIC, wants to perform a 'clock hold' state (pulling SCL low, till it is ready to respond with a byte), this would lead to the PIC, and the PC's output drivers fighting each other. Obviously if you have open-collector drivers, this comment doesn't apply, but then the comment, 'have you got the pull-up resistors', does. :-)
The question about timing, has two 'parts'. There is the 'spec', and then there are the individual chips. The spec, says that there is no lower limit, but _some_ chips do have problems at extremely slow speeds. I have in the past seen a problem with a particular ADC, which would reset itself if the entire transaction took more than perhaps 0.5 seconds. However your speed, in this context is still plenty fast enough, and the PIC has no such limit (unless deliberately programmed by using the watchdog, reset by the I2C).

Best Wishes
fadeout



Joined: 28 Jan 2004
Posts: 15

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

PostPosted: Tue Feb 10, 2004 3:45 am     Reply with quote

Thank you Ttelmah; your suggestion are very interesting. I'm only a developer and my understand about elettronics is very poor, but this evening (Italy time) I'll meet who made the circuit and i'll talk about your considerations.

I'm think I'm going to try to do I2c by myself as I see many programmers here does.

Thank you a lot again.

Bye.
Guest
Guest







PostPosted: Thu Feb 12, 2004 12:17 pm     Reply with quote

I2C does *not* have a minimum frequency, but SMBus does. A lot of people use the names "i2c" and "smbus" interchangeably, but SMBus has a minimum frequency of 10KHz (it is otherwise very very very similar).

Secondly, you *must* have open collector outputs and you *must* have pullup resistors on both the clock and data lines. Even if you are the slave of a write transaction, you have to be able to pull the data line low in order to ACK (acknowledge) each data byte that is written, and you will be unable to do that unless you have open collector drivers attached to your parallel port.

Good luck.
fadeout



Joined: 28 Jan 2004
Posts: 15

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

PostPosted: Fri Feb 13, 2004 4:34 am     Reply with quote

Well: I'm quite new to PIC programming. Onestly I don't know what SMBus is... may I take a look to the PIC Datasheet ?

For the open collectors I'm goint to print this topic and bring it to my eletronic designer...

Thank you all again.
fadeout



Joined: 28 Jan 2004
Posts: 15

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

Quite Done
PostPosted: Sat Feb 14, 2004 11:37 am     Reply with quote

I posted a new topic today because I can't get the stop bit, but now it seems to work quite well: there was a problem with a resistance on the circuit: incrementig that the PIC is now able to force down the lines.

Thank you.
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