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

Problem with using MSSP and I2C

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







Problem with using MSSP and I2C
PostPosted: Tue Sep 04, 2007 7:59 am     Reply with quote

Hi,

i am working with PIC18F4620 and i am using I2C bus to communicate with I2C devices (CCS 3,249 is my compiler)

if i use the following preprocessor code the code works fine
#use i2c (MASTER, SDA=PIN_C4,SCL=PIN_C3)

but it genarates the i2c routines by software and i don't want it

i am changing the preprocessor code like this
#use i2c (MASTER, SDA=PIN_C4,SCL=PIN_C3,FORCE_HW)
in order to use hardware for i2c, the compiler compiles the code without any erros but it doesn't work. i checked the list file every thing seems correct (step by step in 18F4620 's PDF file)

what can be wrong am i missing something

thanks.
icesynth



Joined: 03 Sep 2007
Posts: 32
Location: Edmonton, Alberta

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

PostPosted: Tue Sep 04, 2007 10:49 am     Reply with quote

Is there any activity on the SCL or SDA lines when you call the functions?
_________________
Programming for the the real world.
--Chris Burchett
Sylver Technologies Inc.
lozzoloz
Guest







PostPosted: Tue Sep 04, 2007 11:55 pm     Reply with quote

no it doesnt
lozzoloz
Guest







PostPosted: Wed Sep 05, 2007 12:22 am     Reply with quote

i wrote the i2c functions my self it still doesn't work

Code:


//register adresses for 18f4620

#byte SSPCON1 = 0xFC6
#byte SSPCON2 = 0xFC5
#byte SSPSTAT  = 0xFC7
#byte SSPBUF    = 0xFC9
#byte SSPADD   = 0xFC8

#byte PORTC = 0xF82
#bit dir_scl     =PORTC.3
#bit dir_sda    =PORTC.4

void i2c_init_my()
{
   bit_set(SSPSTAT,0);    //SMP=1; standart mode
   bit set(SSPCON1,3);    //SSMP3=1;
   bit_clear(SSPCON1,2); //
   bit_clear(SSPCON1,1); //
   bit_clear(SSPCON1,0); //

   bit_set(SSPCON1,5);    //SSP enable

   SSPADD = 0x4F;         //set i2c speed

   dir_scl=1;                   //i2c pins are input
   dir_sda=1;
   
   return;
}

void i2c_start_my()
{
   bit_set(SSPCON2,0);   //send start
   while(bit_test(SSPCON2,0)); //wait until start has been send
   return;
}



first i call i2c_init_my();
then if i call i2c_start_my();
it doesnt come back from i2c_start_my(); which means SSPCON2,0 is always 1;
Ttelmah
Guest







PostPosted: Wed Sep 05, 2007 2:38 am     Reply with quote

SMP, is bit 7, not bit 0.
Personally, just simpler to write complete bytes. Also, you must set the resource to 'off', before updating some bits. So:
Code:

   bit_clear(SSPCON1,5); //turn off SSP
   SSPCON1=0b10000000;
   SSPSTAT=0b00001000;
  SSPADD=0x4F;
   bit_set(SSPCON1,5); //reenable SSP
   dir_scl=0;      //i2c pins are input - wrong. Table 10-5
   dir_sda=1;       

You need the SCL pin to be set as an output, not an input. Look at table 10-5, which shows how TRIS needs to be set for various modes.

Obvious comment applies though. You _have_ got the resistor pull-ups on the I2C bus?.

Best Wishes
lozzoloz
Guest







PostPosted: Wed Sep 05, 2007 5:52 am     Reply with quote

SMP is bit 7 , this is correct my mistake, but i tried again i have still the same conditions.

i have the pull-up resistors, the circuit and the code is working perfect with #use i2c(master.........) without force_hw

when i write force_hw nothing works, thus i tried to write my own code thought CCS could have the problem but in my code i cant even send start condition

thanks for your comments
Ttelmah
Guest







PostPosted: Wed Sep 05, 2007 6:18 am     Reply with quote

Try selecting a much slower rate.
The big difference, between software, and hardware, is the available drive rates. The software version will 'limit out' on speed, at a rate of only a relatively few tens of kHz.
So use (say):
#use i2c (MASTER, SDA=PIN_C4,SCL=PIN_C3,FORCE_HW,SLOW=50000)

and see if there is any change.
The reason I asked about the resistors, is that functionally, there is not really a true 'open collector' drive available in the software moe, and this is simulated, by using the TRIS to turn off the pull up transistor. The behaviour is slightly different from the hardware mode, and I have seen systems work in software mode, and fail in hardware mode, when the pull-up is inadequate.

Best Wishes
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