Có thư viện I2C không


12

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.



1
Không đồng ý ... Tôi thực sự hỏi liệu thư viện dây Arduino có được chuyển sang Pi không để tôi có thể sử dụng mã được viết cho Arduino dễ dàng trên Pi. Điều đó dường như không phải là trường hợp, vì vậy bất kỳ thư viện tương đương, dễ sử dụng sẽ là tốt đẹp. Tuy nhiên, điều đó dường như cũng không tồn tại, vì vậy tôi chỉ còn sử dụng mã i2c-dev.
kevin

Câu trả lời:


7

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


5

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();
}

crj11, Cảm ơn bạn đã đăng ví dụ mã của bạn. Đó là ví dụ tốt nhất tôi có thể tìm và đưa tôi đi đúng hướng. Vấn đề duy nhất tôi gặp phải là sử dụng thư viện pigpiod_if.h yêu cầu mã để chạy như sudo, điều này không được chấp nhận cho dự án của tôi. Tôi đã có thể chuyển sang thư viện pigpiod_if2.h và thực hiện một vài điều chỉnh và nó chạy như một nhà vô địch.
Richard Teel

2

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_bcm2708cho 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_bcm2708trong /etc/modprobe.d/raspi-blacklist.confđể làm /dev/i2c-0/dev/i2c-1hiể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.hvớ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

CẬP NHẬT:

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ị.


0

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ự:

  1. http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/
  2. http://binerry.de/post/26685647322/raspberry-pi-and-i2c
  3. http://www.lazarus.freepascal.org/index.php?topic=17404.0

Không ... nhìn lại, nó không làm i2c, chỉ là các chức năng pin cơ bản. Dự án có phần gây hiểu nhầm. Liên kết đầu tiên của bạn có một số mã c đẹp, nhưng không phải là một trình bao bọc đơn giản để làm i2c như với Arduino. Tôi có thể sẽ phải tự viết nó.
kevin

3
Thư viện WiresPi I2C: Wiredpi.com/reference/i2c-l Library
avra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.