Forum: Mikrocontroller und Digitale Elektronik I2C-ADC: Meßwert mit zwei statt einem Byte abholen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Verwirrter Bastler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich verwende für meinen Raspi eine I2C-Bibliothek mit der Include-Datei
1
#include <linux/i2c-dev.h>
dort findet sich:
1
/*
2
 * I2C Message - used for pure i2c transaction, also from /dev interface
3
 */
4
struct i2c_msg {
5
  __u16 addr;  /* slave address      */
6
  unsigned short flags;
7
#define I2C_M_TEN  0x10  /* we have a ten bit chip address  */
8
#define I2C_M_RD  0x01
9
#define I2C_M_NOSTART  0x4000
10
#define I2C_M_REV_DIR_ADDR  0x2000
11
#define I2C_M_IGNORE_NAK  0x1000
12
#define I2C_M_NO_RD_ACK    0x0800
13
  short len;    /* msg length        */
14
  char *buf;    /* pointer to msg data      */
15
};

Da dies Teil einer Bibliothek ist möchte ich hier nichts ändern.



Die Funktion zum Abholen von einem Byte funktioniert.
1
/********************************************************************
2
 *This function reads a byte of data "data" from a specific register
3
 *"reg_addr" in the I2C device. This involves sending the register address
4
 *byte "reg_Addr" with "write" asserted and then instructing the
5
 *I2C device to read a byte of data from that address ("read asserted").
6
 *This necessitates the use of two i2c_msg structs. One for the register
7
 *address write and another for the read from the I2C device i.e.
8
 *I2C_M_RD flag is set. The read data is then saved into the reference
9
 *variable "data".
10
 ********************************************************************/
11
int i2c8Bit::readReg(unsigned char reg_addr, char &data){
12
    char *inbuff;
13
    char outbuff;
14
    //int outbuff_1;
15
    int retVal = -1;
16
    struct i2c_rdwr_ioctl_data packets;
17
    struct i2c_msg messages[2];
18
19
    outbuff = reg_addr;
20
    messages[0].addr = deviceAddress;
21
    messages[0].flags= 0;
22
    messages[0].len = sizeof(outbuff);
23
    messages[0].buf = &outbuff;
24
25
    inbuff = &data;
26
    messages[1].addr = deviceAddress;
27
    messages[1].flags = I2C_M_RD;
28
    messages[1].len = sizeof(*inbuff);
29
    messages[1].buf = inbuff;
30
31
    packets.msgs = messages;
32
    packets.nmsgs = 2;
33
34
    retVal = ioctl(this->i2cDescriptor, I2C_RDWR, &packets);
35
    if(retVal < 0)
36
        perror("Read from I2C Device failed");
37
38
    return retVal;
39
}

Aufruf in main ähnlich wie hier:
1
    char pinStatus = 0;
2
    mcp23017.readReg(0x12,pinStatus); //read the GPIOA register
3
4
    // pinStatus kommt gefüllt zurück
5
    if( (pinStatus & 0b10000000) == 0){
6
        // mach irgendwas...
7
    }


Wenn ich das richtig sehe, dann wird per Referenz (char &data) eine 
char-Adresse übergeben und diese von
1
class i2c8Bit
2
{
3
    public:
4
        ...
5
        ...
6
        int readReg(unsigned char reg_addr, char &data); // function to read byte data from a register of an I2C device
7
}
mit einem Wert gefüllt. Gleichzeitig wirkt dieses char als 
Anfangsadresse eines Puffers (Wirklich?).

Wie bekomme ich es hin, daß ich das darauffolgene Byte einlesen kann? 
Ich habe schon alles mögliche versucht, jedoch ist das ganze so 
verschachtelt, daß ich Konvertierungsfehler bekomme wie etwa "cannot 
convert char * to int16_t" oder ähnl.

Sinn des Ganzen ist die Aufgabenstellung sauber zu lösen. Ich könnte das 
vielleicht irgendwie hinpfuschen, aber dann geht der Lerneffekt 
flöten...

: Verschoben durch Moderator

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.