Apakah ada Perpustakaan I2C

12

Apakah ada perpustakaan sederhana untuk berbicara dengan I2C untuk C ++? Saya telah menemukan beberapa hal untuk python dan Java, tetapi saya ingin C ++. Saya berharap seseorang telah mem-porting perpustakaan Arduino Wire sehingga saya bisa menggunakan kode yang sudah saya tulis untuk Arduino.

kevin
sumber
1
Tidak setuju ... Saya benar-benar bertanya apakah perpustakaan kabel Arduino dipindahkan ke Pi sehingga saya dapat menggunakan kode yang ditulis untuk Arduino dengan mudah di Pi. Tampaknya tidak demikian, sehingga perpustakaan yang setara dan mudah digunakan akan menyenangkan. Namun, itu juga sepertinya tidak ada, jadi saya menggunakan kode i2c-dev.
kevin

Jawaban:

7

Ada header i2c-dev di ruang pengguna Linux. Saya tidak ingat apakah header ini dikirimkan dengan paket lm-sensor, atau jika perlu diinstal dari sumber. Saya akan memeriksa repositori paket distro Anda. xGoat memiliki artikel bagus yang membahas persiapan & penggunaan.

#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
*/

Kode sumber untuk i2c-tools ( unduh ) adalah contoh yang bagus di C. Saya telah melihat beberapa C++perpustakaan sederhana membungkus fungsi-fungsi ini. Saya akan merekomendasikan pembuatan perpustakaan Anda sendiri sesuai dengan kebutuhan Anda. Contoh-contoh hebat lainnya dapat ditemukan di Github, seperti perpustakaan I2CBus ini

emcconville
sumber
5

Saya baru saja mulai menggunakan perpustakaan pigpio dan saya sangat terkesan. Saya terutama menyukai mode bit bang, karena memungkinkan Anda untuk menggunakan dua pin GPIO sebagai antarmuka I2C, asalkan mereka memiliki resistor pullup. Jika Anda menggunakan PI2, tidak ada banyak kelemahan untuk menggedor, karena Anda memiliki 4 CPU. Yang menyenangkan tentang perintah bit bang adalah mereka mengambil daftar "address, write, data, read, start, stop" byte perintah sehingga Anda dapat menjalankan banyak I / Os dengan satu panggilan. Ini adalah satu-satunya hal yang saya temukan yang andal menjalankan transaksi mulai berulang, yang diperlukan oleh banyak perangkat yang mengambil nomor register pada awal perintah baca. Perpustakaan didokumentasikan dengan baik dan mudah digunakan.

Di bawah ini adalah program uji yang membaca register suhu pada MAX31785. 4 menetapkan alamat dengan byte berikutnya, 2 = mulai, 7 = menulis yang diikuti oleh jumlah byte dan byte data, 3 = berhenti, 6 = membaca yang diikuti oleh jumlah byte. Panggilan mengembalikan setiap byte data yang dibaca bersama dengan jumlah 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
sumber
crj11, Terima kasih telah memposting contoh kode Anda. Itu adalah contoh terbaik yang saya dapat temukan dan menempatkan saya di jalur yang benar. Satu-satunya masalah saya dengan itu adalah dengan menggunakan perpustakaan pigpiod_if.h membutuhkan kode untuk dijalankan sebagai sudo, yang tidak dapat diterima untuk proyek saya. Saya bisa beralih ke perpustakaan pigpiod_if2.h dan membuat beberapa tweak dan berlari seperti juara.
Richard Teel
2

Seperti yang disebutkan oleh emcconville ada header i2c-dev di ruang pengguna Linux ( #include <linux/i2c-dev.h>). Selain itu, Anda memerlukan perangkat karakter untuk membaca. Ini dapat dilakukan dengan memuat modul yang benar. i2c_bcm2708untuk pengemudi tingkat rendah dan i2c-devuntuk menghasilkan tipuan karakter untuk bus. Menerapkan ...

sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000

untuk memuat mereka dengan cepat. Menerapkan ...

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

dan unblacklist i2c_bcm2708di /etc/modprobe.d/raspi-blacklist.confuntuk membuat /dev/i2c-0dan /dev/i2c-1muncul secara permanen.

Mulai sekarang Anda dapat mengikuti petunjuk tentang cara menggunakan I²C del maestro sendiri.

Saya lebih suka metode ini karena ini adalah platformagnostic. Anda dapat menggunakan linux/i2c-dev.hdengan perangkat lain juga, selama ada driver I²C. WiringPi terikat pada rPi.

Salam

MEMPERBARUI:

Informasi ini sudah usang. Periksa pos ini untuk penggunaan susunan perangkat.

ManuelSchneid3r
sumber
0

Ada WiringPi yang saya pikir melakukan apa yang Anda inginkan. Ada juga pembungkus untuk Pascal, Java, Python, Perl, TCL dan Ruby. Selain itu, seseorang mungkin ingin menjelajahi tautan serupa:

  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
avra
sumber
Tidak ... lihat lagi, itu tidak melakukan i2c, hanya fungsi pin dasar. Nama proyek ini agak menyesatkan. Tautan pertama Anda memiliki beberapa kode c yang bagus, tetapi bukan pembungkus sederhana untuk melakukan i2c seperti dengan Arduino. Saya mungkin harus menulis sendiri.
kevin
3
Pustaka I2C WiringPi: wiringpi.com/reference/i2c-library
avra