|
|
View previous topic :: View next topic |
Author |
Message |
dais
Joined: 03 May 2004 Posts: 11
|
I2C clock frequency |
Posted: Mon May 10, 2004 5:56 pm |
|
|
Hi,
I have some problems using fast mode of I2c and obtain different clock freqency.
1.
Here is my code Code: |
#include <16f877.H>
#fuses XT, NOPROTECT, BROWNOUT, PUT, NOWDT, NOLVP
#use delay(clock=20000000)
#use i2c(Master,fast,sda=PIN_C4, scl=PIN_C3, FORCE_HW)
//========================
#byte SSPADD = 0x93
main ()
{
//output_low(PIN_C3);
//output_low(PIN_C4);
//SSPADD = 0X0C; //400kHZ when SSPAD = 0X0C, (20)/[4*(12+1)]
output_float(PIN_C3);
output_float(PIN_C4);
i2c_start();
i2c_write(0x1E);
i2c_write(0x0f);
i2c_start();
i2c_write(0x1f);
i2c_read(0);
i2c_stop();
}
|
Using scope I found When I tried to read I only get 6 clock, and missing stop bit.
however if use
Code: |
#include <16f877.H>
#fuses XT, NOPROTECT, BROWNOUT, PUT, NOWDT, NOLVP
#use delay(clock=4000000)
#use i2c(Master,sda=PIN_C4, scl=PIN_C3, FORCE_HW)
|
I could always get last 8 clock and stop bits, which works correctly.
Does any one know what is problem here?
2. According to data sheet I could use sspdat to control clock frequency, for PIC 16f 877, clock frequency is 20M hz, if I want to have 400 khz, I assigned 0x0C, but no signal at all, sspadd only works at 0x0f.
All the other value such as 0x32(100khz), doesn't work at all. Did I miss something?
3. The most wierd thing is above code works fine except in read, however When I tried to add sspdat = 0x0c, It didn't produce any signal, That's fine, then comment this, recompile the program, orginal one doesn't work too(no signal looks like can not pull down), unless I put output_low(), comment output_float(), compile, run. then next time comment output_low(), uncommen output_float(), I'm really frustrated making such changes.
Does anyone know why? I'm using MPLAB ide 6.5, PCWH3.41, PCM3.181
PIC 16F877, pull up resister is 1K.
Thanks
Simin |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 10, 2004 6:29 pm |
|
|
Quote: | #include <16f877.H>
#fuses XT, NOPROTECT, BROWNOUT, PUT, NOWDT, NOLVP
#use delay(clock=20000000) |
I see two things that could cause problems:
1. Your #fuses statement is set for the XT oscillator mode, but
you're using a 20 MHz crystal. It should be set for HS when
using this crystal. (Use XT for a 4 MHz crystal).
2. You're letting the code fall off the end of main(), where it will
hit a SLEEP instruction. Put a while(1); statement at the end
of main() to prevent this. |
|
|
Guest
|
|
Posted: Mon May 10, 2004 7:16 pm |
|
|
PCM, Thanks for quick reply. Here is modified code
Code: |
#include <16f877.H>
#fuses hs, NOPROTECT, BROWNOUT, PUT, NOWDT, NOLVP
#use delay(clock= 20000000)
#use i2c(Master, fast,sda=PIN_C4, scl=PIN_C3, FORCE_HW)
//========================
#byte SSPADD = 0x93
main ()
{
//output_low(PIN_C3);
//output_low(PIN_C4);
//SSPADD = 0X0F; //400kHZ when SSPAD = 0X0C, (20)/[4*(12+1)]
output_float(PIN_C3);
output_float(PIN_C4);
i2c_start();
i2c_write(0x1E);
i2c_write(0x0f);
i2c_start();
i2c_write(0x1f);
i2c_read(0);
i2c_stop();
while(1)
{
;
}
}
|
Now I could get last 7 clock(sometimes 8 clock), but still miss last stop bit.
If I uncomment sspdat = 0x0f, it didn't produce any signal(this time even 0f not works). if I comment sspdat part, original code not works, unless I uncomment outputlow() part,comment output_float() part compile run it. Then back to orignal code it produce signal.
Thanks
Simin |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 10, 2004 7:40 pm |
|
|
1. What i2c device are you using ? (Give the manufacturer and
part number).
2. Your 1K pull-ups are a bit on the strong side, according to
the i2c specification. They lowest allowable value is 1.6K ohms. |
|
|
Guest
|
|
Posted: Mon May 10, 2004 8:17 pm |
|
|
PCM, thanks. This I2c device is the chip which designed several years ago in our company, I'm now using i2c try to communicate with it, I didn't see the I2c specification yet. I will try to get it by Wednesday, Which key part of data do you think will not let sspdat and fast mode work? Why it works under 4Mhz(SSPDAT still not work).
Again, thanks a lot!
Simin |
|
|
dais
Joined: 03 May 2004 Posts: 11
|
|
Posted: Mon May 10, 2004 10:40 pm |
|
|
I will try to test the code without slave. Question is
1.
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use i2c(master, fast, sda = PIN_C4, scl = PIN_C3, force_hw )
without assigning sspadd, what' default clock speed will SCL be?
Is the oscillator of PIC16F877 running at 20Mhz?
2. Using the SSPADD formula, if clock is 20Mhz we can get from
5Mhz(SSPADD = 0)- 19(SSPADD =255) Khz. according data sheet there are two mode one is 100 khz, the other is 400 khz. If in 400khz, it vary from 19khz-400khz? If in 100 khz, it vary from 19khz-100khz? Is there any minimum clock frequency required?
3. Without ackknowlegement from slave, Can I use sspadd to change speed of clock? For example only use I2c_write() function, and changing sspadd to see if clock speed changes.
thanks!
Simin |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue May 11, 2004 12:20 am |
|
|
Quote: | This I2c device is the chip which designed several years ago in our company, I'm now using i2c try to communicate with it, I didn't see the I2c specification yet. I will try to get it by Wednesday, Which key part of data do you think will not let sspdat and fast mode work? Why it works under 4Mhz(SSPDAT still not work). |
The chip may have been designed to only work with a 100 KHz
i2c clock. (ie., slow speed). You need to find a data sheet
(if they made one) or talk to the chip's designer, or talk to
some other engineer who has used the chip.
Quote: | #fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use i2c(master, fast, sda = PIN_C4, scl = PIN_C3, force_hw )
Question is
1. Without assigning sspadd, what' default clock speed will SCL be?
Is the oscillator of PIC16F877 running at 20Mhz? |
You have specified Fast mode, so the compiler will automatically
calculate the proper value for the SSPADD register, based on
your 20 MHz clock speed. The value it calculates is 0x0B (11 decimal).
The formula is:
Code: |
20 MHz
Baud rate = --------------- = 417 KHz
4 * (11 +1) |
Due to internal delays, the actual i2c clock speed may be somewhat
different than this.
Quote: | Is there any minimum clock frequency required? |
As I recall, if you run the PIC at 20 MHz, the internal delays in the baud
rate generator will have less effect, and the baud rate will be closer to
the expected frequency (based on the formula above).
I have not done any recent experiments to test the SCL clock speed
if the crystal is a low frequency, so I can't answer that question.
Quote: | Without acknowlegement from slave, Can I use sspadd to change
speed of clock? For example only use I2c_write() function, and changing sspadd to see if clock speed changes. |
Yes, you can write a program that has a while() loop, with only one
line of code in it: i2c_write(0x55);
Then the PIC will transmit the same byte continuously. You can
observe the SCL signal. You might want to disconnect the slave chip
from the i2c bus, to make sure it doesn't interfere with your test. |
|
|
Guest
|
|
Posted: Tue May 11, 2004 11:46 am |
|
|
Thanks, I will test tomorrow and post results.
Simin |
|
|
dais
Joined: 03 May 2004 Posts: 11
|
|
Posted: Wed May 12, 2004 3:55 pm |
|
|
Hi,
Bug fixed. Program is good, It is slave problem.
PCM, thanks for the help!
Simin |
|
|
|
|
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
|