我正在尝试编写一个读取特定i2c rtc设备的嵌入式qt应用程序。这是我的init 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;
}
从设备读取:
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];
我要做的只是读取rtc设备的寄存器,其中包含“秒”。我得到的是一些数字,但这些数字一开始看起来不错,但有一些奇怪的增量。比如,55,56,56,57
然后它跳转到64
?然后它会升至89
然后0
?我不知道为什么会发生这种情况或我的代码出了什么问题?
答案 0 :(得分:2)
问题是寄存器不能保持秒数的简单计数。高位保持数十秒,低位保持单位秒。
使用(inbuf[0] >> 4) & 0x7;
获得数十秒,使用inbuf[0] & 0xf
获得单位秒数。
不要尝试使用qDebug() << inbuf[0];
打印秒数,而是使用以下内容:
qDebug() << (10 * ((inbuf[0] >> 4) & 0x7) + (inbuf[0] & 0xf));