มีห้องสมุด I2C หรือไม่


12

มีห้องสมุดง่าย ๆ ที่จะพูดคุยกับ I2C สำหรับ C ++? ฉันพบบางอย่างสำหรับ python และ Java แต่ฉันต้องการ C ++ ฉันหวังว่าจะมีใครบางคนย้ายไปที่ห้องสมุดลวด Arduino เพื่อให้ฉันสามารถใช้รหัสที่ฉันได้เขียนไว้สำหรับ Arduino



1
ไม่เห็นด้วย ... ฉันถามจริง ๆ ว่าห้องสมุดสายไฟของ Arduino นั้นถูกส่งไปยัง Pi หรือไม่ดังนั้นฉันจึงสามารถใช้รหัสที่เขียนขึ้นสำหรับ Arduino ได้อย่างง่ายดายบน Pi ดูเหมือนจะไม่เป็นเช่นนั้นไลบรารีใด ๆ ที่เทียบเท่าและใช้งานง่ายก็น่าจะดี อย่างไรก็ตามนั่นก็ดูเหมือนว่าจะไม่มีอยู่ดังนั้นฉันจึงเหลือใช้รหัส i2c-dev
kevin

คำตอบ:


7

มีส่วนหัว i2c-dev ใน Linux userspace ฉันจำไม่ได้ว่าส่วนหัวนี้มาพร้อมกับแพ็คเกจ lm-sensors หรือถ้าจะต้องติดตั้งจากแหล่งที่มา ฉันจะตรวจสอบพื้นที่เก็บข้อมูลแพคเกจของ distro ของคุณ 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-เครื่องมือ ( ดาวน์โหลด ) Cเป็นตัวอย่างที่ดีในการ ฉันเห็นC++ห้องสมุดง่าย ๆ สองสามห่อหน้าที่เหล่านี้ ฉันขอแนะนำให้เขียนห้องสมุดของคุณเองเพื่อให้เหมาะกับความต้องการของคุณ ตัวอย่างที่ยอดเยี่ยมอื่น ๆ สามารถพบได้ใน Github เช่นห้องสมุดI2CBusนี้


5

ฉันเพิ่งเริ่มใช้ห้องสมุด pigpioและฉันประทับใจมาก ฉันชอบโหมดบิตแบล็กเป็นพิเศษเพราะมันช่วยให้คุณใช้พิน GPIO สองอันเป็นอินเทอร์เฟซ I2C ได้ตราบใดที่มีตัวต้านทานแบบดึงขึ้น หากคุณใช้ PI2 จะมีข้อเสียไม่น้อยที่จะต้องทำการตบเบา ๆ เนื่องจากคุณมี 4 CPU สิ่งที่ดีเกี่ยวกับคำสั่ง bit bang คือพวกเขาใช้รายการของ "address, data, read, start, stop," ไบต์เพื่อให้คุณสามารถเรียกใช้ I / O หลาย ๆ ด้วยการโทรเพียงครั้งเดียว มันเป็นสิ่งเดียวที่ฉันพบว่ารันการทำธุรกรรมเริ่มต้นที่เชื่อถือได้ซึ่งอุปกรณ์จำนวนมากต้องการใช้หมายเลขลงทะเบียนเมื่อเริ่มต้นคำสั่ง read ห้องสมุดมีเอกสารที่ดีและใช้งานง่าย

ด้านล่างเป็นโปรแกรมทดสอบที่อ่านการลงทะเบียนอุณหภูมิของ 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();
}

ขอบคุณสำหรับการโพสต์ตัวอย่างรหัสของคุณ มันเป็นตัวอย่างที่ดีที่สุดที่ฉันสามารถค้นหาและนำฉันไปสู่เส้นทางที่ถูกต้อง ปัญหาเดียวที่ฉันมีกับมันคือการใช้ไลบรารี pigpiod_if.h ต้องใช้รหัสเพื่อเรียกใช้เป็น sudo ซึ่งไม่เป็นที่ยอมรับสำหรับโครงการของฉัน ฉันสามารถเปลี่ยนไปใช้ห้องสมุด pigpiod_if2.h และทำการปรับแต่งสองสามอย่างและมันก็เหมือนแชมป์
Richard Teel

2

ตามที่กล่าวไว้โดย emcconville มีส่วนหัว i2c-dev ใน Linux userspace ( #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 ได้

ฉันชอบวิธีนี้เพราะมันเป็น platformagnostic คุณสามารถใช้linux/i2c-dev.hกับอุปกรณ์อื่นได้เช่นกันหากมีไดรเวอร์I²Cอยู่ WiringPi ถูกผูกไว้กับ rPi

ความนับถือ

UPDATE:

ข้อมูลนี้เลิกใช้แล้ว ตรวจสอบโพสต์นี้สำหรับการใช้งานทรีของอุปกรณ์


0

มีWiringPiซึ่งฉันคิดว่าทำสิ่งที่คุณต้องการ นอกจากนี้ยังมีแผ่นปิดสำหรับ Pascal, Java, Python, Perl, TCL และ Ruby นอกจากนี้บางคนอาจต้องการสำรวจลิงก์ที่คล้ายกัน:

  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

ไม่ ... ดูอีกครั้งมันไม่ได้ทำ i2c เพียงแค่ฟังก์ชั่นพินพื้นฐาน โครงการมีชื่อค่อนข้างหลอกลวง ลิงค์แรกของคุณมีรหัส c ที่ดี แต่ไม่ใช่เสื้อคลุมที่เรียบง่ายที่จะทำ i2c เช่นเดียวกับ Arduino ฉันอาจจะต้องเขียนมันเอง
วิน

3
ไลบรารี WiringPi I2C: wiringpi.com/reference/i2c-library
avra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.