Hallo,
ich will auf einem PIC16F88 ein Software I2C realisieren, da der SSP
schon mit SPI belegt ist. So, zunächst hatte ich das Sample von Hi-Tech
genommen, man muss das rad ja nicht immer neu erfinden. Das
funktionierte nicht, und irgendwo hatte ich gelesen, dass der Code
fehlerbehaftet sei. Ich habe mittlerweile mehrere Codes gefunden, und
keine hat funktioniert. nehmen wir mal als Beispiel den Code von dieser
Seite: http://www.electronicslab.ph/forum/index.php/topic,4679.0.html
Eigentlich muss ich nur noch die Pins definieren. Bei mir sieht dieser
Teil dann so aus:
1 | #define SCL RA7
|
2 | #define SCL_TRIS TRISA7
|
3 | #define SDA RA6
|
4 | #define SDA_TRIS TRISA6
|
Um vorweg mögliche andere Fehler auszuschließen: Was ich ansteuern will
ist ein RDS processor, der TDA7333. Dazu habe ich ein kleines Platinchen
gemacht, wo dieser drauf sitzt. Verbinde ich diese an eine I2C Leitung,
die von einem PIC24 mit Hardware I2C gesteuert wird, antwortet mein
Platinchen brav. Will sagen, hardwaremäßig sollte alles in Ordnung sein.
Sowohl beim PIC24 als auch beim PIC16 sind 10k Pull ups an den Clock-
und Datenleitungen.
Mit dem Oszi sehe ich mit dem PIC24 als Master folgendes: Gebe ich die
richtige Adresse ein, setzt der Slave (in diesem Fall der TDA7333) SDA
auf LOW, der Master erkennt dies erwartungsgemäß, und gibt den Bus mit
Setzen der SCL auf HIGH wieder frei. Anschließend wird dann auch SDA auf
HIGH gesetzt. Gebe ich die falsche Adresse ein, bleibt SDA auf HIGH, der
Master belässt somit die SCL auf LOW.
So, mit dem PIC16F88 verhält sich immer so, als würde sich der Slave
nach Senden der richtigen Adresse erwartungsgemäß quasi zurückmelden,
auch wenn ich die falsche Adresse schicke! Timings und Signale scheinen
zu stimmen, aber irgendwie kommt immer nur Müll heraus. Was stimmt hier
nicht? Wahrscheinlich übersehe ich irgend eine Banalität...