C ++ 용 I2C와 대화 할 수있는 간단한 라이브러리가 있습니까? 파이썬과 Java에 대한 몇 가지 물건을 찾았지만 C ++을 원했습니다. 누군가가 Arduino Wire 라이브러리를 이식하여 이미 Arduino 용으로 작성한 코드를 사용할 수 있기를 바랍니다.
C ++ 용 I2C와 대화 할 수있는 간단한 라이브러리가 있습니까? 파이썬과 Java에 대한 몇 가지 물건을 찾았지만 C ++을 원했습니다. 누군가가 Arduino Wire 라이브러리를 이식하여 이미 Arduino 용으로 작성한 코드를 사용할 수 있기를 바랍니다.
답변:
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에서 찾을 수 있습니다.
나는 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();
}
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.h
I²C 드라이버가있는 한 다른 장치에서도 사용할 수 있습니다 . WiringPi는 rPi에 바인딩됩니다.
문안 인사
이 정보는 더 이상 사용되지 않습니다. 장치 트리 사용에 대해서는 이 게시물 을 확인하십시오 .
내가 원하는 것을 정확하게 하는 WiringPi 가 있습니다. Pascal, Java, Python, Perl, TCL 및 Ruby 용 래퍼도 있습니다. 또한 누군가 비슷한 링크를 탐색 할 수 있습니다.