Hallo Zusammen,
zur Zeit experimentiere ich etwas mit I2C und bin dabei bei auf ein
kleine Problem gestoßen. Ich benutze eine LPC1768 als Master und steuere
damit einen PCF8574 an. Das funktioniert auch soweit, 4 IOs sind mit
LEDs verbunden und 4 mit einem Dip-Schalten, also 4 Ein- und 4 Ausgänge.
Die vier LEDs lassen sicher Problemlos ein und ausschalten und auch den
Dip-Schalter kann ich auslesen, allerdings erst nach wiederholter
Abfrage?!
Bei der Abfrage lese ich 4 Zyklen lange aus, wobei aber nur im letzten
Zyklus die richtigen Werte ankommen, davor kommt nur 0x00 an.
Das irritiert mich etwas, eigentlich sollten die Werte ja schon beim
ersten Mal richtig sein... hier mal der Code:
1 | /* Clear Buffer before Write Data */
|
2 | for ( j = 0; j < BUFSIZE; j++ )
|
3 | {
|
4 | I2CMasterBuffer[j] = 0;
|
5 | }
|
6 |
|
7 |
|
8 | I2CWriteLength = 2; // 2 Byte I2C schreiben
|
9 | I2CReadLength = 0; // 0 Byte lesen
|
10 |
|
11 | I2CMasterBuffer[0] = PCF8574A_ADDR | 0x0E; // 1. Byte = PCF8574A + Adresse (schreiben)
|
12 | I2CMasterBuffer[1] = 0xFF; // 2. Byte schreiben
|
13 |
|
14 |
|
15 | I2CEngine();
|
16 | delay_ms(5);
|
17 |
|
18 |
|
19 |
|
20 | while(1){
|
21 | int i;
|
22 |
|
23 | /* Clear Buffer before Read Datac */
|
24 | for ( i = 0; i < BUFSIZE; i++ ) // Clear Buffer
|
25 | {
|
26 | I2CMasterBuffer[i] = 0;
|
27 |
|
28 | I2CWriteLength = 1; // 1 Byte I2C schreiben Transfer
|
29 | I2CReadLength = 4; // 4 Byte lesen
|
30 |
|
31 | I2CMasterBuffer[0] = PCF8574A_ADDR | 0x0E | RD_BIT; // 1. Byte = PCF8574A + Adresse (lesen)
|
32 |
|
33 |
|
34 | I2CEngine();
|
35 |
|
36 | // LPC_GPIO2->FIOPIN = I2CMasterBuffer[1];
|
37 | // LPC_GPIO2->FIOPIN = I2CMasterBuffer[2];
|
38 | // LPC_GPIO2->FIOPIN = I2CMasterBuffer[3];
|
39 | LPC_GPIO2->FIOPIN = I2CMasterBuffer[4];
|
Ich geben die empfangen Daten dann über 8 LEDs aus, die direkt vom µC
angesteuert werden.
Ich hoffe ich habe die wichtigsten Sachen angegeben.
Vielleicht hatte ja schon mal wer ein ähnliches Problem?
Viele Grüße