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


von Verwirrter Bastler (Gast)


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
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
Noch kein Account? Hier anmelden.