Ich brauche mal wieder Hilfe.
Es wurde der I²C sniffer von Peter D. mit einem Attiny85 aufgebaut. Per
UART gebe ich den Datenverkehr eines TWI auf dem PC aus.
Das TWI besteht aus einem ATmega8 mit LM75 als slave.
Hier der Code vom Master. (LCD Ausgabe etc. entfernt)
Lib. von Peter Fleury
1 | #define F_CPU 3686400
|
2 | #include <util/delay.h>
|
3 | #include <avr/io.h>
|
4 | #include "twimaster.c"
|
5 | #include <avr/interrupt.h>
|
6 | #include <avr/io.h>
|
7 |
|
8 | #define TWI_ADR 0x00
|
9 | #define _TWINT 0b10000000
|
10 | #define _TWEN 0b00000100
|
11 | #define LM75_ADR 0b10010000 // 1001 ist standart und darf nicht verändert werden dann kommen A2=?, A1=?, A0=?
|
12 | #define LM75_CONFIG 0b00000001
|
13 | #define LM75_HYST 0b00000010
|
14 | #define LM75_SET 0b00000011
|
15 | #define LM75_TEMP 0b00000000
|
16 |
|
17 | int ret1;
|
18 | int ret2;
|
19 | volatile int abfrage;
|
20 |
|
21 | int main(void)
|
22 | {
|
23 | TCCR0 = (1<<CS00) | (1<<CS02); // Prescaler 256
|
24 | // Overflow Interrupt erlauben
|
25 | TIMSK |= (1<<TOIE0);
|
26 | wait_ms(200);
|
27 | i2c_init(); // initialize I2C library
|
28 | while(1)
|
29 | {
|
30 | if(abfrage==20)
|
31 | {
|
32 | i2c_start_wait(LM75_ADR+I2C_WRITE); // set device address and write mode
|
33 | i2c_write(LM75_TEMP);
|
34 | i2c_rep_start(LM75_ADR+I2C_READ); // set device address and read mode
|
35 | ret1 = i2c_readAck(); // read first byte from LM75
|
36 | ret2 = i2c_readNak(); // read second byte from LM75
|
37 | i2c_stop();
|
38 | }
|
39 | }
|
40 | }
|
41 |
|
42 |
|
43 | ISR (TIMER0_OVF_vect)
|
44 | {
|
45 | abfrage++;
|
46 | }
|
Code und Hardware vom TWI sollten funktionieren, zumindest bekomme ich
die korrekten Werte auf einem LCD angezeigt.
Hier ein Log vom sniffer:
1 | s90a00as90a00a00np
|
2 | s90a00as90a10a00np
|
3 | s90a00as90a04a00np
|
4 | s90a00as90a00a00np
|
5 | s90a00as90a00a00np
|
6 | s90a00as90a00a80np
|
7 | s90a00as90a00a80np
|
8 | s90a00as90a00a80np
|
9 | s90a00as90a00a00np
|
10 | s90a00as90a00a00np
|
11 | s90a00as91a00a00np
|
12 | s90a00as90a00a80np
|
13 | s90a00as91a00a00np
|
14 | s90a00as90a10a00np
|
15 | s90a00as90a10a00np
|
16 | s90a00as90a10a00np
|
17 | s90a00as91a01a00np
|
18 | s90a00as91a04a00np
|
19 | s90a00as90a00a00np
|
20 | s90a00as90a00a00np
|
21 | s90a00as90a04a00np
|
22 | s90a00as90a10a00np
|
23 | s90a00as90a00a00np
|
24 | s90a00as90a01a00np
|
25 | s90a00as91a04a00np
|
26 | s90a00as90a00a80np
|
27 | s90a00as90a00a00np
|
28 | s90a00as91a01a00np
|
29 | s90a00as90a11a00np
|
30 | s90a00as90a19a00np
|
31 | s90a00as90a18a00np
|
32 | s90a00as90a10a00np
|
33 | s90a00as90a10a00np
|
34 | s90a00as90a11a00np
|
35 | s90a00as90a10a80np
|
Ich versuche das verzweifelt nachzuvollziehen.
Also es fängt mit
-Startsignal vom Master dann
-LM75 Adresse+Read=90
-ACK LM75
-Tempregister LM75=00
-ACK LM75
-Repeat Start vom Master
-LM75 Adresse+ R/W (kann ich nicht nachvollziehen warum manchmal
R oder W)
-Dann sollte das Datenwort vom LM75 kommen. Wo völlig unterschiedliche
Werte stehen, obwohl die Temperatur während des Logs zwischen 20°und 23°
lagen.
-ACK Master
-Dann ein weiteres Datenwort vom LM75? manchmal 0x80 oft 0x00?
-NCK Master
Meiner Ansicht nach müsste das aber etwas anders aussehen?