bobbjenkins

I2C иногда выдает HAL_BUSY после включения

16 сообщений в этой теме

bobbjenkins    7

Привет

Иногда, например сразу после прошивки контроллера (STM32F103), HAL_I2C_Mem_Read/HAL_I2C_Mem_Write возвращают HAL_BUSY. Но, если перезагрузить контроллер - все начинает работать. Иногда после перезагрузки кнопкой на плате i2c с этим i2c устройством не заводится, приходится заводить его как мопед - с нескольких перезагрузок reset'ом. Такое зависание обычно бывает, если зажать кнопку RESET и подержать секунду - сама плата с stm32 стартует нормально, а устройство I2c не работает, хотя зависания i2c случаются и при кратковременном резете.

Приаттачены настройки I2c из куба и отрывок из Datasheet I2C устройства (гироскоп/акселерометр MPU9250). Как думаете, в чем может быть причина? Подтягивающие резисторы (sda-vcc, scl-vcc), разумеется, на самой плате имеются.

Что я пробовал сделать (ничего из этого не помогло): 

1) добавлял HAL_Delay(1000) при старте STM32

2) также при старте добавил  (mpu9250 подключен к i2c1)

__HAL_RCC_I2C1_FORCE_RESET();
HAL_Delay(1000);
__HAL_RCC_I2C1_RELEASE_RESET();

3) менял настройки i2c в кубе: выставил StandardMode/1khz (хотя по спецификации, MPU9250 поддерживает i2c 4кгц).

В самом протоколе I2c, к сожалению, недостаточно хорошо разбираюсь, чтобы понять, что может происходить...

Screen Shot 2017-08-16 at 9.24.37 AM.png

Screen Shot 2017-08-16 at 9.27.57 AM.png

 

Изменено пользователем bobbjenkins

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 407

для начала посмотрите в каком случае вообще возникает HAL_BUSY. Скорее всего контроллер не получает ACK от устройства в заданный интервал времени. Такое может быть, если "абонент" хочет, чтобы его слегка "дернули", после старта. Достаточно для этого сделать просто пустой WRITE на любой прерываемой функцией HAL_I2C с таймаутом (например миллисекунду). Просто по адресу пулять например чтение статуса или ID устройства, до тех пор пока не ответит, игнорируя ошибки чтения по таймауту.

У этих акселерометров вечно такие проблемы со связью. Контроллер бывает и не виноват вовсе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
bobbjenkins    7

Спасибо за ответ.

Нашел совет вот здесь: https://community.st.com/thread/15632. Судя по всему - это баг в реализации HAL для F10* контроллеров.

Рекомендуют включать тактирование i2c вручную (в обход куба) перед инициализацией gpio, + установить/сбросить бит RESET у i2c. 

Добавил вот этот код в начало main(), перед инициализацией периферии:

  /* USER CODE BEGIN SysInit */
   __HAL_RCC_I2C1_CLK_ENABLE();
   HAL_Delay(100);
   __HAL_RCC_I2C1_FORCE_RESET();
   HAL_Delay(100);
   __HAL_RCC_I2C1_RELEASE_RESET();
   HAL_Delay(100);
  
  /* USER CODE END SysInit */

Пока что нет (и, надеюсь, не будет) проблем с BUSY, независимо от длительности перезагрузки.

HAL_Delay'и здесь не нужны, верно?

Update: Как оказалось, задержки нужны. Без них, при длительном зажатии кнопки Reset, HAL_BUSY появлялись. Кстати и сейчас изредка появляются, но очень редко и при зажатии ресета на несколько секунд. Но работать можно. Вот такой костыль...

Изменено пользователем bobbjenkins

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 407

думаю нет

можно было попробовать просто инитки местами поменять и все в начале main()

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
bobbjenkins    7

Оказывается, проблема еще глубже. Если кому-то интересно, в эррата есть подробное описание решения:

"I2C analog filter may provide wrong value, locking BUSY flag and preventing master mode entry" 

 

http://www.st.com/content/ccc/resource/technical/document/errata_sheet/7d/02/75/64/17/fc/4d/fd/CD00190234.pdf/files/CD00190234.pdf/jcr:content/translations/en.CD00190234.pdf#page26

 

Там приводятся 15 шагов по обходу этой проблемы

И еще вот решения:

https://electronics.stackexchange.com/questions/272427/stm32-busy-flag-is-set-after-i2c-initialization

https://electronics.stackexchange.com/questions/267972/i2c-busy-flag-strange-behaviour

Описанный в прошлом посте метод в большинстве случаев работает (иногда все-таки выдает HAL_BUSY, хоть и намного реже), поэтому пока оставлю реализацию этого кода из errata на потом, когда появится свободное время разобраться во всем этом.

Изменено пользователем bobbjenkins

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290
В 16.08.2017 в 16:16, bobbjenkins сказал:

Оказывается, проблема еще глубже. Если кому-то интересно, в эррата есть подробное описание решения:

Привет! У меня тоже с i2c проблема...

