SCL bei I²C invertiert?

Gast #2657731
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
Gast #2657792
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.
Gast #2659656
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
}
Gast #2660160
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren