Frage

Ich versuche, eine eingebettete QT-Anwendung zu schreiben, die das spezifische i2c-RTC-Gerät liest.Hier ist mein Code zum Initiieren von i2c:

int addr = 0x68;        // The I2C address of the RTC

sprintf(filename,I2C_FILE_NAME);
if ((file = open(filename,O_RDWR)) < 0)
{
    qDebug()<<"Failed to open the bus.";
    return;
}

if (ioctl(file,I2C_SLAVE_FORCE,addr) < 0)
{
    qDebug()<<"Failed to acquire bus access and/or talk to slave.\n";
    return;
}

So lesen Sie vom Gerät:

unsigned char addr = 0x68;
unsigned char reg = 0x00;
unsigned char inbuf[2], outbuf;

struct i2c_rdwr_ioctl_data packets;
struct i2c_msg messages[2];

/*
* In order to read a register, we first do a "dummy write" by writing
* 0 bytes to the register we want to read from.  This is similar to
* the packet in set_i2c_register, except it's 1 byte rather than 2.
*/
outbuf = reg;
messages[0].addr  = addr;
messages[0].flags = 0;
messages[0].len   = sizeof(outbuf);
messages[0].buf   = &outbuf;
/* The data will get returned in this structure */
messages[1].addr  = addr;
messages[1].flags = I2C_M_RD/* | I2C_M_NOSTART*/;
messages[1].len   = 2;
messages[1].buf   = inbuf;
/* Send the request to the kernel and get the result back */
packets.msgs      = messages;
packets.nmsgs     = 2;
if(ioctl(file, I2C_RDWR, &packets) < 0)
{
    qDebug()<<"Unable to send data";
    return;
}
qDebug() << inbuf[0];

Was ich versuche, ist einfach das Register des RTC-Geräts zu lesen, das die „Sekunden“ enthält.Was ich bekomme, sind einige Zahlen, aber diese Zahlen sehen zunächst gut aus, aber es gibt einige seltsame Erhöhungen.Wie, 55,56,56,57 dann springt es zu 64?dann geht es bergauf 89 Dann 0?Ich weiß nicht, warum das passiert oder was mit meinem Code nicht stimmt?

War es hilfreich?

Lösung

Das Problem besteht darin, dass das Register keine einfache Zählung der Sekunden enthält.Die oberen Bits enthalten Zehnersekunden und die unteren Bits enthalten Einheitssekunden.

Sie können damit Dutzende von Sekunden erhalten (inbuf[0] >> 4) & 0x7; und Einheitssekunden mit inbuf[0] & 0xf.

Anstatt zu versuchen, Sekunden mit zu drucken qDebug() << inbuf[0];, verwenden Sie etwas wie:

qDebug() << (10 * ((inbuf[0] >> 4) & 0x7) + (inbuf[0] & 0xf));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top