Gibt es mit C18-Software-I²C-Bibliotheken eine intelligente Möglichkeit, die Busgeschwindigkeit einzustellen?

Nachdem ich wie hier beschrieben auf Probleme mit Hardware-I²C gestoßen war , entschied ich mich, Software-I²C mit den Bibliotheksfunktionen des MPLAB C18-Compilers auszuprobieren. Glücklicherweise erzeugen die Libraries gut aussehende Signale an den Pins, aber ich mache mir etwas Sorgen um die von ihnen verwendeten Timings.

Die Dokumentation und die Quelldateien des C18-Compilers geben nicht explizit an, für welche Busgeschwindigkeit und Oszillatorfrequenz die Verzögerungen in Funktionen eingestellt sind, daher frage ich mich, ob es einen besseren Weg gibt, sie anzupassen, als durch Quelldateien zu tauchen und von Hand zu berechnen Anzahl der Verzögerungen, die ich brauche.

Ich würde nicht in die Nähe von C18 IIC-Bibliotheken gehen. Ich weiß nicht, welche Art von Kompromissen sie für mich gewählt haben. IIC ist zu einfach, um ein Risiko für einige vorgefertigte Bibliotheken einzugehen. Selbst wenn Sie dies tun, könnten Sie es selbst geschrieben haben, bis Sie sich vergewissert haben, dass sie wirklich tun, was sie wollen, und genau verstehen, wie. Gehen Sie zu embedinc.com/pic/dload.htm und installieren Sie die PIC Development Tools und PIC 18F USB Framework-Versionen. Mein generisches Firmware-IIC-Modul der U1EX-Firmware befindet sich in SOURCE > USB mit dem Namen U1EX_IIC.ASPIC. Es ist einfach anzupassen, und Sie können genau sehen, was vor sich geht.
@Olin Lathrop Danke für den Link. Sieht interessant aus.
@OlinLathrop, auf welche Art von Kompromissen beziehst du dich? Ich denke, mein allgemeiner Mangel an tiefem Verständnis von I2C hat mich dazu gebracht, mich für die C18-I2C-Bibliothek zu entscheiden, und sie scheint für mein serielles EEPROM gut zu funktionieren. Aber jetzt muss ich einen Blick auf Ihre Bibliothek werfen, um zu sehen, welche Art von Anpassung möglich ist. :)
@Dave: Wenn Sie IIC nicht verstehen, ist dies das erste, was Sie beheben müssen, bevor Sie versuchen, es zu verwenden. Anders als auf großen Systemen mit einer Betriebssystemschicht und vielen Bibliotheksaufrufen haben Sie auf kleinen Systemen nichts zu tun, was Sie nicht verstehen. Am Ende verbringen Sie mehr Zeit damit, vorgefertigte Bibliotheken dazu zu bringen, das zu tun, was Sie tun möchten, Bugs zu jagen, die keinen Sinn ergeben, oder später sogar Feldfehler zu finden, alles nur, weil Sie ein wichtiges Detail übersehen haben, mit dem Sie davongekommen sind auf die geringe Menge an Prototypen mit ihren begrenzten Anwendungsfällen.
@OlinLathrop beziehen Sie sich speziell auf Fälle, in denen man ein I2C-Gerät entwirft? Wenn ja, dann würde ich zustimmen. Aber wenn Sie nur ein OTS-Teil verwenden, das 7-Bit-Adressierung verwendet und die zwei typischen Geschwindigkeiten (100 kHz und 400 kHz) unterstützt, warum ist es dann so schlecht, die C18-Bibliothek zu verwenden?
@Dave: Vielleicht haben sie es für den Fall, der Ihnen wichtig ist, richtig gemacht, aber wenn Sie es überprüfen, hätten Sie den Code selbst schreiben können, und dann wissen Sie genau, was es tut. Außerdem ist es auf diesen kleinen Systemen eine schlechte Idee, Ebenen blind zu verwenden, ohne zu verstehen, was darunter vor sich geht.

Antworten (2)

Normalerweise erstelle ich ein Makro, das meine Systemtaktfrequenz definiert.

#define GetSytemClock() (41666667ul)

Erstellen Sie dann ein Makro mit der Formel im Datenblatt zur Berechnung der Taktfrequenz.

#define GetSSPBRG(i2c_clk) (((GetSystemClock()/i2c_clk)/4)-1)

Übergeben Sie die gewünschte i2c-Taktrate (Hz) an das Makro GetSSPBRG() und es wird den korrekten Wert für das SSPxADD-Register bereitstellen.

Die Initialisierung der Kommunikation erfordert die Überprüfung aller Ihrer Annahmen. . . Überprüfen Sie die Signalintegrität an beiden Enden mit zwei Sonden AB im Differenzmodus. Verwenden Sie Ferritperlen oder -kerne im Kommunikationsmodus, um sicherzustellen, dass kein CM-Störrauschen in ein Differenzsignal umgewandelt wird. Stellen Sie sicher, dass die Impedanz richtig abgeschlossen ist und die Pegel gut sind. . Ist die Uhr auf RTC mit Caps eingestellt? und richtig einstellen? Haben Sie das Zurücksetzen lange genug zugelassen, damit die Uhr gestartet werden kann? Läuft es mit der richtigen Rate? Überprüfen Sie beide Enden und wählen Sie einige Testmuster wie U = 55h = 01010101 3 = 33h = 00110011. Überprüfen Sie mit dem Bereich, den Sie senden.

Dann senden Sie den Generalrufbefehl 00h.

Dann rufen Sie für Pizza an.

Tatsächlich ist diese Antwort für die Frage nicht sehr relevant, da davon ausgegangen wird, dass tatsächlich eine ordnungsgemäße Funktion vorliegt ICH 2 C Bus, der eine Fehlerbehebung benötigt. Das Problem ist, dass ohne Einstellungen die Taktfrequenz in meinem Fall 125 kHz beträgt und ich sie auf 100 kHz einstellen muss. Einige Quellen sagen, dass ich das SSPADD-Register auch im Softwaremodus verwenden sollte, um die Taktfrequenz einzustellen, aber ich hatte nicht genug Zeit, um das zu bestätigen.