Android Things I2C читать с Arduino 3v3 - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь общаться, читать и писать от Arduino - подчиненного - до RPi - master - с Android Things.

Если я R / W, с преобразователем уровня, от RPi до Arduino 5v (16 МГц)), все работает отлично.

Поэтому я решил исключить преобразователь уровня и использовать 3v3 Arduino mini pro (8 МГц).

Запись работает нормально, но когда я пытаюсь прочитать изArduino, сигнал останавливается.

5v_16Mhz
После установки на 9, адрес 0, и считывание до 9, сигнал все еще низкий и получил данные.Нет проблем.

3v3_8Mhz
После настройки на адрес 9, 0 и чтения на 9 сигнал повышается и данные останавливаются.

Я использовалтот же пример для Slave:

#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);
  }
}

Я действительно не знаю, как высокий уровень сигнала ...
Кто-то может мне помочь?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Если я R / W, с преобразователем уровня, от RPi до Arduino 5v (16Mhz), все работает отлично.

Поэтому я решил исключить преобразователь уровня и использовать Arduino 3v3mini pro (8Mhz).

Запись работает нормально, но когда я пытаюсь читать с Arduino, сигнал останавливается.

Это потому, что преобразователь уровня у вас был в 5VВерсия /3.3В делает больше, чем просто сдвиг напряжения.Он также действует как хороший буфер с высоким импедансом между двумя устройствами, который помогает поддерживать управляемый сигнал и избегает эффектов загрузки.

Без буфера ваша шина, вероятно, испытывает небольшую нагрузку.Вы можете попытаться бороться с этим, добавив более мощные подтягивающие резисторы.RPi3 имеет нагрузочные резисторы 1,8 кОм на линиях I2C, что, как правило, работает, но может быть незначительным в зависимости от входного сопротивления ведомого устройства.Arduino Mini имеет контактные площадки для установки подтягиваний I2C, но по умолчанию их нет.

Рекомендуемое сопротивление подтягиванию для чистой шины I2C 3,3 В ближе к 1 кОм, поэтому вам, вероятно, просто нужно добавить несколькоболее сильные подтягивания между SCL / SDA и + 3,3 В.Все, что вы добавите, будет параллельно резисторам RPi3, так что учтите это.Например, добавление резисторов 4,7 кОм снижает эффективное сопротивление примерно до 1,3 кОм.

Если вы не можете решить проблему с подтягиванием, вы можете добиться того же эффекта буфера без преобразования уровня с помощью линейного драйвераIC ( случайный пример ).

0 голосов
/ 23 февраля 2019

Если преобразователь уровня работает, вам следует придерживаться его.

Коммуникационные протоколы, такие как I2C, кодируют данные в серию логических ВЫСОКОГО и логического НИЗКОГО сигналов.Что означает ВЫСОКИЙ / НИЗКИЙ?Это зависит от устройств.Для большинства встроенных устройств логика LOW будет заземлена, 0 В.

Для Arduinos и Raspberry Pis напряжение источника отличается (3,3 В против 5 В).Это различие может привести к нескольким потенциальным проблемам.

  1. Слишком сильный сигнал 5 В для обработки Arduino, из-за чего Arduino перестает работать или перезагружается

  2. Сигнал 3,3 В недостаточно силен, чтобы его можно было интерпретировать как логический ВЫСОКИЙ.Встроенные устройства имеют схемы, которые округляют сигналы в HIGH / LOW, и пороговые значения могут быть не совсем ровными.Вход 5 В может принимать только напряжение 4,5 В или выше, интерпретируя все остальное как НИЗКОЕ или в неопределенном состоянии.

...