I2C Kütüphanesi var mı


12

C ++ için I2C ile konuşmak için basit bir kütüphane var mı? Python ve Java için bazı şeyler buldum, ama C ++ istedim. Arduino için yazmış olduğum kodu kullanabilmek için birisinin Arduino Wire kütüphanesini taşımasını umuyordum.



1
Katılmıyorum ... Gerçekten Arduino kablo kütüphanesi Pi'ye taşınmış olup olmadığını soruyorum, bu yüzden Pi'de Arduino için yazılan kodu kolayca kullanabilirim. Durum böyle değil, bu yüzden eşdeğer, kullanımı kolay bir kütüphane iyi olurdu. Ancak, bu da var gibi görünmüyor, bu yüzden i2c-dev kodunu kullanarak kaldı.
kevin

Yanıtlar:


7

Linux kullanıcı alanında bir i2c-dev başlığı var. Bu başlığın lm-sensörleri paketiyle birlikte gönderilip gönderilmediğini veya kaynaktan yüklenmesi gerekip gerekmediğini hatırlayamıyorum. Distro'nuzun paket deposunu kontrol ederdim. xGoat , hazırlık ve kullanımı kapsayan güzel bir makaleye sahiptir.

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

İ2c-tools ( download ) için kaynak kodu bunun iyi örnekleridir C. C++Bu fonksiyonları saran birkaç basit kütüphane gördüm . İhtiyaçlarınıza göre kendi kütüphanenizi yazmanızı tavsiye ederim. Diğer harika örnekler Github'da bulunabilir, örneğin bu I2CBus kütüphanesi


5

Sadece pigpio kütüphanesini kullanmaya başladım ve çok etkilendim. Özellikle bit patlama modunu seviyorum, çünkü çekme dirençleri olduğu sürece herhangi bir iki GPIO pinini I2C arayüzü olarak kullanmanıza izin veriyor. Bir PI2 kullanıyorsanız, 4 CPU'nuz olduğundan, beceriyor için çok dezavantaj yoktur. Bit patlama komutları ile ilgili güzel bir şey, tek bir çağrı ile birden fazla G / Ç çalıştırabilmeniz için "adres, yazma, veri, okuma, başlatma, durdurma" komut baytlarının bir listesini almalarıdır. Bir okuma komutunun başında bir kayıt numarası alan birçok cihaz için gerekli olan tekrarlanan başlatma işlemlerini güvenilir bir şekilde çalıştıran bulduğum tek şey. Kütüphane iyi belgelenmiştir ve kullanımı kolaydır.

Aşağıda MAX31785 sıcaklık kayıtlarını okuyan test programı verilmiştir. 4 adresi bir sonraki bayt ile ayarlar, 2 = başlat, 7 = yazma bir bayt sayısı ve veri baytları gelir, 3 = stop, 6 = okuma bir bayt sayısı gelir. Çağrı, bayt sayısı ile birlikte okunan veri baytlarını döndürür.

#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, Kod örneğinizi gönderdiğiniz için teşekkür ederiz. Beni bulabildiğim ve doğru yola koyabildiğim en iyi örnekti. Ben onunla vardı tek sorun pigpiod_if.h kütüphane kullanarak kod projem için kabul edilebilir değildi sudo çalıştırmak için gerektirir oldu. Ben pigpiod_if2.h kütüphanesine geçip birkaç değişiklik yapmayı başardım ve bir şampiyon gibi koştum.
Richard Teel

2

Emcconville tarafından belirtildiği gibi Linux kullanıcı alanında bir i2c-dev başlığı vardır ( #include <linux/i2c-dev.h>). Ayrıca okumak için bir karakter cihazına ihtiyacınız var. Bu, doğru modüller yüklenerek yapılabilir. i2c_bcm2708düşük seviyeli sürücü ve i2c-devotobüslerde karakter decives üretmek için. Uygulamak ...

sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000

onları anında yüklemek için. Uygulamak ...

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

ve unblacklist i2c_bcm2708içinde /etc/modprobe.d/raspi-blacklist.confyapmak /dev/i2c-0ve /dev/i2c-1kalıcı görünür.

Artık I²C del maestro'nun nasıl kullanılacağına dair ipuçlarını takip edebilirsiniz .

Bu yöntemi tercih ediyorum çünkü platformagnostik. linux/i2c-dev.hBir I²C sürücüsü olduğu sürece diğer cihazlarla da kullanabilirsiniz . WiringPi rPi'ye bağlıdır.

Saygılarımızla

GÜNCELLEME:

Bu bilgi kullanımdan kaldırıldı. Cihaz ağaçlarının kullanımı için bu yazıyı kontrol edin .


0

Tam olarak ne istediğinizi yaptığımı düşündüğüm bir WiringPi var. Pascal, Java, Python, Perl, TCL ve Ruby için sarmalayıcılar da vardır. Ayrıca, birisi benzer bağlantıları keşfetmek isteyebilir:

  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

Hayır ... tekrar bak, i2c yapmaz, sadece temel pin işlevleri. Proje biraz yanıltıcı bir şekilde adlandırılmıştır. İlk bağlantınız güzel bir c koduna sahip, ancak Arduino gibi i2c yapmak için basit bir sarıcı değil. Muhtemelen bunu kendim yazmak zorunda kalacağım.
kevin

3
WiringPi I2C kütüphanesi: wiringpi.com/reference/i2c-library
avra
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.