I2C 라이브러리가 있습니까


12

C ++ 용 I2C와 대화 할 수있는 간단한 라이브러리가 있습니까? 파이썬과 Java에 대한 몇 가지 물건을 찾았지만 C ++을 원했습니다. 누군가가 Arduino Wire 라이브러리를 이식하여 이미 Arduino 용으로 작성한 코드를 사용할 수 있기를 바랍니다.



1
동의하지 않습니다 ... Arduino 와이어 링 라이브러리가 Pi로 포팅되었는지 물어보고 Arpiino 용으로 작성된 코드를 Pi에서 쉽게 사용할 수 있습니다. 그것은 사실이 아닌 것 같으므로 사용하기 쉽고 동등한 라이브러리가 좋을 것입니다. 그러나 그것은 또한 존재하지 않는 것 같습니다. 그래서 나는 i2c-dev 코드를 사용합니다.
kevin

답변:


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++이 함수를 래핑 하는 몇 가지 간단한 라이브러리를 보았습니다 . 필요에 맞게 자신 만의 라이브러리를 작성하는 것이 좋습니다. 이 훌륭한 I2CBus 라이브러리 와 같은 다른 훌륭한 예제를 Github에서 찾을 수 있습니다.


5

나는 pigpio 라이브러리를 사용하기 시작했고 매우 감동했습니다. 특히 풀뱅 저항이있는 한 두 GPIO 핀을 I2C 인터페이스로 사용할 수 있으므로 비트 뱅 모드가 특히 좋습니다. PI2를 사용하는 경우 4 개의 CPU가 있기 때문에 비트 뱅킹 (bit banging)에 많은 단점이 없습니다. 비트 뱅 명령의 좋은 점은 "주소, 쓰기, 데이터, 읽기, 시작, 중지"명령 바이트 목록을 가져 와서 한 번의 호출로 여러 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 라이브러리로 전환하여 몇 가지 조정 작업을 수행하여 챔피언처럼 실행되었습니다.
Richard Teel

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²C del maestro 자체 를 사용하는 방법에 대한 힌트를 확인할 수 있습니다 .

이 방법은 플랫폼에 구애받지 않기 때문에 선호합니다. linux/i2c-dev.hI²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를 수행하는 간단한 래퍼는 아닙니다. 아마 직접 작성해야 할 것입니다.
kevin

3
WiringPi I2C 라이브러리 : wireingpi.com/reference/i2c-library
avra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.