PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C: SCL invertiert



Bastel-Wastel
30.04.2012, 14:25
Hi,

ich bin gerade dabei das I²C Modul meines PIC12F1840 zu konfigurieren.
Nun habe ich es geschafft, dass er einen Befehlt sendet, aber da stimmt
etwas nicht: Beim Start Bit sollte SCL ja High sein und SDA von High auf
Low wechseln. SDA passt soweit auch, aber SCL ist im ausgangszustand Low
statt High. Auch im übrigen Verlauf ist SCL wie invertiert. Gibt es
irgendeine Einstellung, die so ein Verhalten verursachen kann?

Viele Grüße
Wastel

021aet04
30.04.2012, 15:24
Wilkommen im Forum,
I2C gibt es soweit ich weiß nur einen Standart. Bei SPI gibt es soetwas, aber bei I2C wüsste ich nicht. Vielleicht findest du im Datenblatt vom PIC etwas.

MfG Hannes

PICture
30.04.2012, 16:04
Hallo!

Laut deiner Beschreibung könnten Leitungen von SDA und SCL vertauscht sein. ;)

Bastel-Wastel
02.05.2012, 07:21
Wilkommen im Forum,
I2C gibt es soweit ich weiß nur einen Standart. Bei SPI gibt es soetwas, aber bei I2C wüsste ich nicht. Vielleicht findest du im Datenblatt vom PIC etwas.


Vielen Dank!
Im Datenblatt habe ich natürlich schon jede Menge geschaut. Habe das komplette Kapitel durch und auch die Register mit dessen Hilfe bestimmt. Aber nun komme ich einfach nicht weiter :-|

SDA und SDL habe ich nicht vertauscht. Du meinst im Oszi, oder? Ich habe auf SDA auch mal eine 00h gelegt, da war dann recht klar, welcher welcher ist... ;-)

Hat noch Jemand eine Idee?

021aet04
02.05.2012, 08:43
Ich kann dir nichtmehr helfen, da ich mich mit PICs nicht auskenne. Eventuell kann dir jemand Anderer helfen, der sich mit PICs auskennt. Hast du den Aufbau kontrolliert (jede Leitung verfolgt und geschaut ob es richtig angeschlossen ist)?

Kontrolliere den genauen Aufbau, und poste das Programm (könnte vielleicht auch ein Programfehler sein).

MfG Hannes

Bastel-Wastel
02.05.2012, 09:31
Trotzdem vielen Dank! Hier jetzt mal die wesentlichen code Zeilen, die ich für I2C geschrieben habe.

__CONFIG(FOSC_INTOSC & WDTE_OFF);
__CONFIG(LVP_OFF & BORV_25 & STVREN_ON & PLLEN_ON);

void main(void)
{
OSCCON = 0b01101000; //bit7: PLL, bit6-3: 4 MHz internal Clock
OSCSTAT |= 0b00100000; //Start-up Timer on

I2C_Init();

While(1)
SSP1BUF = 0b00000000;
}



void I2C_Init(void)
{
TRISA |= 0b00000110; //SDA and SCL as Input

//SSP1STAT
SSP1STATbits.SMP = 1; //slew rate controll off
SSP1STATbits.CKE = 1; //SMBus disabled

//SSP1CON1
SSP1CON1 = 0x00;
SSP1CON1bits.SSPEN = 1; //initiate SDA and SCL as serial port pins
SSP1CON1 |= 0b00001000; //Master mode
SSP1CON1bits.CKP = 0; //Initiate start condition on SDA and SCL

//SSP1CON2
SSP1CON2bits.GCEN = 0; //Interrupt when general call adr. (0x00) is received in the SSP1SR
SSP1CON2bits.RCEN = 1; //Receive mode enabled
SSP1CON2bits.PEN = 1; //Initiate stop condition enabled. Automatically cleared by hardware
SSP1CON2bits.RSEN = 1; //Repeated start condition

//SSP1CON3
SSP1CON3bits.SBCDE = 1; //Collison Interrupt enabled. See BCL1IF bit in PIR2

SSPADD = 0x09; //FOSC: 4 MHz, Fcy: 1MHz, Fclock
SSP1CON2bits.SEN = 1; //Initiate start condition on SDA and SCL
}

PICture
02.05.2012, 09:51
Im Datenblatt (DB) habe ich auf die schnelle nur das gefunden, was ich in Anhang kopieren versucht habe.

"Cäh" kenne ich gar nicht. ;)

Bastel-Wastel
02.05.2012, 10:01
Da geht es doch um das Read/Write bit. Das ist das letzte Bit in der Adresse, die über SDA gesendet wird und sagt dem Slave, ob er im weiteren Verlauf empfangen oder senden soll. Auf die SCL Leitung sollte das aber keinen Einfluss haben, wenn ich es richtig verstanden habe...

PICture
02.05.2012, 10:15
Sorry, möglicherweise ist das nicht die richtige Erklärung, aber ich bin kein I²C Experte und blicke es nicht so schnell durch. ;)

Bastel-Wastel
02.05.2012, 10:18
Bei mir hat es auch TAGE gedauert, bis ich mal eine Vorstellung hatte, wie ich das genau angehen muss. ;)
Ob meine Register richtig beschrieben sind weiß ich aber immer noch nicht, einige Bits sind mir noch nicht so 100%ig klar...

PICture
02.05.2012, 10:29
Ich kann mich noch erinnern, dass ich beim Gehenlernen mit kleinen Versuchsschritten angefangen habe und danach bisher alles nur versucht habe.

Da ich dir angeblich nicht helfen kann, bleibt mir nur dir vieeel Erfolg wünschen übrig. :)

021aet04
03.05.2012, 06:16
Das R/W Bit wird über die SDA Leitung gesendet und ist dafür da das der Slave weiß ob er nur Daten empfängt oder ob er Daten zurückschicken muss. So wie du es geschrieben hast ist es also richtig.

MfG Hannes

Bastel-Wastel
04.05.2012, 07:19
Also ich habe es jetzt hinbekommen! Ich bin zwar nicht ganz sicher, wo der Fehler war, aber ich habe es einfach nochmal ganz neu programmiert und den gesamten Ablauf mit einer einer "State Machine" in der Interrupt Service Routine gesteuert.
Also bis zu meinem nächsten Problem ;)

PICture
04.05.2012, 19:08
Hallo!

Gratulation ! :D

Dein Vorgehen ist mir sehr gut bekannt und langerer Weg ist oft tatsächlich kürzer als der, auf dem man sich schon lange befindet. Ich habe bisher noch nie versucht die Frage: "Warum ?" zu beantworten, sondern, wie Du, nächste verrückte Idee probiert. :lol: