I2C между EEPROM и Arduino работает, а не с STM32

Это сводит меня с ума уже пару дней, так что, может быть, вы, ребята, дадите мне некоторое представление о том, что происходит не так.

Я пытаюсь прочитать некоторые данные из EEPROM (24LC16B) с помощью STM32 (F0), но это мне просто не позволяет. Я пробовал Arduino, который работал и все еще работает, поэтому я знаю, что проводка правильная.

Это моя функция для чтения данных EEPROM. (Он сокращен до самой основы, просто для тестирования): (Pastebin моей функции I2C_setup)

uint16_t readEEPROMData(uint16_t deviceAddress, int memAddress){
    // Wait while I2C peripheral is not ready
    I2C_WaitForFlag(I2C_ISR_BUSY);

    // Start I2C write transfer for 2 bytes, do not end transfer (SoftEnd_Mode)
    I2C_TransferHandling(I2C1, 0xA2, 2, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
    I2C_WaitForFlag(I2C_ISR_TXIS);

    // For testing purpose, be sure to generate a stop command...
    I2C_TransferHandling(I2C1, 0xA2, 0, I2C_AutoEnd_Mode, I2C_Generate_Stop);

    return I2C_COMM_STATUS;
}

Вот вставка библиотеки Arduino, которую я использовал.

Я использовал логический анализатор, чтобы посмотреть, как происходит общение, и теперь я действительно этого не понимаю. Вот экран для печати рабочей версии Arduino:  Связь с Arduino EEPROM

А вот экран для печати связи STM32:  Связь с EEPROM STM32

Экспорт анализатора логики (доступен для просмотра с помощью Saleae Logic)

Как видите, я использую тот же адрес (хотя мне пришлось использовать 0xA2 с STM32), и никаких странных вещей, кроме NACK, не происходит. Так что же могло быть не так?


person Mathlight    schedule 04.01.2018    source источник
comment
Я тоже сталкивался с подобной проблемой в прошлом. Пожалуйста, подтвердите, что все требования по срокам были соблюдены. Перед запуском новой команды убедитесь, что предыдущий цикл записи был завершен, т. Е. С задержкой не менее 5 мс после предыдущей операции записи. Третья проблема может быть связана с емкостью шины (с которой я столкнулся). Емкость на шине искажала мою форму волны.   -  person Dark Sorrow    schedule 04.01.2018
comment
@DarkSorrow Спасибо за ответ. Разница во времени между Arduino и STM составляет максимум .5 μ для SDA и SCL. Между каждой попыткой есть задержка в 0,12 с, так что это не должно быть проблемой?   -  person Mathlight    schedule 04.01.2018
comment
@DarkSorrow. Не могли бы вы подробнее рассказать о емкости шины?   -  person Mathlight    schedule 04.01.2018
comment
@DarkSorrow Большое спасибо за указание на проблему емкости. Я пробовал провода, используемые с Arduino, и хотя мне приходилось удерживать их рукой на контактах, теперь я получаю несколько ACK вместо всех NACK. Так что я тоже думаю, что это так. Я попробую приклеить провода и посмотреть, как это получится, но если бы вы могли дать ответ по этим пунктам (особенно последнему), это было бы здорово.   -  person Mathlight    schedule 04.01.2018
comment
У нас было несколько устройств на одной шине I2C. 2 из этих устройств, расположенных на расстоянии, соединены кабелем. Из-за этого увеличивается емкость кабельной шины, вызывая искажение формы сигнала. Из подключенных устройств EEPROM и датчик отвечали NACK, но когда кабель был отключен, EEPROM начала работать правильно.   -  person Dark Sorrow    schedule 04.01.2018


Ответы (1)


  1. Подтвердите выполнение всех требований синхронизации шины.
  2. Убедитесь, что у них адекватная задержка после каждого цикла записи (5 мс)
  3. Убедитесь, что емкость шины ниже допустимого предела I2C (400 пФ - теоретически).
  4. Убедитесь, что предоставлен правильный VCC.

Как уже упоминалось, вы подключаете EEPROM к MCU с помощью кабеля, который вам необходимо согласовать по емкости.

Вы можете использовать осциллограф, чтобы проверить, есть ли у них искажения формы сигнала. Вы можете использовать измеритель LCR для проверки емкости.

Попробуйте уменьшить частоту шины с 25 кГц до 50 кГц и проверьте форму сигнала. Попробуйте увеличить силу сопротивления натяжению.

Проблема с неправильной емкостью VCC (например, 4,2 В вместо 5 В) заключается в том, что время может отличаться от. (не полностью проверено, но проблема устранилась)

person Dark Sorrow    schedule 04.01.2018
comment
После того, как я сказал, что смена проводов сработала, я проверил еще немного, но больше не работало. Поменял на другие провода, но не вышло. Но теперь исправил. Проблема заключалась в том, что от STM32 поступало 5В. Он дал мне только 4,2 В вместо 5 В. Вот почему время было неподходящим. Если бы вы могли добавить к своему ответу часть о проверке тока, я приму ваш ответ. Хотя это не решило мою проблему, это определенно может помочь кому-то другому, и это заставило меня задуматься об этом. - person Mathlight; 04.01.2018
comment
@Mathlight, согласно таблице данных, если Vcc ниже 2,5 В, вы должны использовать скорость шины ниже 100 кГц. Теоретически 4.2V не должно вызывать проблем, но шина I2C полна загадок. Вы пробовали работать на более низкой скорости, как я предлагал? - person Dark Sorrow; 05.01.2018
comment
@Mathlight, как ты решил проблему? Было бы полезно узнать об этом в будущем. - person Dark Sorrow; 05.01.2018
comment
Теоретически проблем быть не должно. Но мой Vcc сейчас идет от Arduino, и связь намного стабильнее. Хотя все еще не идеально, но приближается. Если я узнаю, почему stm дает мне меньше, чем 5v, я бы подробно объяснил здесь, что пошло не так. - person Mathlight; 05.01.2018
comment
Сделаю за пару часов. Мне также интересно узнать, могу ли я использовать контакт в качестве Vcc (установите выход на высокий, возможно, это даст правильные 5 В) - person Mathlight; 05.01.2018
comment
Оказывается, STM выдает такое низкое напряжение, потому что он питается от ноутбука. Если я питаю его от зарядного устройства телефона, он становится ближе к 5 В. Так что это могло объяснить, почему я не мог получить 5V. Теперь попробуем связаться с EEPROM с 3v, посмотрим, как это пойдет - person Mathlight; 05.01.2018
comment
Спасибо за обновления. Вы можете увеличить ток питания USB в настройках ОС. Просто опубликуйте, что происходит. Также попробуйте с низкой скоростью связи. - person Dark Sorrow; 05.01.2018
comment
Хорошо, сейчас я тестировал его с Arduino 3v и STM32 3v. Arduino 3v дал те же результаты, что и Arduino 5v (большую часть времени работал, но не стабильно). Но использование 3v STM32 все исправило. Теперь у меня четкое общение, никаких сбоев или других странных вещей. Большое спасибо за ваше терпение ;-) Хотя я не проверял скорость связи, вы помогли мне найти проблему и ответить (вроде отладки резиновой утки: D) Хорошего Нового года! - person Mathlight; 05.01.2018