PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Clock Stretching mit Fleury lib



pod32
25.12.2009, 22:12
Hallo,

laut I2C Spezifikation (http://www.i2c-bus.org/de/takterzeugung-clock-stretching-arbitrierung/) kann man den clock beliebig lange ausdehnen.
Leider ist mir nicht ganz klar, wie ich meinen Mega32 mit 16MHz auf bspw. 1kHz bringe :-s
Ich nutze hierbei die bekannte I2C - C Library von Peter Fleury (http://jump.to/fleury).
Ich tippe mal auf:

Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module i2cmaster.S to your target when using the software I2C implementation !

Aber in was ich das abändern soll steht nicht in der Doku O:)

Vielen Dank!

pod32

PicNick
26.12.2009, 14:28
Ich les das so:
Wenn du die I2C-SOFTWARE- variante verwendest, sollst du anpassen:
1 Die Port-Definitions (also welche Pins du nimmst)
2 und (eventuell) in der Delay-Routine die Verzögerungs-Routine (wenn die die Geschwindigkeit verändern willst.

Da musst du dir die Routine angucken, und dann den gewünschten Schleifenzähler a) ausrechnen und b) reinschreiben

Mit Clock-Stretching hat das eigentlich aber nix tu tun

linux_80
26.12.2009, 15:14
@pod32,
Die Clock stretched eig. nur der Slave, wenn ihm der Master zu schnell ist.
Das geht dann aber auch nur, wenn der Master das einplant damit gestretched werden kann.

pod32
03.06.2010, 13:52
Ich les das so:
Wenn du die I2C-SOFTWARE- variante verwendest, sollst du anpassen:
...

Woher erkenne ich welche Variante die Bibliothek nimmt?

Mein aktueller Sourcecode (Versuch einen TMP175 Sensor über I2C auszulesen):


#include <stdlib.h>
#include <avr/io.h>
#include <string.h>
#include "lcd.h"
#include "rn-control.h"
#include "i2cmaster.h"


/** Some DEFINES here...*/
#define Tmp001 0x48

/*### Hauptschleife ###*/
int main(){
/* Initialisierungen */
waitms(1000);
lcd_init(LCD_DISP_ON);
lcd_clrscr();//!< loescht das Display
lcd_puts("initializing i2c...\n");
i2c_init();
unsigned char ret1,ret2;
/* String auf Display anzeigen */
i2c_start_wait(Tmp001+I2C_WRITE);
i2c_write(0xB0);
lcd_puts("done\n"); i2c_rep_start(Tmp001+I2C_READ);
ret1 = i2c_readAck();
lcd_puts((const char*)&ret1);
ret2 = i2c_readNak();
lcd_puts("hurray\n");
//lcd_puts(&ret1);
if(ret1)
lcd_puts("hurray ;\n");
for(;;){//ever
waitms(500);
}
return 0;
}

Möchte gerne statt den 100kHz nur 1kHz als Takt nehmen.
Auf dem Oszi bekomme ich unschöne Taktimpulse...