是否有I2C库


12

是否有一个简单的库可以与C2的I2C对话?我已经找到了一些用于python和Java的东西,但是我想要C ++。我希望有人可以移植Arduino Wire库,以便可以使用已经为Arduino编写的代码。



1
不同意...我真的是在问Arduino接线库是否已移植到Pi,因此我可以在Pi上轻松使用为Arduino编写的代码。似乎并非如此,因此任何等效的,易于使用的库都是不错的选择。但是,这似乎也不存在,因此我只能使用i2c-dev代码。
凯文

Answers:


7

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


5

我刚开始使用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();
}

crj11,感谢您发布代码示例。这是我能够找到并让我走上正确道路的最好例子。我唯一遇到的问题是使用pigpiod_if.h库要求代码以sudo身份运行,这对于我的项目是不可接受的。我能够切换到pigpiod_if2.h库并进行了一些调整,它运行起来像冠军。
理查德·泰尔

2

如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。

问候

更新:

此信息已弃用。检查此帖子以了解设备树的使用。


0

我认为有一个WiringPi确实可以满足您的需求。还有Pascal,Java,Python,Perl,TCL和Ruby的包装器。此外,有人可能想探索类似的链接:

  1. http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/
  2. http://binerry.de/post/26685647322/raspberry-pi-and-i2c
  3. http://www.lazarus.freepascal.org/index.php?topic=17404.0

不...再看一下,它不执行i2c,而只是基本的引脚功能。该项目的名称有些误导。您的第一个链接包含一些不错的C代码,但没有像Arduino一样执行i2c的简单包装。我可能要自己写。
凯文2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.