Стартовый бит STM32 I2C1 не установлен в регистре SR1
Вопрос
Я пытаюсь запрограммировать stm32 для взаимодействия с моей EEprom i2c, но кажется, что каждый раз, когда я говорю:
I2C_GenerateSTART(I2C1, ENABLE);
while( !(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) ); the code hangs here
Я прошел через отладчик и обнаружил, что флаг SR1 bit 0 (который является флагом, генерируемым начальным битом) не установлен, из-за чего код зависает.Я вижу на осциллографе, что начальный бит был сгенерирован, и иногда это срабатывает.обычно он ломается, когда я пытаюсь выполнить несколько записей подряд.Я проверил HW, все выглядит нормально, я проверил частоту, которую я использую на шине i2c, она составляет 100 кГц в пределах 24lc1025 eeprom.
есть какие-нибудь идеи,
Спасибо
Решение
Поскольку вы говорите, что это обычно прерывается, когда вы выполняете несколько операций записи подряд, возможно, вам захочется убедиться, что вы не нарушаете это примечание в таблице данных STM32 для STOP
бит в управляющем регистре I2C_CR1:
Примечание:Когда в
STOP
,START
илиPEC
бит установлен, программное обеспечение не должно выполнять какую-либо запись доступ кI2C_CR1
до того, как этот бит будет очищен аппаратным обеспечением.В противном случае существует риск установки второгоSTOP
,START
илиPEC
просьба.
Как только вы установите STOP
бит вам нужно убедиться, что аппаратное обеспечение очистило его, прежде чем вы напишете следующий START
немного.
Другие советы
Проверьте исправления для вашего устройства (получите их с веб-сайта ST).В STM32 много ошибок в реализации I2C.Ошибки предоставляют программные обходные пути для них.
Кроме того, при использовании исходных файлов драйверов, обычно поставляемых с платформами STM32, не забудьте прочитать заголовки!Они могут быть очень полезны, особенно для новичков (вроде меня), которые не уверены, с чего начать.
В этом случае вы бы смотрели на stm32f4xx_i2c.c