Hallo zusammen, ich kämpfe gerade etwas mit dem TWI Modul von meinen ATMega32u4. Ich schaffe es nicht mit dem TWI Modul mehr als 170 kHz Bustakt zu erzeugen. Der ATMega läugt mit 16 MHz externem Quarz bei 5 Volt. Clock Divider ist 1 JTAG und WatchDog-Timer sind abgeschaltet. Es befinden sich außer einem Logic-Analyser keine Geräte auf dem BUS. Die Pull-Ups haben 1 kOhm. Theoretisch sollte der BUS mit 400 kHz getaktet werden. Tatsächlich kommen aber nur 170 kHz raus. Code (relevanter Part):
1 | CLKPR = 0x80 // clock prescaler freischalten |
2 | CLKPR = 0x00 // clock prescaler auf 1* schalten |
3 | |
4 | TWBR = 3; |
5 | TWSR = 0; |
6 | |
7 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // START senden |
8 | while(!(TWCR & (1<<TWINT))); |
9 | |
10 | TWDR = 0x00; |
11 | TWCR = (1<<TWINT) | (1<<TWEN); // Adresse 0 senden |
12 | while(!(TWCR & (1<<TWINT))); |
13 | |
14 | TWDR = 0x00; |
15 | TWCR = (1<<TWINT) | (1<<TWEN); // Daten 0 senden |
16 | while(!(TWCR & (1<<TWINT))); |
17 | |
18 | TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); // STOP senden |
19 | while(!(TWCR & (1<<TWINT))); |
Vermutlich übersehe ich hier nur etwas, aber ich komme einfach nicht drauf.