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...