Настроить Trinket M0 в качестве периферийного устройства I2C

Я пытаюсь использовать I2C для связи между моим XBee3 (контроллером) и adafruit trinket m0 (периферийным устройством). Я почти уверен, что модули подключены правильно (trinket SCL / pin 2 к xbee SCL / pin DIO1 и trinket SDA / pin 0 к xbee SDA / pin DIO11, и оба основания подключены). Вот мой код arduino на Trinket:

#include <Wire.h>

void setup()
{
Wire.begin(72); // присоединиться
Wire.onReceive(receiveEvent); // зарегистрировать событие
Serial.begin(9600); // запустить последовательный для вывода
Serial.print("Waiting for data...");
}

void loop()
{
delay(100);
}

// функция, которая выполняется всякий раз, когда данные поступают от ведущего
// эта функция зарегистрирована как событие, см. раздел настройка()
void receiveEvent(int howMany)
{
(void)howMany; // избежать предупреждения компилятора о неиспользуемом параметре

while(1 < Wire.available()) // перебираем все, кроме последнего
{
char c = Wire.read(); // получить байт в виде символа
Serial.print(c); // вывести символ
}
int x = Wire.read(); // получить байт как целое число
Serial.println(x); // вывести целое число
}

а вот мой код на XBee:

from machine import I2C

# Instantiate an I2C peripheral.
i2c = I2C(1)
slave_addr = 72
i2c.writeto(slave_addr, b'123', False)

Кроме того, когда я запускаю i2c.scan() на xbee с ISM330DHCX, подключенным к I2C xbee, адрес появляется сразу. Но когда я использую точно такой же код с xbee, подключенным к trinket m0, xbee не может найти никаких устройств. (Код вставлен ниже)

from machine import I2C

# Instantiate an I2C peripheral.
i2c = I2C(1)

# Scan for I2C slaves connected to the interface and print their address.
for address in i2c.scan():
    print("- I2C device found at address: %s" % hex(address))

У кого-нибудь есть какие-либо идеи, что я делаю не так с настройкой trinket m0 в качестве периферийного устройства i2c? Спасибо!

, 👍1

Обсуждение

Вы решили эту проблему? Я пытаюсь связаться с I2C между двумя безделушками M0 и сталкиваюсь с той же проблемой., @Glenn Jones

Я так и не разгадал ее. После некоторых дополнительных исследований я пришел к выводу, что trinket M0 не может быть сконфигурирован как периферийное устройство. В итоге я использовал другой микроконтроллер., @user3923030


1 ответ


1

У меня есть две платы Adafruit Trinket M0 arduino, работающие на рабочем столе прямо сейчас, разговаривающие друг с другом по I2C. Хитрость заключается в том, что вам нужно установить подтягивающий резистор между SDA и +3V, а другой - между SCL и +3V. Обычно это периферийные платы, которые поставляются с ними, но когда вы общаетесь между двумя микроконтроллерами, которые часто используются в качестве главного контроллера, они сами являются открытыми или недостаточно мощными, чтобы управлять шиной. Подойдет любой резистор от 4,7 Ком до 10 Ком.

см. Следующий справочный документ:

https://docs.particle.io/cards/firmware/wire-i2c/pull-up-resistors-i2c /

С другой стороны, если у вас много периферийных плат, которые все включают свои собственные подтягивающие резисторы, объединенное сопротивление на шине может быть достаточно низким, чтобы пропускать ток, достаточный для повышения "низкого" состояния выше 0,4 В, и в этот момент связь может иметь ошибки.

Или, если провода слишком длинные или слишком много устройств без достаточного сопротивления (следовательно, слишком большая внутренняя емкость), потребуется слишком много времени, чтобы линии передачи данных достигли "высокого" состояния, и вам придется снизить тактовую частоту или добавить усилитель сигнала, такой как LTC4311. (например, продукт Adafruit № 4756) для получения стабильных результатов.

,

Это очень полезно! Спасибо за сообщение. Я продвинулся дальше в этом проекте, поэтому я не могу проверить, решает ли это проблему. Тем не менее, это отличная информация для всех, кто может испытывать подобные проблемы., @user3923030