Я использую STM32F767ZI MCU на плате Nucleo 144, C ++ в качестве языка программирования и встроенную среду разработки IAR.
Битовый флаг TXIS Состояние никогда не получает Set (1), даже когда I2C включен, и в регистре TXDR нет данных.
Что я также заметил, что, хотя и ведущий и ведомый имеют один и тот же ведомый адрес в соответствующих регистрах, но не происходит ADDCODE. Хотя, как видно из кода, я использую метод Поллинга. Регистр ADDCODE должен иметь тот же адрес, что и адрес ведомого, что также не происходит.
Настройки оборудования были проверены как правильные.
Попытка выполнить тест Loopback на том же 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;
}
Кто-нибудь может помочь с этим, пожалуйста?
Наконец, удалось решить проблему, заметив, что выводы GPIO не были настроены должным образом в режиме с открытой альтернативной функцией.
Вторая проблема, выявленная после того, как ведомое устройство подтвердило совпадение адресов, передача данных не осуществлялась, и эта проблема была решена путем написания подпрограммы для очистки бита ADDR в регистре ISR I2C.
Других решений пока нет …