View previous topic :: View next topic |
Author |
Message |
MikeW
Joined: 15 Sep 2003 Posts: 184 Location: Warrington UK
|
Using I2C hardware - a quick reminder |
Posted: Thu Jan 29, 2009 9:05 am |
|
|
Just a note , if you find that when you are using I2C,
that the force_sw works ( thus forcing the compiler to use software bit banging).
BUT even with I2C hardware present, the force_hw just wont burst into life.
to use h/ware I2C, you MUST set the SDA and SCL tris bits to 1 to set them as inputs. using SET_TRIS_C( 0x18 ); for C3 and C4 as appropriate
Its only when you dig into the datasheet that this becomes plain and clear. |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Thu Jan 29, 2009 12:19 pm |
|
|
That may be true in the data sheet but I would disagree that a CCS user has to do anything out of the ordinary. No TRIS statements should be required at all unless you are overriding the compiler using FAST_IO(). I use I2C all the time, letting the compiler handle the TRIS, and I have never had any problems with either HW or SW I2C. I specify the correct pins and never use force_hw.
What compiler are you using? I am using version 4.81 of PCM and PCH with the 16F877, 16F887, 18F4520 and 18F4550, no problems at all. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jan 29, 2009 1:24 pm |
|
|
The 18F452 data sheet says the SDA and SCL pins must be set to inputs
by the user:
Quote: |
15.4.2 OPERATION
Selection of any I2C mode, with the SSPEN bit set,
forces the SCL and SDA pins to be open drain, provided
these pins are programmed to inputs by setting
the appropriate TRISC bits. |
CCS does this for you. Here's the start-up code inserted by the
compiler. You can see that it sets pins C3 and C4 to inputs:
Quote: |
.................... void main()
.................... {
0022: CLRF TBLPTRU
0024: BCF RCON.IPEN
0026: CLRF FSR0H
0028: CLRF FSR0L
002A: BSF TRISC.3
002C: BSF TRISC.4
002E: MOVLW 09
0030: MOVWF SSPADD
0032: MOVLW 28
0034: MOVWF SSPCON1
0036: BSF SSPSTAT.SMP
0038: BCF SSPSTAT.CKE
003A: BSF ADCON1.PCFG0
003C: BSF ADCON1.PCFG1
003E: BSF ADCON1.PCFG2
0040: BCF ADCON1.PCFG3
|
Here's the test program:
Code: | #include <18F452.h>
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3, FORCE_HW)
//===============================
void main()
{
i2c_write(0x55);
while(1);
} |
|
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Thu Jan 29, 2009 1:57 pm |
|
|
PCM,
You are really good at picking up on someone who posted earlier and
remembering what PIC they are using. I don't have a clue where you saw
he had an 18F452.... |
|
|
|