Hallo,
ich bin gerade dabei, selbst ein I2C Lib zu schreiben. Naja die
Funktionen fürs Senden funktionieren auch schon.
Hier der Quelltext:
1 | #define START ?
|
2 | #define CHECK ?
|
3 | #define SCL_CLOCK 100000L
|
4 |
|
5 | void i2c_init()
|
6 | {
|
7 | TWSR = 0; // no prescaler
|
8 | TWBR = ((F_CPU/SCL_CLOCK)-16)/2; // must be > 10 for stable operation
|
9 | }
|
10 |
|
11 | void i2c_start()
|
12 | {
|
13 | TWCR = (1<<TWINT)|(1<<TWSTA)| (1<<TWEN); //send start condition
|
14 |
|
15 | while (!(TWCR & (1<<TWINT))) //wait till start condition has been sent
|
16 | {
|
17 | }
|
18 |
|
19 | //if ((TWSR & 0xF8) != START) //check if start codition was succesfull - else call ERROR()
|
20 | //ERROR();
|
21 | }
|
22 |
|
23 | void i2c_write(uint8_t data)
|
24 | {
|
25 | TWDR = data; //load data to register
|
26 |
|
27 | TWCR = (1<<TWINT) | (1<<TWEN); //start transmission
|
28 |
|
29 | while (!(TWCR & (1<<TWINT))) //wait till transmission is finish
|
30 | {
|
31 | }
|
32 |
|
33 | //if ((TWSR & 0xF8) != CHECK) //check if transmission was succesfull - else call ERROR()
|
34 | //ERROR();
|
35 | }
|
36 |
|
37 | void i2c_stop()
|
38 | {
|
39 | TWCR = (1<<TWINT)|(1<<TWEN)| (1<<TWSTO); //send stop condition
|
40 | }
|
So. Das ganze habe ich auf einem ATmega32 getestet. Der Aufruf sieht so
aus:
1 | i2c_init();
|
2 | i2c_start();
|
3 | i2c_write(0xC2); //send slave-adress
|
4 | i2c_write(data); //send data
|
5 | i2c_stop();
|
Es tut auch ales soweit. Aber nur, wenn ich die if's auskommentiere. Das
Problem dabei ist nämlich das ich nicht weiß, als was ich "START" und
"CHECK" definieren muss.
Die Funktionen habe mit Hilfe des Datenblattes vom ATmega32 erstellt.
Nur die Funktion i2c_init() habe ich soweit aus der Lib von Peter Fleury
entnommen. Kann mir jemand erklären, was die genau macht? Setzt die die
Übertragungsgeschwindigkeit?
Eins ist mir noch sehr unklar: wie empfange ich etwas über i2c? wie
läuft das ab?
Gruß
Doran