Чи є проста бібліотека для спілкування з I2C для C ++? Я знайшов деякі речі для python та Java, але хотів C ++. Я сподівався, що хтось переніс бібліотеку Arduino Wire, щоб я міг використовувати код, який я вже написав для Arduino.
Чи є проста бібліотека для спілкування з I2C для C ++? Я знайшов деякі речі для python та Java, але хотів C ++. Я сподівався, що хтось переніс бібліотеку Arduino Wire, щоб я міг використовувати код, який я вже написав для Arduino.
Відповіді:
У просторі користувача Linux є заголовок i2c-dev. Я не можу пригадати, чи цей заголовок поставляється з пакетом lm-датчиків, чи його потрібно буде встановити з джерела. Я перевірив сховище пакунків вашого дистрибутива. 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-інструментів ( завантаження ) є хорошими прикладами в C
. Я бачив кілька простих C++
бібліотек, які виконують ці функції. Я рекомендую створити власну бібліотеку відповідно до ваших потреб. Інші чудові приклади можна знайти на Github, як ця бібліотека I2CBus
Я щойно почав користуватися бібліотекою pigpio, і я дуже вражений. Особливо мені подобається режим біт-баг, оскільки він дозволяє використовувати будь-які два штифти GPIO як інтерфейс I2C, якщо у них є резистори. Якщо ви використовуєте PI2, то біт стукань не має великого мінусу, оскільки у вас є 4 процесора. Приємна річ у командах біт-баг полягає в тому, що вони беруть список байтів команд "адреса, запис, дані, читання, запуск, зупинка", щоб ви могли запускати декілька вводу-виводу з одного виклику. Єдине, що я виявив, що надійно виконує операції з повторним запуском, які вимагаються багатьма пристроями, які приймають номер реєстру на початку команди read. Бібліотека добре документована та проста у користуванні.
Нижче наводиться тестова програма, яка зчитує регістри температури на 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. ПроводкаPi прив’язана до rPi.
З повагою
Ця інформація застаріла. Перевірте цю публікацію щодо використання дерев пристроїв.
Є WiringPi, який, я думаю, робить саме те, що ви хочете. Також є обгортки для Pascal, Java, Python, Perl, TCL та Ruby. Крім того, хтось може захотіти вивчити подібні посилання: