Có một thư viện đơn giản để nói chuyện với I2C cho C ++ không? Tôi đã tìm thấy một số thứ cho python và Java, nhưng tôi muốn C ++. Tôi đã hy vọng ai đó đã chuyển thư viện Arduino Wire để tôi có thể sử dụng mã mà tôi đã viết cho Arduino.
Có một thư viện đơn giản để nói chuyện với I2C cho C ++ không? Tôi đã tìm thấy một số thứ cho python và Java, nhưng tôi muốn C ++. Tôi đã hy vọng ai đó đã chuyển thư viện Arduino Wire để tôi có thể sử dụng mã mà tôi đã viết cho Arduino.
Câu trả lời:
Có một tiêu đề i2c-dev trong không gian người dùng Linux. Tôi không thể nhớ nếu tiêu đề này được vận chuyển với gói cảm biến lm, hoặc nếu nó sẽ cần phải được cài đặt từ nguồn. Tôi sẽ kiểm tra kho lưu trữ gói distro của bạn. xGoat có một bài viết hay về sự chuẩn bị và cách sử dụng.
#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
*/
Mã nguồn cho i2c-tools ( tải xuống ) là những ví dụ điển hình trong C
. Tôi đã thấy một vài C++
thư viện đơn giản bao bọc các chức năng này. Tôi khuyên bạn nên cho phép thư viện của riêng bạn phù hợp với nhu cầu của bạn. Các ví dụ tuyệt vời khác có thể được tìm thấy trên Github, như thư viện I2CBus này
Tôi mới bắt đầu sử dụng thư viện pigpio và tôi rất ấn tượng. Tôi đặc biệt thích chế độ bit bang, vì nó cho phép bạn sử dụng bất kỳ hai chân GPIO nào làm giao diện I2C, miễn là chúng có điện trở pullup. Nếu bạn đang sử dụng PI2, sẽ không có nhiều bất lợi cho việc đập bit, vì bạn có 4 CPU. Điều thú vị về các lệnh bit bang là chúng lấy một danh sách các byte lệnh "địa chỉ, ghi, dữ liệu, đọc, bắt đầu, dừng" để bạn có thể chạy nhiều I / O với một cuộc gọi. Đó là điều duy nhất mà tôi thấy rằng chạy các giao dịch bắt đầu lặp đi lặp lại một cách đáng tin cậy, được yêu cầu bởi nhiều thiết bị có số đăng ký khi bắt đầu lệnh đọc. Thư viện là tài liệu tốt và dễ sử dụng.
Dưới đây là chương trình thử nghiệm đọc các thanh ghi nhiệt độ trên MAX31785. 4 đặt địa chỉ với byte kế tiếp, 2 = start, 7 = write, theo sau là số byte và byte dữ liệu, 3 = stop, 6 = read được theo sau bởi số byte. Cuộc gọi trả về bất kỳ byte dữ liệu nào được đọc cùng với số byte.
#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();
}
Như emcconville đã đề cập, có một tiêu đề i2c-dev trong không gian người dùng Linux ( #include <linux/i2c-dev.h>
). Hơn nữa, bạn cần một thiết bị nhân vật để đọc từ. Điều này có thể được thực hiện bằng cách tải các mô-đun chính xác.
i2c_bcm2708
cho trình điều khiển cấp thấp và i2c-dev
để tạo ra các ký tự cho các bus. Ứng dụng ...
sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000
để tải chúng trên bay. Ứng dụng ...
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
và unblacklist i2c_bcm2708
trong /etc/modprobe.d/raspi-blacklist.conf
để làm /dev/i2c-0
và /dev/i2c-1
hiển thị lên vĩnh viễn.
Từ bây giờ bạn có thể làm theo các gợi ý về cách sử dụng I²C del maestro.
Tôi thích phương pháp này bởi vì nó là nền tảng. Bạn cũng có thể sử dụng linux/i2c-dev.h
với các thiết bị khác, miễn là có trình điều khiển I²C. WiresPi bị ràng buộc với rPi.
Trân trọng
Thông tin này không được chấp nhận. Kiểm tra bài này để sử dụng cây thiết bị.
Có một WiresPi mà tôi nghĩ làm chính xác những gì bạn muốn. Ngoài ra còn có các hàm bao cho Pascal, Java, Python, Perl, TCL và Ruby. Ngoài ra, ai đó có thể muốn khám phá các liên kết tương tự: