Есть ли простая библиотека для общения с I2C для C ++? Я нашел кое-что для Python и Java, но я хотел C ++. Я надеялся, что кто-то перенес библиотеку Arduino Wire, чтобы я мог использовать код, который я уже написал для Arduino.
Не согласен ... Я действительно спрашиваю, была ли библиотека проводов Arduino перенесена на Pi, чтобы я мог легко использовать код, написанный для Arduino на Pi. Похоже, что это не так, поэтому любая эквивалентная, простая в использовании библиотека была бы хороша. Однако, это также, кажется, не существует, поэтому я остаюсь с использованием кода i2c-dev.
Кевин
Ответы:
7
В пользовательском пространстве Linux есть заголовок i2c-dev. Я не могу вспомнить, поставляется ли этот заголовок с пакетом lm-sensor, или его нужно будет установить из исходного кода. Я бы проверил хранилище пакетов вашего дистрибутива. У xGoat есть хорошая статья, посвященная подготовке и использованию.
Хороший пример - исходный код i2c-tools ( скачать ) C. Я видел несколько простых C++библиотек, обертывающих эти функции. Я бы порекомендовал создать собственную библиотеку в соответствии с вашими потребностями. Другие отличные примеры можно найти на Github, например, эта библиотека I2CBus
Я только начал использовать библиотеку pigpio, и я очень впечатлен. Мне особенно нравится режим битового взрыва, поскольку он позволяет использовать любые два вывода GPIO в качестве интерфейса I2C, если они имеют подтягивающие резисторы. Если вы используете PI2, побитовые биты не сильно уступают, так как у вас 4 процессора. Хорошая вещь о командах bit bang состоит в том, что они берут список командных байтов «address, write, data, read, start, stop», так что вы можете выполнить несколько операций ввода-вывода за один вызов. Это единственное, что я обнаружил, что он надежно выполняет повторные стартовые транзакции, которые требуются многим устройствам, которые принимают номер регистра в начале команды чтения. Библиотека хорошо документирована и проста в использовании.
Ниже приведена тестовая программа, которая считывает регистры температуры на 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 есть заголовок i2c-dev ( #include <linux/i2c-dev.h>). Кроме того, вам нужно устройство для чтения символов. Это можно сделать, загрузив правильные модули.
i2c_bcm2708для драйвера низкого уровня и i2c-devдля генерации символов для шин. Подать заявление ...
Я предпочитаю этот метод, потому что он платформенный. Вы можете использовать и linux/i2c-dev.hс другими устройствами, если существует драйвер I²C. WiringPi связан с RPI.
С уважением
ОБНОВИТЬ:
Эта информация устарела. Проверьте этот пост на использование деревьев устройств.
Есть WiringPi, который, я думаю, делает именно то, что вы хотите. Есть также оболочки для Pascal, Java, Python, Perl, TCL и Ruby. Кроме того, кто-то может захотеть изучить похожие ссылки:
Нет ... посмотри еще раз, он не делает i2c, только основные функции контактов. Проект несколько обманчиво назван. Ваша первая ссылка имеет хороший код на c, но не простую оболочку для i2c, как с Arduino. Мне, вероятно, придется написать это самому.
Ответы:
В пользовательском пространстве Linux есть заголовок i2c-dev. Я не могу вспомнить, поставляется ли этот заголовок с пакетом lm-sensor, или его нужно будет установить из исходного кода. Я бы проверил хранилище пакетов вашего дистрибутива. У xGoat есть хорошая статья, посвященная подготовке и использованию.
Хороший пример - исходный код i2c-tools ( скачать )
C
. Я видел несколько простыхC++
библиотек, обертывающих эти функции. Я бы порекомендовал создать собственную библиотеку в соответствии с вашими потребностями. Другие отличные примеры можно найти на Github, например, эта библиотека I2CBusисточник
Я только начал использовать библиотеку pigpio, и я очень впечатлен. Мне особенно нравится режим битового взрыва, поскольку он позволяет использовать любые два вывода GPIO в качестве интерфейса I2C, если они имеют подтягивающие резисторы. Если вы используете PI2, побитовые биты не сильно уступают, так как у вас 4 процессора. Хорошая вещь о командах bit bang состоит в том, что они берут список командных байтов «address, write, data, read, start, stop», так что вы можете выполнить несколько операций ввода-вывода за один вызов. Это единственное, что я обнаружил, что он надежно выполняет повторные стартовые транзакции, которые требуются многим устройствам, которые принимают номер регистра в начале команды чтения. Библиотека хорошо документирована и проста в использовании.
Ниже приведена тестовая программа, которая считывает регистры температуры на MAX31785. 4 устанавливает адрес со следующим байтом, 2 = начало, 7 = запись, за которой следуют счетчик байтов и байтов данных, 3 = стоп, 6 = чтение, за которым следует счетчик байтов. Вызов возвращает любые прочитанные байты данных вместе с количеством байтов.
источник
Как упомянул emcconville, в пользовательском пространстве Linux есть заголовок i2c-dev (
#include <linux/i2c-dev.h>
). Кроме того, вам нужно устройство для чтения символов. Это можно сделать, загрузив правильные модули.i2c_bcm2708
для драйвера низкого уровня иi2c-dev
для генерации символов для шин. Подать заявление ...для загрузки их на лету. Подать заявление ...
и 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. Кроме того, кто-то может захотеть изучить похожие ссылки:
источник