我需要在ESP和ADC之间进行更快的通信,所以我找到了这个https://github.com/pasko-zh/brzo_i2c

原始电线示例

#include "Wire.h"
#define PCF8591 0x48
byte a0;

void setup() {
  Wire.begin(13,14);
  Serial.begin(115200);
}

void loop() {
  Wire.beginTransmission(PCF8591);
  Wire.write(0x04);
  Wire.endTransmission();
  Wire.requestFrom(PCF8591, 5);
  a0=Wire.read();
  a0=Wire.read();
  Serial.println(a0);
  delay(1000);
}


Brzo I2C示例

#include "brzo_i2c.h"

uint8_t buffer[10];
uint8_t error=0;
float temp=0.0;

uint8_t ICACHE_RAM_ATTR get_temp(float *t) {
   uint8_t bcode=0;
  brzo_i2c_start_transaction(0x48,400);
  buffer[0]=0x04;
  brzo_i2c_write(buffer,1,false);// somewhere here is the error
  brzo_i2c_read(buffer,2,false);// or here
  bcode=brzo_i2c_end_transaction();
  *t=((buffer[0]<<8)|buffer[1]);
  return bcode;
}

void setup(){
  delay(500);
  Serial.begin(115200);
  brzo_i2c_setup(13,14,2000);
}

void loop() {
  error=get_temp(&temp);
  if(error==0){
  Serial.print("Temp = ");
  Serial.println(temp, 8);
} else {
  Serial.print("Brzo error : ");
  Serial.println(error);
}
  delay(500);
}


但是我总是得到同样的错误。


  1:公交车不免费


我以不同的方式重写了它,更改了频率,引脚并进行了多次交易。我无法使用它的主要原因是API有所不同。

没有〜Wire.requestFrom(); in the brzo_i2c lib. So I need to read the value with brzo_i2c_read(buffer,2,false);`。无论如何,brzo代码不起作用。我总是得到相同的错误,并且文档中没有描述。

导线参考:https://www.arduino.cc/en/reference/wire

brzo参考:https://github.com/pasko-zh/brzo_i2c/wiki

最佳答案

这是库brzo_i2c的作者paško。

首先,对于其他即将到来的问题,请允许您在github仓库中打开一个问题,即bzro_i2c Issues。这是人们通常问有关图书馆的地方。

我在代码文档和Wiki之间进行了区分。自述文件简短,brzo_i2c wiki解释了许多与i2c和brzo_i2c相关的内容。

通常,如果SCA或SCL为低电平,则i2c总线不是空闲的。

我认为您的接线正确吗?您的上拉电阻有多大?

我看了PCF8591的数据表。在第20页上的表11“动态特性”中说:SCL时钟频率MAX 100 kHz。但是,在您的代码中,选择的是400 kHz,brzo_i2c_start_transaction(0x48,400);因此,最大应使用100 kHz。我猜这是在写入控制字节后读取命令的时序问题。

关于Wire.requestFrom(PCF8591, 5)
在后台,该语句确实读取了5个字节并将其放入接收缓冲区,即发生i2c通信:START,发送从站地址,读取第一个字节,...,STOP。您可以在code of the wire library(称为twi_readFrom(.))中看到它,并在基础esp8266Core code中看到实际的i2c通信。请注意,随后对wire.read(.)的调用不会执行任何i2c通信,而只会执行returns the bytes from the receive buffer
现在,将Wire.requestFrom(PCF8591, 5)转换为brzo_i2c非常简单:

brzo_i2c_start_transaction(0x48,100);
  brzo_i2c_read(buffer,5,false);
bcode = brzo_i2c_end_transaction();


但是,我不会为读写进行单独的事务,而是将它们合并-只要它们属于“一起”即可。因此,在上面的代码中,先编写控制字节,然后再读取相应的数据,这是要走的路:-)

顺便说一句:从您的代码,我猜您正在使用一个模拟温度传感器。您可以使用具有i2c总线接口的数字传感器,例如ADT7420,带有brzo_i2c的代码段为here

关于c++ - 快速的I2C连接,移至新库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43091171/

10-11 16:10