Hi,
ich habe beim Empfangen von Nachrichten über I2C so meine Probleme.
Und zwar habe ich einen ATMega644 und das TFT-Display "eDIPTFT43-A" von
ELECTRONIC ASSEMBLY über I2C verbunden. Für die I2C Kommunikation habe
ich die Bibliothek von Peter Fleury verwendet. Der Controller steckt im
stk500 Board und zum programmieren nutze ich AVR Studio 4.
Bei drücken eines Touchbuttons am Display wird in den Sendepuffer (vom
Display) eine Nachricht abgelegt (LED für Nachricht im Sendepuffer
leuchtet nun). Diese Nachricht will ich jetzt abholen. Dazu steht in der
Doku des Displays, dass zunächst der Befehl "DC2 1 S bcc" (d.h.
DC2=? 1=Länge S=Sendepuffer anfordern bcc=Checksum) gesendet
werden muss. Das Display bestätigt den Empfang des Befehls mit einen ACK
und beginnt die gesammelten Daten zu senden. Die Nachricht, die vom
Display gesendet wird ist dann folgendermaßen aufgebaut "DC1 len
data bcc". So die Theorie... leider funktioniert das bei mir nicht...
Sobald ich Daten im Sendepuffer habe erhalte ich keine Bestätigung bzw.
keine Daten gesendet.
Man kann erkennen, dass der Befehl "DC2 1 S bcc" gesendet wird,
weil kurz nach dem Senden die LED des Sendepuffers nicht mehr leuchtet.
Ich hab das Gefühl, dass das Display alles richtig macht und den
Sendepuffer entleert - ich allerdings die Nachrichten nicht empfangen
kann.
Kann mir jemand weiterhelfen?
Welche Einstellungen muss ich machen bzw. wie muss ich die Fuses setzen?
Welche Einstellungen muss ich im makefile, makefile.twimaster,
makefile.i2cmaster, twimaster.c und i2cmaster.S machen?
Wenn ich die Doku vom Display richtig verstanden habe, werden die
Pull-Up Widerstände (10k) für die I2C Verbindung durch das
Entwicklerboard des Displays gesetzt.
Im Anhang befindet sich Bilder von den Einstellungen und den Fuses. Mein
Progr habe ich unten gepostet.
Ich hoffe mir kann jemand weiterhelfen.
Vielen Dank für eure Hilfe!
Programm:
1 | #include <util/delay.h>
|
2 | #include <i2c/i2cmaster.h>
|
3 |
|
4 |
|
5 | struct PufferData {
|
6 | unsigned char dc;
|
7 | unsigned char len;
|
8 | unsigned char data;
|
9 | unsigned char bcc;
|
10 | };
|
11 |
|
12 |
|
13 | #define DISPLAY_WRITE 0xDE // Display-Adresse zum Schreiben
|
14 | #define DISPLAY_READ 0xDF // Display-Adresse zum Lesen
|
15 |
|
16 | #define NULL 0x00 // NULL
|
17 | #define ACK 0x06
|
18 | #define DC2 0x12 // 18(dez) Bezeichung für DC2
|
19 | #define S 0x53
|
20 |
|
21 |
|
22 |
|
23 |
|
24 | unsigned char leseDaten() {
|
25 | char dataS[] = {S};
|
26 | unsigned char bccS, lenS = 1;
|
27 | unsigned char ackE = 0;
|
28 | struct PufferData dataE;
|
29 |
|
30 | i2c_init();
|
31 |
|
32 | // Initialisiere Struktur
|
33 | dataE.dc = NULL;
|
34 | dataE.len = NULL;
|
35 | dataE.data = NULL;
|
36 | dataE.bcc = NULL;
|
37 |
|
38 | // Prüfsumme berechnen
|
39 | bccS = DC2 + lenS + dataS[0];
|
40 |
|
41 | // Daten senden (d.h. sind Nutzdaten vorhanden?)
|
42 | i2c_start_wait(DISPLAY_WRITE+I2C_WRITE); // setze Adresse vom Display und Schreib-Modus
|
43 | i2c_write(DC2); // sende DC2
|
44 | i2c_write(lenS); // sende Datenlänge
|
45 | i2c_write(dataS[0]); // sende Nutzdaten
|
46 | i2c_write(bccS); // sende Prüf-Summe
|
47 |
|
48 |
|
49 | // Quittierung vom Display holen (lesen)
|
50 | i2c_rep_start(DISPLAY_WRITE+I2C_READ); // setze Adresse vom Display und Lese-Modus
|
51 |
|
52 | _delay_us(100);
|
53 | ackE = i2c_readAck(); // Quittierung erfolgreich
|
54 |
|
55 |
|
56 | if(ackE == ACK) { // Alles ok - Informationen lesen
|
57 |
|
58 | dataE.dc = i2c_readAck(); // DC2 aus Empfangspuffer bekommen
|
59 | dataE.len = i2c_readAck(); // Länge aus Empfangspuffer bekommen
|
60 | dataE.data = i2c_readAck(); // Anzahl abholbarer Bytes aus Empfangspuffer bekommen
|
61 | dataE.bcc = i2c_readAck(); // Prüfsumme aus Empfangspuffer bekommen
|
62 | }
|
63 |
|
64 | i2c_stop();
|
65 |
|
66 | return 1;
|
67 | }
|