Forum: Mikrocontroller und Digitale Elektronik SCL bei I²C invertiert?


von Georg (Gast)


Lesenswert?

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
Georg

von Der Rächer der Transistormorde (Gast)


Lesenswert?

Georg schrieb:
> Beim Start Bit sollte SCL ja High sein und SDA von High auf
> Low wechseln.

Haben wir verrrgessen kleine Abschlusswiderstand?

von Der Rächer der Transistormorde (Gast)


Lesenswert?

Georg schrieb:
> aber SCL ist im ausgangszustand Low  statt High.

Oder "SPI Mode with Idle state low" im SSP1CON1 gesetzt?

von Georg (Gast)


Lesenswert?

Der Rächer der Transistormorde schrieb:
> Haben wir verrrgessen kleine Abschlusswiderstand?

Abschlusswiderstände habe ich keine, nur die Standard Pull-Ups, ich habe 
2,2K genommen. Kann das denn wirklich an den Abschlusswiderständen 
liegen? Sollte doch eigentlich nichts ausmachen?


Der Rächer der Transistormorde schrieb:
> Oder "SPI Mode with Idle state low" im SSP1CON1 gesetzt?

Du meinst sicher das "Clock Polarity Select bit", oder?
>CKP: Clock Polarity Select bit
>"In SPI mode:
>1 = Idle state for clock is a high level
>0 = Idle state for clock is a low level
>In I2 C Slave mode:
>SCL release control
>1 = Enable clock
>0 = Holds clock low (clock stretch). (Used to ensure data setup time.)"

Da ich im Master Mode bin hat das Bit laut Datenblatt keinen Einfluss. 
Habe es trotzdem mal probiert - ohne Erfolg.

von Georg (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch mal ein Bild meiner Signale (unten SCL, oben SDA)

von Georg (Gast)


Lesenswert?

Hier nochmal die wesentlich Code Zeilen, mit denen ich I2C und meinen 
Controller initialisiere...

__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
}

von Georg (Gast)


Lesenswert?

Also Kommando zurück! Wenn ich den Controller starte, gehen SDA und SCL 
eine Weile High, bis mit
SSP1BUF = 0b10101110;
die erste Adresse verschickt wird. Danach bleibt SCL aber LOW und es 
wird kein Interrupt ausgelöst.
Die Bits dafür habe ich aber gesetzt:
GIE, PEIE im INTCON
PCIE im SSP1CON3
Habe ich eins vergessen? Oder stimmt da sonst noch etwas nicht?
Wäre echt toll, wenn sich Jemand erbarmen würde, ich stehe schon den 
ganzen Tag total aufm Schlauch...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.