Hallo,
ich habe wieder ein kleine Problem mit meine I2C-Bus Teilnehmern.
Momentan habe ich 3 Teilnehmer am Bus hängen wo mir die Addressen
bekannte sind. Ich möchte mir jetzt einen I2C-Bus Scanner bauen wo mir
die Busaddressen Ausgibt, da ich noch andere Bauteile habe wo ich die
Addresse nicht kenne.
Ich habe mir eine kleines Programm geschrieben wo ich nach der Addresse
schaue und warte auf ein Ack.
1 | uint8_t i2c_check(uint8_t address)
|
2 | {
|
3 | uint8_t retVal = 0;
|
4 |
|
5 | TWCR = ((1<<TWINT)|(1<<TWSTA)|(1<<TWEN)); // TWI aktivieren und Start-Condition ausloesen
|
6 |
|
7 | TWDR = address & (0xFE); //Addresse und schreibbit ins Datenregister
|
8 | TWCR = ((1<<TWINT) | (1<<TWEN)); //senden
|
9 | while (!(TWCR & (1<<TWEN))); //Warten auf Ack
|
10 |
|
11 | if((TWSR & 0xF8) !=TW_MT_SLA_ACK) retVal = 2; //Wenn kein slave abbrechen
|
12 |
|
13 | TWCR = ((1<<TWINT) | (1<<TWSTO) | (1<<TWEN)); //Stop
|
14 |
|
15 | return retVal;
|
16 | }
|
Diese Funktion rufe ich dann in einer For-Schleife auf und gehe die
einzelnen Addressen durch.
1 | for (uint8_t i = 0x00; i < 0x41; i++)
|
2 | {
|
3 | test = i2c_check(0x40);
|
4 |
|
5 | if (test == 2)
|
6 | {
|
7 | Anzahl_ja =+ 1;
|
8 | DDRB = (1<<PB1);
|
9 | }
|
10 | else
|
11 | {
|
12 | Anzahl_Nein =+ 1;
|
13 | DDRB = (1<<PB0);
|
14 | }
|
15 | }
|
Die Lampen lass ich mir anzeigen ob er diese gefunden hat oder nicht.
Ich frage jetzt auch nur bestimmt die Teilnehmer Addresse ab wo ich weiß
das sie auch vorhanden ist "funkioniert". Wenn ich jetzt ander Abfrage
wo nicht vorhanden sind, werden sie dennoch als vorhanden angezeigt.