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
Georg schrieb: > Beim Start Bit sollte SCL ja High sein und SDA von High auf > Low wechseln. Haben wir verrrgessen kleine Abschlusswiderstand?
Georg schrieb: > aber SCL ist im ausgangszustand Low statt High. Oder "SPI Mode with Idle state low" im SSP1CON1 gesetzt?
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.
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 }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.