I2C не подтверждает адрес ведомого устройства

Я использую MCU STM32F767ZI на плате Nucleo 144, C++ в качестве языка программирования и встроенную среду разработки IAR. Состояние битового флага TXIS никогда не устанавливается (1), даже если I2C включен и в регистре TXDR нет данных.

Я также заметил, что, хотя и ведущий, и ведомый имеют одинаковый адрес ведомого устройства в соответствующих регистрах, но НЕТ ADDCODE. Хотя, как видно из кода, я использую метод опроса. Регистр ADDCODE должен иметь тот же адрес, что и адрес ведомого устройства, чего также не происходит.

Параметры оборудования были проверены как правильные.

Попытка выполнить кольцевой тест на том же MCU, используя I2C1 в качестве главного передатчика и I2C2 в качестве подчиненного приемника. Код застревает в части, как показано ниже:

while(!(IsTXISset())) // Code is getting stuck here
{

}

Где IsTXISset(), как показано ниже:

bool I2CInterface_c::IsTXISset(void) const
{
    bool flag{false};
    volatile uint32_t isrreg = I2C_ISR.Get();

    isrreg &= TXISFLAG; //TXISFLAG = 0x02 i.e the only bit position of the TXIS is set as high
    if (isrreg == TXISFLAG)
    {
        flag = true;
    }
    return flag;  

}

Кто-нибудь может помочь с этим, пожалуйста?

Не могли бы вы привести минимальный компилируемый пример? Таким образом, кто-нибудь с доской действительно сможет это попробовать. Он также будет включать код установки, который может чего-то упускать в данном конкретном случае.

domen 05.09.2018 16:32

На вашей плате есть подтягивающие резисторы?

Mike 06.09.2018 08:52

Я пробовал оба подхода: 1 - используя внутреннее сопротивление MCU, подтягивая контакты sda и scl gpio. 2- сделав gpio как no push pull в коде при использовании внешних подтягивающих резисторов, которые находятся на линии SDA и SCL TMP102 (датчик температуры I2C), то есть резисторы 4,7 кОм на коммутационной плате внутри.

A 786 06.09.2018 09:38

Давайте упростим вопрос: вся первоначальная конфигурация находится прямо в коде, для которого соответствующие значения хранятся в регистрах. Если кто-то может поделиться простой логикой передачи данных от ведущего к ведомому, это будет очень полезно.

A 786 06.09.2018 23:13

@domen из-за проблем с авторским правом. Я не могу поделиться полным кодом, но какую-то конкретную процедуру я могу просто упомянуть о потоке, если это поможет?

A 786 06.09.2018 23:15

Вы не попадаете в извечную ловушку, вызванную 7-битными адресами ведомых устройств?

Ed King 11.09.2018 21:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
452
1

Ответы 1

Наконец, удалось решить проблему после того, как было замечено, что контакты GPIO не настроены должным образом в режиме открытого слива альтернативной функции. Вторая проблема, обнаруженная после того, как ведомое устройство начало подтверждать совпадение адреса, не выполнялась передача данных, что было решено путем написания процедуры очистки бита ADDR - это регистр ISR I2C.

Другие вопросы по теме