มีห้องสมุดง่าย ๆ ที่จะพูดคุยกับ I2C สำหรับ C ++? ฉันพบบางอย่างสำหรับ python และ Java แต่ฉันต้องการ C ++ ฉันหวังว่าจะมีใครบางคนย้ายไปที่ห้องสมุดลวด Arduino เพื่อให้ฉันสามารถใช้รหัสที่ฉันได้เขียนไว้สำหรับ Arduino
มีห้องสมุดง่าย ๆ ที่จะพูดคุยกับ I2C สำหรับ C ++? ฉันพบบางอย่างสำหรับ python และ Java แต่ฉันต้องการ C ++ ฉันหวังว่าจะมีใครบางคนย้ายไปที่ห้องสมุดลวด Arduino เพื่อให้ฉันสามารถใช้รหัสที่ฉันได้เขียนไว้สำหรับ Arduino
คำตอบ:
มีส่วนหัว 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นี้
ฉันเพิ่งเริ่มใช้ห้องสมุด 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();
}
ตามที่กล่าวไว้โดย 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
ความนับถือ
ข้อมูลนี้เลิกใช้แล้ว ตรวจสอบโพสต์นี้สำหรับการใช้งานทรีของอุปกรณ์
มีWiringPiซึ่งฉันคิดว่าทำสิ่งที่คุณต้องการ นอกจากนี้ยังมีแผ่นปิดสำหรับ Pascal, Java, Python, Perl, TCL และ Ruby นอกจากนี้บางคนอาจต้องการสำรวจลิงก์ที่คล้ายกัน: