Hallo Zusammen, ich habe ein Problem mit I2C (PIC18F). ich bin momentan bei Master. ich versuche Daten zu schicken aber es komme immer nichts aus. ich weiss nicht wo mein Fehler liegt. das sind mein Code: void I2C_WRITE(void) { u08 Data[8]={0xA5,0xD5, 0x50, 0xA5, 0xF5, 0x05,0x64, 0xAF}; int counter; I2C_Start(); PIR1bits.SPPIF=1; // set Flag I2C_ReStart(); SSPBUF=0x45; PIR1bits.SPPIF=0; // set Flag I2C_ACK(); for(counter=0;counter<8;counter++) { SSPBUF=Data[counter]; } I2C_ACK(); while(PIR1bits.SPPIF); PIR1bits.SPPIF=1; // Flag to Zero I2C_Stop(); } Danke für ihr Hilfe.
Hab das mal etwas ordentlicher gemacht: :)
1 | void I2C_WRITE(void) |
2 | {
|
3 | u08 Data[8]={0xA5,0xD5, 0x50, 0xA5, 0xF5, 0x05,0x64, 0xAF}; |
4 | int counter; |
5 | |
6 | I2C_Start(); |
7 | PIR1bits.SPPIF=1; // set Flag |
8 | I2C_ReStart(); |
9 | SSPBUF=0x45; |
10 | PIR1bits.SPPIF=0; // set Flag |
11 | I2C_ACK(); |
12 | |
13 | for(counter=0;counter<8;counter++) |
14 | {
|
15 | SSPBUF=Data[counter]; |
16 | }
|
17 | |
18 | I2C_ACK(); |
19 | while(PIR1bits.SPPIF); |
20 | PIR1bits.SPPIF=1; // Flag to Zero |
21 | I2C_Stop(); |
22 | }
|
Ich kenn mich mit PIC nicht aus, aber das mit dem ReStart und ACK kommt mir spanisch vor. Du willst doch nur senden und nicht empfangen, oder? Sendet der PIC nach dem ersten I2C_Start() schon die Slave Adresse? Sieht irgendwie danach aus als ob die die Adresse erst nach dem I2C_ReStart sendest. Und was macht denn die Funktion I2C_ACK() ? Sendet die ein ACK oder empfängt die einen? Wenn du nur sachen sendest, schickt nur der Slave ein ACK.
Ja ich will nur zuerst senden. und empfang keine Daten mit mit meine Analysator
Hallo zusammen ich habe weiter bearbeitet.Und mit Logicort analysator kriege ich immer andere werte aus. das ist mein Funktion:
1 | |
2 | void I2C_WRITE(void) |
3 | {
|
4 | u16 i=0 |
5 | I2C_Start(); |
6 | PIR1bits.SPPIF=1; // set Flag |
7 | SSPADD=0x48; |
8 | SSPBUF=SSPADD; |
9 | i=i+6; |
10 | SSPCON2bits.ACKSTAT=0; |
11 | PIR1bits.SPPIF=1; // set Flag |
12 | SSPADD=0x68; |
13 | SSPBUF=SSPADD; |
14 | i=i+6; |
15 | SSPCON2bits.ACKSTAT=1; |
16 | PIR1bits.SPPIF=1; // set Flag |
17 | I2C_Stop(); |
18 | }
|
und ich kriege solche wetre aus : R:3Fh, R:1Fh, S=start, p=stop, GC=generall Call, FFh. konnte jemand mir helfen
Schreib doch erst mal GENAU was du machen willst. Ich vermute mal du willst an Adresse 0x48 den Wert 0x68 senden? Angeblich soll das Register SSPADD für die Bus Geschwindigkeit zuständig sein, warum stellt du dann 2x daran rum?
ok ich will zwei werte senden und das war nur ein beispiel. und eigenlich ist dieses Programm für master und durch mein logicport quand ich sehen was für ein daten von SDA raus kommen. und wenn ich nicht durch SSPADD die Daten eingeben funktionniert mein logic port analysator nicht deshalb bin ich verzweifelt. was schlagen sie vor? Grüss
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.