Проблема заключается в том , что выдается старт бит и потом через 5мкс. Сразу отпускается шина... Смотрел логическим анализатором сигнал.  Собран проект в кубе , юарт и прочее работает , а и2ц никак..

Пробовал 15 шагов , да что то проблема не решается.

У меня проц stm32f103c8t6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290
3 минуты назад, mail_robot сказал:

а кто роняет шину то

Стм формирует старт и через 5мкс поднимает шину , и больше ничего не происходит. Я уже чего только не пробовал. Могу показать логи

Функция передачи и приема (HAL_I2C..) постоянно возвращает 0х02.

IMG_20180604_111929.jpg

IMG_20180604_111918.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Читайте ДШ, Reference и Эррату товарищи и не гадайте. Там указано как и в каком порядке нужно инициализировать периферию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GOR23    39

В эррате про i2c четко описано, что и как. А в паре с халом, баг с i2c может вылиться вот в это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290

Блин , пацаны , есть этот кусок кода у кого то?? Чтобы не писать регистры пол дня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 407

Мля, я не знаю. Ну ни разу небыло проблем с I2C на 103-ем. И на хал и без него. Там в ерате такой лес условий чтобы баг словить, что я прям не знаю как надо извернуться.

Надо поробовать поднять ноги приемника с шины и просто на подвешенных резюках снять лог. Уже сколько раз у народа глюки были на той стороне. 0х02 контроллер шины выдаст только тогда, когда ACK придет не вовремя и единица выставленная контроллером на шине при проверке не совпадет с реальным значением на шине. То есть контроллер отпускает шину открытым стоком, потом сравнивает показания с дата регистром, если не совпали, то ставит ошибку - шина занята. А она и правда с точки зрения контроллера занята, потому как кто-то насильно ее тянет к земле. Обычная мультимастерная коллизия

Кто приемник? Как его зовут?

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290
1 минуту назад, mail_robot сказал:

Надо поробовать поднять ноги приемника с шины и просто на подвешенных резюках снять лог.

***** , я вчера это делал , честное слово ! Я думал что это датчик hdc1080 балуется , но с отключенным датчиком точно такая же проблема!

Условие старт формируется и потом сразу отпускает шину ! И потом вообще никаких признаков жизни . Хоть програмный i2c подключай ...

У меня кстати на ф407 все работает ! Только там память 24с32

5 минут назад, mail_robot сказал:

А она и правда с точки зрения контроллера занята, потому как кто-то насильно ее тянет к земле.

Да не занята шина !

Стм32 формирует условие старт и отпускает шину . На ней 3.3в четко стоит . 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 407

ну попробуй регистрами. Для очистки совести. Проинить ноги на AF, затактируй модуль да пульни в регистр данных любое значение. Или второй I2C попробуй на те же дела

У меня как то был косяк с камнем, когда нога не хотела вести себя так, как я ей скажу. Просто все что писал туда превращалось в рандомные значения. Китайский камень, хз что с ним там натворили при производстве. Нога была PC0. Камень новый, только из коробки

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290

Заработал i2c дурацкий. Теперь датчик четко темп и влажность измеряет!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Сообщения

    • Чтобы ощутить стерео эффект от такого устройства, необходимо находится от него на расстоянии примерно равном, расстоянию между динамиками 
    • Подскажите как исправить неполадку.У меня пропал звонок на входящих sms.
    • А при подаче на стоящий на месте кулер напряжения 4-5 вольт  (при котором он гарантировано не сможет крутиться) куда эта энергия будет уходить? не в тепло?  Вот потому мне кажется, что не нужно на кулер подавать малое напряжение. Будет все равно на месте стоять, дергаться, рассеивать тепло... А в нужный момент сразу 6-7 вольт и кулер гарантировано заработает. 
    • Портативные магнитофоны, делали то же стерео, там тот же эффект. Всё равно чуть лучше чем моно, но в целом панорама узкая. Решение явно компромиссное, рассчитанное на лёгкость транспортировки.   
    • @dima1967 и  @РадиоНастройщик, создайте тему и попросите модераторов перенести туда ваши сообщения. Тема интересная, но тут она не к месту. Я подожду чуток и потом сам попрошу удалить их. Всё таки это тема про "Синусоидальный генератор НЧ на КПЕ" 
    • Потому, что применяется по-дурацки. Читайте мой предыдущий пост (я его дополнил), как сделать, чтобы не грелся. Дополню. У составного транзистора повышено напряжение насыщения. Если это критично, 7-й вывод подключается к питанию через токоограничительный резистор, задающий базовый ток дополнительному транзистору, на базу которого идет 4-й вывод. Начальный бросок напряжения можно обеспечить, зашунтировав R4 или же термодатчик (транзистор) конденсатором. ВСЁ!
    • Я ее видел много раз и видел много отзывов, что 311 жутко греется даже на обычных 80мм кулерах и обычно добавляли еще транзистор. Читал..читал, но так и не увидел, чем там можно задать запуск кулера от некоторого порога, например 7 вольт, что бы до определенной температуры на кулер не подавалось напряжение от которого он не в состоянии вращаться.