Hallo,
vorab, sitze schon wochenlang an diesem Problem und habe schon sämtliche
Foren und Varianten gecheckt und stehe jetzt am Rand meiner Fähigkeiten.
Ich habe einen PIC18F26K22 mit dem ich ein Display (Batron BT HQ
21605AV-YETF-LED04-I2C-5V) über I2C steuern möchte. Quarz 20MHz.
Ich habe bereits die Register und Bits. manuell beschrieben aber auch
die Funktionen aus i2c.h verwendet. Auf dem Oszi sind beide Leitungen
auf 'Dauerhigh'. Verwende auch externe Pull-Ups (10k). Ich bekomm die
Datenleitung einfach nicht runtergezogen für eine Startcondition. Hier
seht ihr 2 von vielen Varianten die ich probiert habe:
1 | //Libraries:
|
2 | #include <p18f26K22.h>
|
3 | #include <stdlib.h>
|
4 | #include <stdio.h>
|
5 | #include <delays.h>
|
6 | #include <i2c.h>
|
7 | ...
|
8 | ...
|
9 | ...
|
10 | void main()
|
11 | {
|
12 | ...
|
13 | ...
|
14 | ...
|
15 | //I2C
|
16 | TRISCbits.TRISC3=1; //SCL Master
|
17 | TRISCbits.TRISC4=1; //SDA
|
18 | OpenI2C(MASTER, SLEW_OFF); // initialize master mode
|
19 | SSP1ADD=0x31; //100kHz
|
20 |
|
21 | oder
|
22 |
|
23 | SSP1CON1=0b00101000; //I2C Enable bit + Master Mode
|
24 | SSP1CON2bits.ACKDT=0;
|
25 | SSP1STATbits.SMP=0;
|
26 | SSP1STATbits.CKE=0;
|
27 | SSP1ADD=0b00010000; //400kHz Baud
|
28 |
|
29 | ...
|
30 | ...
|
31 | ...
|
32 |
|
33 | IdleI2C();
|
34 | Delay10TCYx( 50 );
|
35 | StartI2C();
|
36 | Delay10TCYx( 50 );
|
37 | WriteI2C(0x74);
|
38 | Delay10TCYx( 50 );
|
39 | StopI2C();
|
40 |
|
41 | oder
|
42 |
|
43 |
|
44 | PIR1bits.SSP1IF=0; //Fertig-Anzeige löschen
|
45 | SSPCON2bits.SEN=1; //Bus übernehmen
|
46 | while(!PIR1bits.SSP1IF);//Warte bis Bus übernommen ist
|
47 | PIR1bits.SSP1IF=0; //Zur¸cksetzen
|
48 | SSP1BUF=0x74; //Slave adressieren + Write
|
49 | while(!PIR1bits.SSP1IF);//Warte bis fertig
|
50 | PIR1bits.SSP1IF=0; //Zurücksetzen
|
51 | SSP1BUF=0xAA; //Datenbyte
|
52 | while(!PIR1bits.SSP1IF);//Warte bis fertig
|
53 | PIR1bits.SSP1IF=0; //Zurücksetzen
|
54 | while(SSP1CON2bits.ACKSTAT != 1); //Acknowledge von Slave abwarten
|
55 | SSP1CON2bits.ACKSTAT=1; //Zurücksetzen
|
56 | SSP1CON2bits.PEN=1; //Bus freigeben
|
57 | while(!PIR1bits.SSP1IF);//Warte bis fertig
|
58 | PIR1bits.SSP1IF=0; //Zurücksetzen
|
59 | ...
|
60 | ...
|
Hat jemand vielleicht eine Idee oder einen Code von dem er weiß dass
dieser funktioniert? Ich wäre sehr dankbar.
lg
Patrick