|
|
  |
STM32 I2C, почему подвисает иногда? |
|
|
|
Oct 13 2011, 07:22
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(kan35 @ Oct 12 2011, 10:32)  I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY);
Иногда подвисание происходит вот на этой конструкции, заметил, что такое происходит при остановках JTAGом. Никакие ресеты не помогают - спасает только передергивание питание. Если JTAGом не останавливать, то вроде бы не зависает, но как то боязно, потому что не понятно... Что это такое? и как с этим бороться? Какая I2C периферия? Довольно общеизвестно, что, например, I2C EEPROM (ее внутренний I2C автомат) может "подвиснуть", если нарушить протокол обмена или не выдержать временнЫе соотношения. Такие состояния на шине I2C и могут возникнуть (наверняка возникают), если вмешиваться в процесс обмена по I2C остановками в прерываниях при отладке. Кроме того, если в отладчике отображаются регистры периферии, то происходит их считывание, что может привести к сбросу флагов (например, флага готовности приема, если прочитан регистр данных). Теоретически JTAG не должен изменять состояние системы (non intrusive), но возможно, что STM32F имеет какой-то баг. В SPI - так это точно, уже накололся. Чтобы вывести I2C периферию из подвешенного состояния следует выдать на линию SCL по меньшей мере 11 импульсов подряд. Это можно сделать перепрограммированием линии порта SCL в режим GPIO с последующим "ногодрыганием". В Вашем случае можно завести Timeout, и если I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) неразумно долго ждет, выполнить указаную процедуру восстановления (recovery).
|
|
|
|
|
Oct 19 2011, 09:31
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Nikitoc @ Oct 19 2011, 00:57)  Добрый день. У меня тоже вопрос по I2C, спрошу здесь, чтобы не плодить тем. Есть два stm32f103, которые общаются между собой по I2C. Первый, мастер, выдает слейву два байта команды, получает ACK на каждый из них и генерирует повторный старт. Затем выдает адрес на прием и тут же получает в приемник последний байт команды, который он перед этим передал! При этом слейв ничего не передает. Он даже не загружает в регистр DR никаких данных! Что я делаю не так? Заранее благодарен. Вопрос к " и тут же получает в приемник последний байт команды, который он перед этим передал": срабатывает прерывание/готовность приема или просто содержимое DR "предыдущее" в отладчике?
|
|
|
|
|
Oct 21 2011, 11:28
|

embedder
  
Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911

|
Цитата(Nikitoc @ Oct 21 2011, 10:42)  Совсем забыл. На этой же шине I2C еще висит акселерометр. Адрес у него, конечно, другой, не такой как у МК, но CS-пин всегда на земле (т.е. он как-бы всегда готов). Может ли такое быть, что он привносит свою "лепту" в обмен между МК? Не должен отвечать, так как не его адрес.
--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|