Versuche grade den ATmega32u4 auf eine SCL Frequenz von 400kHz
zubekommen, laut Datenblatt sei das möglich.
Die Formel zum berechnen:
1 | CPU Clock frequency
|
2 | SCL frequency = -------------------
|
3 | 16+2(TWBR)*4^TWPS
|
Meine Initialisierung:
1 | void TWIInit(void)
|
2 | {
|
3 | //set SCL to 400kHz
|
4 | TWSR = 0x00;
|
5 | TWBR = 0x06;
|
6 | //enable TWI
|
7 | TWCR = (1<<TWEN);
|
8 | }
|
TWPS bekommt man nicht auf 0, somit erhalte ich für einen TWBR-Wert von
3 eine Frequenz von 400kHz, zumindest rechnerisch.
Leider sieht die Praxis anders aus, mit einem Logic-Analyzer messe ich
eine Frequenz des SCL Taktes von 177-222kHz, stark schwankend.
Deswegen springt mir besonders diese Randnotiz im Datenblatt ins Auge:
"TWBR should be 10 or higher if the TWI operates in Master mode. If TWBR
is lower than 10, the
Master may produce an incorrect output on SDA and SCL for the reminder
of the byte. "
Was kann ich tun um die im Datenblatt beschriebenen 400kHz zu erhalten?
Mein ATmega32u4 ist auf einem Arduino Pro Micro (Nachbau?) verbaut, aber
der Arduino Bootloader ist nicht drauf. Programme werden Über AtmelFlip
hochgeladen. Externe Quarz hat 16MHz.