Я использую 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;
}
Кто-нибудь может помочь с этим, пожалуйста?
На вашей плате есть подтягивающие резисторы?
Я пробовал оба подхода: 1 - используя внутреннее сопротивление MCU, подтягивая контакты sda и scl gpio. 2- сделав gpio как no push pull в коде при использовании внешних подтягивающих резисторов, которые находятся на линии SDA и SCL TMP102 (датчик температуры I2C), то есть резисторы 4,7 кОм на коммутационной плате внутри.
Давайте упростим вопрос: вся первоначальная конфигурация находится прямо в коде, для которого соответствующие значения хранятся в регистрах. Если кто-то может поделиться простой логикой передачи данных от ведущего к ведомому, это будет очень полезно.
@domen из-за проблем с авторским правом. Я не могу поделиться полным кодом, но какую-то конкретную процедуру я могу просто упомянуть о потоке, если это поможет?
Вы не попадаете в извечную ловушку, вызванную 7-битными адресами ведомых устройств?
Наконец, удалось решить проблему после того, как было замечено, что контакты GPIO не настроены должным образом в режиме открытого слива альтернативной функции. Вторая проблема, обнаруженная после того, как ведомое устройство начало подтверждать совпадение адреса, не выполнялась передача данных, что было решено путем написания процедуры очистки бита ADDR - это регистр ISR I2C.
Не могли бы вы привести минимальный компилируемый пример? Таким образом, кто-нибудь с доской действительно сможет это попробовать. Он также будет включать код установки, который может чего-то упускать в данном конкретном случае.