无法正常读取i2c设备

时间:2014-01-10 15:23:54

标签: qt embedded embedded-linux ioctl i2c

我正在尝试编写一个读取特定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?我不知道为什么会发生这种情况或我的代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

问题是寄存器不能保持秒数的简单计数。高位保持数十秒,低位保持单位秒。

使用(inbuf[0] >> 4) & 0x7;获得数十秒,使用inbuf[0] & 0xf获得单位秒数。

不要尝试使用qDebug() << inbuf[0];打印秒数,而是使用以下内容:

qDebug() << (10 * ((inbuf[0] >> 4) & 0x7) + (inbuf[0] & 0xf));