首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓Things I2C从arduino 3v3中读取

安卓Things I2C从arduino 3v3中读取
EN

Stack Overflow用户
提问于 2019-02-23 02:24:33
回答 2查看 139关注 0票数 0

我试着和Android的东西进行交流、读和写,从Arduino - slave到RPi - master。

如果使用带电平转换器的I R/W,从RPi到Arduino 5v (16 RPi),一切工作正常。

所以我决定去掉电平转换器,改用3v3Arduino mini pro (8 8Mhz)。

写入工作正常,但当我尝试从Arduino读取时,信号停止。

5v_16Mhz

设置为9、0地址并读取至9后,信号仍为低电平,并接收到数据。没问题。

3v3_8Mhz

设置为9、0地址并读取至9后,信号变为高电平,数据停止。

我对Slave使用了相同的示例:

代码语言:javascript
复制
#include <Wire.h>

byte RFID[20] = {9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,1,2};


void setup() {
  Wire.begin(8);          // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(115200);     // start serial for output
  pinMode(13, OUTPUT);
}

void loop() {
  delay(100);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  Serial.println("Master ask");
  digitalWrite(13, HIGH);
  delay(250);
  Wire.write(RFID, 20);
  digitalWrite(13, LOW);
}

// function should be executes whenever data is received from master
// this function is registered as an event, but it's called every time the RPi
// call the Device.
void receiveEvent(int howMany) {
  while (0 < Wire.available()) {
    byte RTC_syn = Wire.read(); // receive byte
    Serial.println(RTC_syn);
  }
}

我真的不知道信号是怎么变高的。

有人能帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2019-03-14 01:47:19

如果I R/W,带电平转换器,从RPi到Arduino 5v (16 RPi),一切都很好。

所以我决定去掉电平转换器,改用3v3Arduino mini pro (8 8Mhz)。

写入工作正常,但当我尝试从Arduino读取时,信号停止。

如果没有缓冲区,您的总线可能会遇到一些负载。你可以尝试通过添加更强的上拉电阻来解决这个问题。RPi3的I2C线路上有1.8k上拉电阻,通常可以工作,但根据从机输入阻抗的不同,上拉电阻可能会很小。Arduino Mini有安装I2C下拉菜单的垫,但默认情况下没有。

纯3.3V I2C总线的推荐上拉电阻接近1k,因此您可能只需要在SCL/SDA和+3.3V之间添加一些更强的上拉。您添加的任何内容都将与RPi3电阻并行,因此请将其纳入您的计算。例如,增加4.7k电阻可使有效电阻降至约1.3k。

如果您无法通过上拉解决此问题,则可以通过使用线路驱动器IC (random example)在不进行电平转换的情况下实现相同的缓冲效果。

票数 0
EN

Stack Overflow用户

发布于 2019-02-23 06:35:18

如果电平转换器工作正常,你应该坚持使用它。

像I2C这样的通信协议将数据编码成一系列逻辑高和逻辑低信号。高/低是什么意思?这取决于设备。对于大多数嵌入式设备,逻辑低电平将为0V。

对于Arduinos和Raspberry Pis,电源电压是不同的(3.3V和5V)。这种差异可能会导致几个潜在的问题。

  1. 5V信号太高,Arduino无法处理,导致Arduino停止工作或重新启动
  2. 3.3V信号不够强,无法解释为逻辑高。嵌入式设备具有将信号舍入为高/低的电路,并且阈值可能不完全均匀。5V输入可能只接受4.5V或更高的电压,将其他一切解释为低电压或处于不确定状态。
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54833034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档