Raspberry Pi和I2C在c++中与PCF8591的布线Pi

Raspberry Pi and I2C in c++ with wiringPi for PCF8591

本文关键字:Pi PCF8591 布线 中与 I2C Raspberry c++      更新时间:2023-10-16

我正在尝试理解I2C总线,用于控制我的Raspberry Pi B+上带有wiringPi C库的PCF8591 D/a转换器。

我写了一个测试代码(用c++编写),运行良好,但我不知道我做这件事的方式是否正确。该程序每0.5秒读取并显示4个模拟输入值,并根据4个输入引脚的平均值设置输出。

#include <iostream>
#include <wiringPi.h>
#include <wiringPiI2C.h>
using namespace std;
int readInput(int fd, int reg)
{
    wiringPiI2CReadReg8(fd, reg);
    return wiringPiI2CReadReg8(fd, reg);
}
int main()
{
    wiringPiSetupGpio();
    int dacModule = wiringPiI2CSetup(0x48);
    if (dacModule < 0)
    {
        cout << "I2C Setup Error" << endl;
        return 0;
    }
    int i;
    int A[4]        = {0,       0,      0,      0};
    int A_Reg[4]    = {0x40,    0x41,   0x42,   0x43};
    while (1)
    {
        for (i=0;i<4;i++) A[i] = readInput(dacModule, A_Reg[i]);
        wiringPiI2CWriteReg8(dacModule, 0x40, (A[0]+A[1]+A[2]+A[3])/4);
        cout << endl;
        for (i=0;i<4;i++) cout << i << " : " << A[i] << endl;
        delay(500);
    }
    return 0;
}

我的问题是:

  • 我注意到我需要调用wiringPiI2CReadReg8函数两次才能读取正确的输入值,为什么?(如果我不这样做,函数将返回以前的输入值)
  • 我读到有一个专门为PCF8591制作的wiringPi库的特殊模块(这个),这两种方法(特殊库与通用I2C库)之间有性能差异吗

非常感谢您的帮助/反馈。

要回答您的第一个问题:是的,这很正常。如果您查看数据表(可以在此处找到),您将在第8页的图8中看到,读取操作正在触发新的转换,但将输出上一次转换的结果。因此,如果您想通过一个接一个地"强制"两个连续的读取操作来了解当前转换,则确实需要读取2个字节。下一页第二段也再次提到了这一点。

至于你的第二个问题,我对那个图书馆还没有经验。但是源代码是免费提供的,所以你可以检查你的代码/方法并将其与你在其中找到的进行比较。

我使用C语言为PCF8591编写了以下代码。这根绳子很好用。

#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
/*
cc -o test1 test1.c -lwiringPi
*/
int main (void)
{
  int fd;
  int i;
  int a2dChannel = 0; // analog channel
  int a2dVal;
  float a2dVol;
  float Vref = 3.3;
  if ((fd = wiringPiI2CSetup(0x48)) < 0) {
    printf("wiringPiI2CSetup failed:n");
  }
  for(i=0;i<20;i++) {
    wiringPiI2CWrite(fd,0x40 | a2dChannel);
    a2dVal = wiringPiI2CRead(fd); // Previously byte
    a2dVal = wiringPiI2CRead(fd);
    a2dVol = a2dVal * Vref / 255;
    printf("a2dVal=%dn",a2dVal);
    printf("a2dVol=%f[V]n",a2dVol);
    sleep(1);
  }
}

您可以使用analog Read()。

#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pcf8591.h>
#define PINBASE 100
/*
cc -o test2 test2.c -lwiringPi
*/
int main (void)
{
  int i;
  int a2dChannel = 0; // analog channel
  int a2dVal;
  float a2dVol;
  float Vref = 3.3;
  if (pcf8591Setup(PINBASE, 0x48) < 0)
  {
    printf("pcf8591Setup failed:n");
  }
  for(i=0;i<20;i++) {
    a2dVal = analogRead(PINBASE + a2dChannel);
    a2dVol = a2dVal * Vref / 255;
    printf("a2dVal=%dn",a2dVal);
    printf("a2dVol=%f[V]n",a2dVol);
    sleep(1);
  }
}