Hallo!
Hast du den Fehler behoben? Falls ja, würde es mich sehr interessieren
wie bzw. woran es gelegen hat. Ich selbst will gleiches realisieren,
Kommunikation zwischen zwei PICs über I²C; stecke aber mit selbigen
Symptomen, wie du beschrieben hast, fest.
Was ich noch von meinem Oszi entnehmen kann ist, dass der Slave (der
sich eigentlich nicht angesprochen fühlt) mit dem 9.bit kein ACK zurück
sendet.
Codeschnipsel Slave:
Mit
1 | OpenI2C(SLAVE_7, SLEW_OFF); //not interrupt driven
|
2 | SSPADD=0b00001110;
|
3 | while(1)
|
4 | val = ReadI2C();
|
5 | ...
|
lese ich interessanter weise immer die Slave Adresse, welche vom Master
am Bus gelegt wird. Wahrscheinlich wird alles vom Bus vom SSP Modul
aufgeschnüffelt... Dennoch mit
1 | OpenI2C(SLAVE_7, SLEW_OFF); //not interrupt driven
|
2 | SSPADD=0b00001110;
|
3 | if (DataRdyI2C()){
|
4 | val = ReadI2C();
|
5 | ...
|
6 | }
|
springt der Code nie in den Block hinein (da sich der Slave anscheinend
nicht angesprochen fühlt).
Der Mastercode macht in etwa folgendes:
1 | OpenI2C(MASTER, SLEW_OFF);
|
2 | SSPADD=39; //@actually 16MHz Clock
|
3 | SSPCON1bits.WCOL = 0b0; //keine Ahung warum es vor dem ersten Write nötig ist
|
4 | IdleI2C();
|
5 | StartI2C();
|
6 | IdleI2C();
|
7 | if(WriteI2C(slave_adress) == 0) //0b00001110
|
8 | WriteI2C(data);
|
9 | IdleI2C();
|
10 | StopI2C();
|
Habe schon mit Brute-Force versucht die Adresse anzusprechen (eifacher
7-bit Counter), da ich dachte, die Bits werden wohlmöglich verkehrt auf
den Bus abgelegt, aber keinen Erfolg damit erziehlt.
Ich habe mit Assembler wenig zu schaffen gehabt, und will mich damit
nicht viel beschäftigen müßen. Ich verwende die c18 Libraries von
Microchip. Mittleweile (nach etwa drei Tage surfen und suchen) muss ich
zugeben, dass man genügend Master Tutorials im Netz findet, aber keine
wirklich brauchbare mit c18-Libs für Slaves.
Ich kann nur hoffen, dass du dein Posting gelegentlich beobachtest, bzw.
jeman anderes sich meinem Problemchen annimmt! :)
lg & thx im vorhinein,
r