STM32 I2C1 Стартовый бит не установлен в регистре SR1 - PullRequest
4 голосов
/ 01 апреля 2010

Я пытаюсь запрограммировать stm32 для связи с моим i2c EEprom, но, похоже, каждый раз я говорю:

I2C_GenerateSTART(I2C1, ENABLE);
while( !(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) );  the code hangs here

Я прошел с отладчиком и обнаружил, что флаг бита 0 SR1 (который является сгенерированным флагом начального бита) не установлен, поэтому код зависает. Я могу видеть в осциллографе, что бит старта был сгенерирован, и это иногда работает. это обычно ломается, когда я пытался сделать несколько записей подряд. Я проверил HW, все выглядит нормально, я проверил частоту, которую я использую на шине i2c, она составляет 100 кГц в диапазоне 24lc1025.

любые идеи,

спасибо

Ответы [ 3 ]

6 голосов
/ 01 апреля 2010

Поскольку вы говорите, что это обычно прерывается, когда вы делаете несколько записей подряд, вы можете убедиться, что вы не нарушаете эту заметку в таблице данных STM32 для бита STOP в регистре управления I2C_CR1:

Примечание. Если установлен бит STOP, START или PEC, программа не должна выполнять запись доступ к I2C_CR1 до сброса этого бита аппаратно. В противном случае существует риск установка второго STOP, START или PEC запроса.

После установки бита STOP необходимо убедиться, что аппаратное обеспечение его очистило, прежде чем записать следующий бит START.

1 голос
/ 07 февраля 2012

Проверьте исправления для вашего устройства (получите его с сайта ST). STM32 имеет много ошибок в реализации I2C. Ошибки дают программные обходные пути для них.

0 голосов
/ 09 сентября 2013

Кроме того, при использовании исходных файлов драйвера, обычно предоставляемых на платформах STM32, не забудьте прочитать заголовки! Они могут быть очень полезны, особенно для новичков (таких как я), которые не уверены, с чего начать.

В этом случае вы будете смотреть на stm32f4xx_i2c.c

...