Seite 16, Figure 15 & 16. Es muß immer zuerst geschrieben werden.
(2) Read data is from the last register pointer location. If a new register is desired, the register
pointer must be updated. See Figure 19
Und nochmal genauer:
If repeated reads from the same register are desired, it is not necessary to continually send the register pointer bytes; the INA219 retains the register pointer value until it is changed by the next write operation.
Beim Schreiben (SLA+W) ist das erste gesendete Byte (nach SLA+W) immer der (neue) Pointer; ein eventuell folgendes Word wird in das damit referenzierte Register geschrieben.
Beim Lesen hingegen wird sofort nach dem SLA+R gelesen, und zwar das Register, wo der Pointer grad hinzeigt. Soll ein anderes Register gelesen werden, muß vorher der Pointer umgeschrieben werden, sonst kannst Du aber das Register beliebig oft lesen (ohne den jedesmal Pointer neu zu schreiben).
Der Pointer besitzt wie gesagt kein Autoinkrement/-dekrement.
Streng nach dem Datenblatt muß also der Pointer vor dem ersten Lesen beschrieben werden - aber irgendwohin sollte der Pointer ja nach dem Powerup zeigen. Möglicherweise auf irgendwas zufälliges, möglicherweise 0x00. Mich würde übrigens nicht wundern, wenn da sogar nur die minderwertigsten drei Bit relevant sind.
Welchen Bezug das jetzt zu Figure 19 hat ist mit nicht klar
Ich denke, daß damit
Figure 18. Typical Register Pointer Set
gemeint ist...
Die Register 1 bis 4 können nur gelesen werden, also muß man wohl nach schreiben der Adresse und des Registerpointers einen Repeated-Start ausführen um dann das jeweilige Register zu lesen.
Jedes Register kannst Du lesen, indem Du erst den Pointer auf die Adresse setzt (Start, SLA+W, Adresse, Stop) und danach das Register liest (Start, SLA+R, Readbyte, Readbyte, Stop).
Zum repeatet Start gibt es keine Figure, aber auf Seite 14/15 findet sich:
When reading from the INA219, the last value stored in the register pointer by a write operation determines which register is read during a read operation. To change the register pointer for a read operation, a new value must be written to the register pointer. This write is accomplished by issuing a slave address byte with the R/W bit LOW, followed by the register pointer byte. No additional data are required. The master then generates a START condition and sends the slave address byte with the R/W bit HIGH to initiate the read command. The next byte is transmitted by the slave and is the most significant byte of the register indicated by the register pointer. This byte is followed by an Acknowledge from the master; then the slave transmits the least significant byte.
Den Start nach dem Pointer schreiben könnte man auch als repeated start verstehen - Stops werden ja leider nicht weiter erwähnt. Möglicherweise muß aber vor dem Start wirklich'n Stop kommen, also zwei Telegramme...
Benutze die Dateien von Peter die sich seht bewährt haben
Leider funktioniert das setzen der Register nicht und es kommen keine Werte zurück.
Zu den 4µs: achim hat nicht geschrieben wie schnell er unterwegs ist. Die Länge der Pause soll mindestens 4µs betragen. Wenn die bereits durch das Protokoll gesichert sind, klar. Aber grundsätzlich stört 'ne längere Pause nicht, und achim will erstmal überhaupt was lesen...
(wobei das eh nur die Übernahme der gesendeten Werte in die beschreibbaren Register betrifft.)
Wenn das Konfigurationsregister erfolgreich ausgelesen werden konnte, würde ich als nächstes das Kalibrationsregister lesen (0x00 wäre zu erwarten), anschließend mit irgend'nem anderen Wert beschreiben, und diesen dann zurücklesen lassen...