快速 I2C 连接,迁移到新磁带库

Fast I2C connection, moving to new library

本文关键字:磁带库 迁移 I2C 连接 快速      更新时间:2023-10-16

我需要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 withbrzo_i2c_read(buffer,2,false);'.无论如何,brzo 代码不起作用。我总是收到相同的错误,并且文档中没有描述。

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

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

这是帕斯科,图书馆brzo_i2c的作者。

首先,对于更多即将到来的问题,我可以恳请您在 github 存储库上打开一个问题,即bzro_i2c问题。这是人们询问有关图书馆问题的通常场所。

我区分了代码文档和维基。自述文件很短,brzo_i2c维基解释了许多与 i2c 和brzo_i2c相关的东西。

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

我想你的接线是正确的?你们的上拉电阻有多大?

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

关于Wire.requestFrom(PCF8591, 5): 在幕后,此语句确实读取 5 个字节并将它们放入接收缓冲区中,即发生 i2c 通信:START、发送从地址、读取第一个字节、...、STOP。您可以在线路库的代码中看到这一点,它调用twi_readFrom(.),以及底层 esp8266Core 代码中的实际 i2c 通信。请注意,之后对wire.read(.)的调用执行任何 i2c 通信,而只是从接收缓冲区返回字节。 现在,将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的代码片段在这里