Hallo zusammen,
ich arbeite derzeit an der Entwicklung eines Treibers für ein
LCD-Display mit einem AiP31068L Controller. Dieses Display ist über I²C
mit einem ESP32 verbunden. Mein Ziel ist es, das Busy-Flag und den
Address Counter auszulesen. Laut Dokumentation erfordert das Protokoll
folgende Schritte:
Protokoll für Busy-Flag-Auslese:
1. Start Condition (S): Der Master startet die Kommunikation.
2. Slave-Adresse senden (R/W=1): Die 7-Bit-Adresse des Slaves wird
gesendet, gefolgt von einem Lese-Bit (R/W=1).
3. Leeres Byte (Control Byte) senden (0x00): Der Master sendet ein
einzelnes Byte mit dem Wert 0x00.
4. Lehres Byte (Data Byte) senden (0x00). Da bin ich mir nicht ganz
sicher.
5. Stop Condition (P): Der Master beendet die Kommunikation.
6. Data Byte Lesen aber wie???
Auf der Seite 11 wird das Protokoll beschrieben, aber leider nur ein
Schreibvorgang.
Ich besitzte auch einen Logic Analyzer, somit kann ich das Signal
beobachten.
Daher meine Frage: Wie muss das Protokoll aufgebaut werden, damit ein
Lesevorgang durchgeführt werden kann?
Das oben beschrieben Protokoll kann soweit ich es jetzt herausgefunden
habe nicht mit der arduino wire lib umgesetzt werden.
Siehe:
https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2c.html#i2c-write
1 | Ablauf 1:
|
2 | Wire.begin(); <-- Init Hardware
|
3 | Wire.beginTransmission(I2C_DEV_ADDR); <-- Buffer index reset, txadresse wird gesetzt
|
4 | Wire.write(x); <-- tx buffer füllen
|
5 | Wire.endTransmission(); <-- startet den i2c stream
|
Bei Ablauf 1 wird die Adresse um ein bit nach links verschoben und das
LSB (R/W) bit wird immer auf 0 gesetzt.
1 | Ablauf 2:
|
2 | Wire.requestFrom(I2C_DEV_ADDR, SIZE); <-- sendet i2c adresse mit (R/W=1) bit.
|
3 | Wire.readBytes(temp, error);
|
Kann ich mit der arduino wire lib dieses Protokoll für eine Lesevorgang
überhaut aufbauen?
Anbei mein Code und die I2c Daten als Bild:
1 | #define _PIN_DEBUG_CH4 4 ///< GPIO pin for debug with logic analyzer
|
2 | #define _PIN_DEBUG_CH5 5 ///< GPIO pin for debug with logic analyzer
|
3 | #define _PIN_DEBUG_CH6 6 ///< GPIO pin for debug with logic analyzer
|
4 | #define _PIN_DEBUG_CH7 7 ///< GPIO pin for debug with logic analyzer
|
5 |
|
6 |
|
7 | #include <Wire.h>
|
8 |
|
9 | #define _LCD_ADDRESS 0x7C >> 1 // 7-Bit-Adresse des AiP31068L
|
10 |
|
11 | class AIP31068L {
|
12 | private:
|
13 | uint8_t lcdAddress; // Interne Variable zur Speicherung der Adresse
|
14 |
|
15 | public:
|
16 | AIP31068L(uint8_t address) {
|
17 | lcdAddress = address;
|
18 | }
|
19 |
|
20 | void write() {
|
21 | uint8_t controlByte;
|
22 | uint8_t dataByte;
|
23 | uint8_t error;
|
24 | controlByte = 0x00;
|
25 | dataByte = 0x00;
|
26 |
|
27 | Wire.beginTransmission(lcdAddress);
|
28 | Wire.write(controlByte);
|
29 | Wire.write(dataByte);
|
30 | error = Wire.endTransmission(true);
|
31 |
|
32 | if (error != 0) {
|
33 | Serial.println("Fehler: Übertragung fehlgeschlagen");
|
34 | }
|
35 | }
|
36 |
|
37 | void read() {
|
38 | Wire.requestFrom(lcdAddress, 2, true);
|
39 | }
|
40 | };
|
41 |
|
42 | AIP31068L lcd(_LCD_ADDRESS);
|
43 |
|
44 | void setup() {
|
45 | Serial.begin(115200);
|
46 |
|
47 | pinMode(_PIN_DEBUG_CH4, OUTPUT);
|
48 | pinMode(_PIN_DEBUG_CH5, OUTPUT);
|
49 | pinMode(_PIN_DEBUG_CH6, OUTPUT);
|
50 | pinMode(_PIN_DEBUG_CH7, OUTPUT);
|
51 |
|
52 | digitalWrite(_PIN_DEBUG_CH4, LOW);
|
53 | digitalWrite(_PIN_DEBUG_CH5, LOW);
|
54 | digitalWrite(_PIN_DEBUG_CH6, LOW);
|
55 | digitalWrite(_PIN_DEBUG_CH7, LOW);
|
56 |
|
57 |
|
58 | digitalWrite(_PIN_DEBUG_CH4, HIGH);
|
59 | Wire.begin();
|
60 | digitalWrite(_PIN_DEBUG_CH4, LOW);
|
61 |
|
62 | digitalWrite(_PIN_DEBUG_CH5, HIGH);
|
63 | lcd.write();
|
64 | digitalWrite(_PIN_DEBUG_CH5, LOW);
|
65 |
|
66 | digitalWrite(_PIN_DEBUG_CH6, HIGH);
|
67 | lcd.read();
|
68 | digitalWrite(_PIN_DEBUG_CH6, LOW);
|
69 | }
|
70 |
|
71 | void loop() {
|
72 | }
|