Answers:
Linux用户空间中有一个i2c-dev标头。我不记得该标头是否随lm-sensors软件包一起提供,或者是否需要从源代码安装。我会检查您的发行版的软件包存储库。xGoat有一篇不错的文章,介绍了制备和用法。
#include <linux/i2c-dev.h>
/*
Including i2c-dev header will allow the following I2C SMBus functions
- i2c_smbus_access
- i2c_smbus_write_quick
- i2c_smbus_read_byte
- i2c_smbus_write_byte
- i2c_smbus_read_byte_data
- i2c_smbus_write_byte_data
- i2c_smbus_read_word_data
- i2c_smbus_write_word_data
- i2c_smbus_process_call
- i2c_smbus_read_block_data
- i2c_smbus_write_block_data
- i2c_smbus_read_i2c_block_data
- i2c_smbus_write_i2c_block_data
- i2c_smbus_block_process_call
*/
i2c-tools的源代码(下载)是中的好示例C
。我已经看到了一些C++
包装这些函数的简单库。我建议创建自己的库以满足您的需求。可以在Github上找到其他出色的示例,例如I2CBus库
我刚开始使用Pigpio库,对此印象深刻。我特别喜欢bit bang模式,因为它允许您使用任意两个GPIO引脚作为I2C接口,只要它们具有上拉电阻即可。如果您使用的是PI2,则由于您有4个CPU,所以位冲击没有太大的缺点。关于bit bang命令的好处是,它们采用“地址,写入,数据,读取,启动,停止”命令字节的列表,以便您可以通过一次调用运行多个I / O。我发现的唯一一件事是可靠地运行重复的启动事务,这是许多在读取命令开始时使用寄存器号的设备所必需的。该库文件齐全,易于使用。
下面是测试程序,该程序读取MAX31785上的温度寄存器。4用下一个字节设置地址,2 =起始,7 =写,后跟字节计数和数据字节,3 =停止,6 =读,后跟字节计数。该调用将返回读取的所有数据字节以及字节数。
#include <stdio.h>
#include <stdlib.h>
#include <pigpio.h>
#define MAX31785_TEMP_REG 0x8D
#define MAX31785_TEMP0 6
#define MAX31785_TEMP_INT 12
#define PAGE_REG_OFFSET 6 // Offset in CmdBuf of the page register write value
main( int argc, char *argv[])
{
int rcnt;
char ReadBuf[256];
char CmdBuf[] = {4, 0x52, // Chip address
2, 7, 2, 0x00, MAX31785_TEMP0, 3, // Write page register to select temperature sensor
2, 7, 1, MAX31785_TEMP_REG, 2, 6, 2, 3, // Read temperature register
0 // EOL
};
if (gpioInitialise() < 0) return 1;
// Open bit banging I2C on standard I2C pins
if (bbI2COpen(2, 3, 100000)) return 1;
while(1)
{
// Loop over the 7 temp sensors
for(CmdBuf[PAGE_REG_OFFSET] = MAX31785_TEMP0; CmdBuf[PAGE_REG_OFFSET] <= MAX31785_TEMP_INT; CmdBuf[PAGE_REG_OFFSET]++)
{
// Read the temp reg for the current page
rcnt = bbI2CZip(2, CmdBuf, sizeof(CmdBuf), ReadBuf, sizeof(ReadBuf));
if(rcnt == 2)
// Print out degrees C
printf("%2.1f ", (short)(((ReadBuf[1] << 8) | ReadBuf[0]) + 50)/100.0 );
else
printf("Error: %d\n", rcnt);
}
printf("\n");
fflush(stdout);
sleep(1);
}
bbI2CClose(2);
gpioTerminate();
}
如emcconville所述,Linux用户空间(#include <linux/i2c-dev.h>
)中有一个i2c-dev标头。此外,您需要读取字符设备。这可以通过加载正确的模块来完成。
i2c_bcm2708
用于低级驱动程序并i2c-dev
用于生成总线的字符决策。申请...
sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000
快速加载它们。申请...
sudo sh -c 'echo "i2c-dev" >> /etc/modules'
sudo sh -c 'echo "options i2c_bcm2708 baudrate=<your preferred baudrate>\n" > /etc/modprobe.d/custom.conf
和unblacklist i2c_bcm2708
在/etc/modprobe.d/raspi-blacklist.conf
做/dev/i2c-0
和/dev/i2c-1
永久显示出来。
从现在开始,您可以遵循有关如何亲自使用I²Cdel maestro 的提示。
我更喜欢这种方法,因为它与平台无关。linux/i2c-dev.h
只要存在I²C驱动程序,您就可以与其他设备一起使用。WiringPi绑定到rPi。
问候
此信息已弃用。检查此帖子以了解设备树的使用。