【发布时间】:2014-01-10 15:23:53
【问题描述】:
我正在尝试编写一个嵌入式 qt 应用程序来读取特定的 i2c rtc 设备。这是我初始化 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?我不知道为什么会发生这种情况或我的代码有什么问题?
【问题讨论】:
-
哇,在非 qt 代码中使用 qDebug() 而不是 printf() 进行打印......这真是一个奇怪的想法。 :-)
-
这是哪个 i2c 设备?
-
它是一个 RTC,ds1337。这是数据表datasheets.maximintegrated.com/en/ds/DS1337-DS1337C.pdf
标签: qt embedded embedded-linux ioctl i2c