TWI-Geschwindigkeit und TWBR
Snip aus einer privaten Konversation. Es geht um den Abschnitt Bit Rate Generator: "Kommt ein Wert kleiner 10 heraus, sollte ein höherer CPU-Takt gewählt werden."
- SprinterSB hat folgendes geschrieben
- Nicht immer ist es möglich oder erwünscht, eine andere CPU-Frequenz zu wählen (anderes Echtzeitverhalten, anderer Energieverbrauch, ausserhalb der Spezifikation, etc).
- Linux 80 hat folgendes geschrieben
- Dann ist es auch nicht möglich die gewünschte Geschwindigkeit zu erzeugen, weiter als in den 1. Gang und Standgas kann der Teiler nicht runterschalten (oder so).
- SprinterSB hat folgendes geschrieben
- Auch Clock-Stretch ermöglich einem langsamen Slave nicht unbedingt, an einem schnellen Bus mitzukommen. Ein Software-Slave hat eine Mindest-Response-Time, in der er SCL ziehen muss. Schafft er das nicht, hat er verloren oder erzeugt sogar ein Bussignal, das ausserhalb der I2C-Spez liegt, wenn er doch noch spät zieht.
- Linux 80 hat folgendes geschrieben
- Mit dem Slave hat das TWBR ja nix zu tun, es geht ja nur beim Master. Ein Slave kommt entweder mit, und kann evtl. die Bremse treten, oder nicht.
Versetehen tu ich es immer noch nicht. Man kann doch TWBR auf den vom Hersteller angegebenen Mindestwert von 10 setzen. Ändern der CPU-Frequenz bedeutet u.U. sogar Änderung in der Hardware (Quarz, Resonator, Oszillator). Und wenn man mit f_CPU schon am Anschlag ist will man nicht unbedingt übertakten.
Ja, der Mindestwert 10 hat mit einem Slave nix zu tun, stimmt. Aber mit "friss oder stirb" kommt man auch nicht weiter, wenn's nicht geht oder ein Slave zu lahm ist...
--SprinterSB 10:25, 12. Jan 2006 (CET)
Danke für's reinkopieren.
Wie ist das wenn man den Controller (I2C-Master) mit 8Mhz laufen lassen will, und eine SCL-Frequenz von 400kHz haben will, was stellt man da dann alles um ? Das Ergebnis für TWBR wäre mit Prescaler 1 dann 2, also kleiner als 10.
Meiner Meinung gibt es nur die Möglichkeiten
- Erhöhung der CPU-Frequenz, oder eben
- eine kleinere SCL-Frequenz als 400kHz (bei Wert 10 etwa 307 kHz) !
--Linux 80 15:16, 12. Jan 2006 (CET)
TWBR gibt doch einen Teiler an für den SCL-Takt, und langsamer zu sein macht kein Problem was I2C angeht, man muss ja keine exakte Baudrate einhalten. Bei TWBR=10, TWPS=0, F_CPU=8MHz komm ich für F_SCL auf ca 222kHz = 8MHz/36. Da braucht man mindestens 14.4MHz für F_CPU. Mit MegaL ist das zB nicht erreichbar. Natürlich ist höherer Takt eine Option, falls der AVR und die Applikation das zulassen. Aber einen Quarz von 14.4MHz wirst du schwerlich bekommen (ausser du brauchst wirklich Stückzahlen). Oder man braucht sogar einen Baud-Quarz weil ein UART am laufen ist und hat noch weniger Auswahl an Frequqnzen.
--SprinterSB 17:21, 13. Jan 2006 (CET)
Das sind dann andere Bedingungen, ich bin davon ausgegangen, man will unbedingt zB. 400kHz haben, alles anderes zweitrangig, muss der Disigner erstmal selber wissen.
Dann schreiben wir, ... wenn kleiner 10 kann man entweder CPU schneller takten, oder Bus ist langsamer !
--Linux 80 19:07, 13. Jan 2006 (CET)