我需要在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/