I2C EEPROM "зависает" на endTransmission()

i2c

Я работаю над 24LC256 EEPROM, подключен как таковой, за исключением 3,3 В на EEPROM, с прицелом, зажатым на SDA и SCL. Я использую скрипт сканера адресов с несколькими настройками, скоростью 57 600 бод, подтяжкой 10 кОм, тактовой частотой I2C 100 000 и некоторыми отпечатки для слежки:

for(address = 1; address < 127; address++ ) {
    Serial.printf("\n%02x", address);
    Wire.beginTransmission(address);
    Serial.printf(",");
    error = Wire.endTransmission();
    Serial.printf(".");
    Serial.flush();
    if (error == 0) {
      Serial.printf("I2C device found at address 0x%02x", address);
      Serial.println("  !");
      nDevices++;
    }
    ...

Когда цикл достигает адреса, соответствующего перемычкам (контакты 1, 2, 3 соответствуют адресу 0b01010abc, также известному как 0x5?, где ? = двоичное кодирование этих контактов), он просто зависает:

4c,.
4d,.
4e,.
4f,.
50,

(здесь у меня 1, 2, 3 все низкие, поэтому чип отвечает на адрес 0x50). Поскольку он нажимает ,, но не ., я знаю, что он зависает на Wire.endTransmission(). Он всегда зависает на endTransmission по адресу, закодированному перемычками. SCL низкий, а SDA высокий.

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

След адреса не найден.

След зависания по адресу.

gif циклического просмотра нескольких последних адресов.

Я использую Adafruit Feather nrf52 BLE, если это имеет значение.

, 👍-1

Обсуждение

Можете ли вы проверить, какая цепь удерживает SCL на низком уровне? (Перо или EEPROM) SCL может удерживаться ведомым устройством на низком уровне для замедления ведущего, если ведомое устройство не готово или ему требуется некоторое время для обработки предыдущих данных., @chrisl

@chrisl, как я могу это проверить? Я попытался подключить свой прицел к шунтирующему резистору на SCL, который просто понизил все (вероятно, из-за заземления прицела). Я думаю, мне нужен инамп или что-то в этом роде., @DeusXMachina

Тогда вы, скорее всего, подключили его неправильно. Прицел имеет высокое сопротивление, он не должен ничего тянуть вниз. Измерьте напряжение с помощью прицела между контактом SCL пера и заземлением пера., @chrisl

Как это может сказать мне, является ли мастер или ведомый низким?, @DeusXMachina

Извините, надо было описать. Прикрепите прицел к перу SCL. Когда SCL низкий, отключите ведомое устройство и снова проверьте напряжение. Если он поднимается, раб держит его низко, @chrisl

@DeusXMachina Похоже, они недавно исправили эту ошибку: https://github.com/adafruit/Adafruit_nRF52_Arduino/commit/38047231b1a577f3b7821374ded98efc3463268c, @Mikael Patel

@DeusXMachina Вы можете попробовать добавить запись одного байта., @Mikael Patel


1 ответ


0

Из-за того, как работает библиотека I2C, единственное место, где она может зависнуть, — это endTransmission. Другие вызовы просто буферизуют данные в памяти.

Вероятно, проблема с электричеством. Например, подтягивающие резисторы могут быть лучше 4,7 кОм.

Существует другая библиотека, которая немного иначе обрабатывает передачу, что может решить проблему зависания.

Однако, если он зависает, вероятно, в основе лежат другие проблемы (длина кабеля, подтягивающие резисторы, шум).

Стандартная библиотека в замкнутом цикле ожидает поступления определенных прерываний, и если они не поступают, она зависает на неопределенный срок.


кроме 3,3 В для EEPROM

Возможно, вам понадобится переключатель уровней. Все очень хорошо, только подача 3,3 В в EEPROM, но остальная часть схемы работает с 5 В, а не с 3,3 В. Вы можете получить подходящие переключатели уровней довольно дешево.

Почему вы все равно используете 3,3 В? Этот чип может работать с 5V. У меня есть пост именно об этом чипе, который там отлично работает.

,

Привет, Ник, я использую 3.3, потому что все логические контакты NRF52 3.3. Я должен был сделать это более очевидным. [Feather nRF52](https://www.adafruit.com/product/3406) — 3.3, поэтому весь макет на 3.3. Исходное изображение, которое я использовал, показывает UNO. EEPROM должен обрабатывать 1,8-5,5 В. Но я думаю, что вы правы насчет подтягивающих резисторов. Я читал, что I2C очень обидчив, когда дело доходит до емкости системы и скорости этих подтягиваний., @DeusXMachina