реклама на сайте
подробности

 
 
> STM32 I2C, почему подвисает иногда?
kan35
сообщение Oct 12 2011, 08:32
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY);

Иногда подвисание происходит вот на этой конструкции, заметил, что такое происходит при остановках JTAGом. Никакие ресеты не помогают - спасает только передергивание питание. Если JTAGом не останавливать, то вроде бы не зависает, но как то боязно, потому что не понятно... Что это такое? и как с этим бороться?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Oct 13 2011, 07:22
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 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).
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Oct 18 2011, 22:57
Сообщение #3


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Добрый день. У меня тоже вопрос по I2C, спрошу здесь, чтобы не плодить тем. Есть два stm32f103, которые общаются между собой по I2C. Первый, мастер, выдает слейву два байта команды, получает ACK на каждый из них и генерирует повторный старт. Затем выдает адрес на прием и тут же получает в приемник последний байт команды, который он перед этим передал! При этом слейв ничего не передает. Он даже не загружает в регистр DR никаких данных! Что я делаю не так? Заранее благодарен.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01358 секунд с 7
ELECTRONIX ©2004-2016