Есть ли простая библиотека для общения с I2C для C ++? Я нашел кое-что для Python и Java, но я хотел C ++. Я надеялся, что кто-то перенес библиотеку Arduino Wire, чтобы я мог использовать код, который я уже написал для Arduino.
Есть ли простая библиотека для общения с I2C для C ++? Я нашел кое-что для Python и Java, но я хотел C ++. Я надеялся, что кто-то перенес библиотеку Arduino Wire, чтобы я мог использовать код, который я уже написал для Arduino.
Ответы:
В пользовательском пространстве Linux есть заголовок i2c-dev. Я не могу вспомнить, поставляется ли этот заголовок с пакетом lm-sensor, или его нужно будет установить из исходного кода. Я бы проверил хранилище пакетов вашего дистрибутива. У 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
Я только начал использовать библиотеку 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();
}
Как упомянул emcconville, в пользовательском пространстве Linux есть заголовок i2c-dev ( #include <linux/i2c-dev.h>
). Кроме того, вам нужно устройство для чтения символов. Это можно сделать, загрузив правильные модули.
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. Кроме того, кто-то может захотеть изучить похожие ссылки: