I2C-Schnittstelle zum Audio Codec
Zunächst wurde ein Problem bei der Übertragung von Daten an den Audio Codec über die I2C-Schnittstelle gelöst. Wir wollen nun explizit darauf hinweisen, dass dieses Problem im ursprünglichen Projekt von Herrn Nessitt, welches in Quartus 18.0 programmiert wurde, nicht aufgetaucht ist und durch die Konvertierung des Projektes nach Quartus 13.0 entstanden ist. In Quartus 13.0 kam es, bei der Synthetisierung der I2C-Schnittstelle zu Timing Fehlern, sodass die Übertragung unvollständig war und die Steuerregister des Audio-Codecs nicht richtig initialisiert werden konnten. Das Problem ist in folgendem Bild dargestellt, welches mit dem SignalTap II Logic Analyzer aufgenommen wurde.

Es ist zu erkennen, dass bei der Übertragung jedes zweite Datenpaket abgeschnitten wird. Zum Beispiel. dauert die Übertragung des ersten Datenpakets 13FFh deutlich kürzer an, als die des zweiten Datenpakets 1E00h. Dies sollte bei der Übertragung jedoch nicht passieren, da alle Datenpakete gleich lang sind. Dieser Übertragungsfehler ist vermutlich darauf zurückzuführen, dass das Setzen der neuen Sendedaten über ein LOW-aktives Busy-Signal getriggert wird. Wenn diese jedoch zuvor nicht auf HIGH zurückgesetzt wurde, werden die aktuellen Sendedaten direkt überschrieben. Aus diesem Grund haben wir nach jedem Zustand in der I2C-State Machine, also nach dem senden eines jeden Datenpaketes, einen Watezyklus eingebaut. In diesem wartet die State Machine auf eine HIGH-Signal auf der I2C-Busy Leitung. Das nachfolgende Flussdiagramm und der Programmcode stellen die neuen Wartezyklen dar.

Quellcode - neue Wartezyklen I2C