Jump to content
bobbjenkins

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

Recommended Posts

Привет

Иногда, например сразу после прошивки контроллера (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

 

Edited by bobbjenkins

Share this post


Link to post
Share on other sites

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

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


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

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

Нашел совет вот здесь: 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 появлялись. Кстати и сейчас изредка появляются, но очень редко и при зажатии ресета на несколько секунд. Но работать можно. Вот такой костыль...

Edited by bobbjenkins

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

думаю нет

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

Edited by mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Вебинар "Новый BlueNRG-LP с Bluetooth 5.2 и Long Range — волшебная палочка разработчика IoT" (04/02/2021)

Приглашаем 4 февраля на бесплатный вебинар о BlueNRG-LP - новом программируемом чипе SoC STMicroelectronics. На вебинаре будут детально рассмотрены новые возможности, особенности подключения, аппаратные и программные средства для разработки, а также практические примеры работы с микросхемой.

Подробнее

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

"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 на потом, когда появится свободное время разобраться во всем этом.

Edited by bobbjenkins

Share this post


Link to post
Share on other sites

Плата STEVAL-IDB011V1 – тестируем идеи на новом BLE 5.2-чипе BlueNRG-LP

Новая система на кристалле BlueNRG-LP производства STMicroelectronics предназначена для устройств интернета вещей(IoT ) и не только, отвечает стандарту BLE 5.2 и поддерживает MESH-сети. Микросхема содержит малопотребляющий MCU Cortex-M0+. Отладка STEVAL-IDB011V1 позволит сэкономить время на разработку новых устройств.

Подробнее

В 16.08.2017 в 16:16, bobbjenkins сказал:

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

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

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

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

У меня проц stm32f103c8t6


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

а кто роняет шину то? Контроллер или адресат?


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites
3 минуты назад, mail_robot сказал:

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

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

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

IMG_20180604_111929.jpg

IMG_20180604_111918.jpg


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

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

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

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

Edited by mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites
1 минуту назад, mail_robot сказал:

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

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

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

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

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

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

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

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


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

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

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

Edited by mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

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


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

капитанский вопрос нужен?


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Может я не в тему обращаюсь, но у меня есть проблемы по I2C библиотеки HAL. Не могу прочитать регистр акселерометра.

Но насколько я понял у меня HAL_OK  дает ошибку. Есть библиотечная функция     pData = HAL_I2C_Mem_Read(&hi2c2, 0xFA, 0x00, I2C_MEMADD_SIZE_8BIT, &pData, 1, 0x10000); делаю например так. Правильно ли это? Захожу в библиотеку и смотрю что она возвращает, вижу, что только HAL_OK. Как вытащить из нее данные?  Такой код 

uint8_t ReadData(uint16_t DevAddress, uint8_t RegAddress)

     {

        HAL_StatusTypeDef status = HAL_OK;

             uint8_t pData = 0;
    

             status = HAL_I2C_Mem_Read(&hi2c2, DevAddress, RegAddress, I2C_MEMADD_SIZE_8BIT, &pData, 1, 0x10000);

             if(status != HAL_OK)
             {
                 Led_on;
             }
            else
             {
         Led_off;
         }

           return pData;

     }
Правильно ли вытаскивать данные так?

Но у меня горит светодиод, то есть HAL_OK не окей у меня. В чем может быть причина неправильной работы данной функции?

Edited by Uhbif
исправление ошибок

Share this post


Link to post
Share on other sites

@Uhbif , я с этой библиотекой не работал, поэтому ткнуть в нужное место не могу, но любая библиотека - это всего лишь кусок кода, который кто-то написал. Вот вы правильно делаете:

6 часов назад, Uhbif сказал:

Захожу в библиотеку и смотрю что она возвращает

и видите, что что-то не то. Возьмите да поправьте, как вам надо. И не обязательно библиотеку. Можно просто по образу и подобию свою функцию в своём коде написать. Тем более, что чтение акселерометра элементарно делается глядя в его даташит.

Кстати, когда начнёте получать значения из регистров акселерометра, не забудьте, что значения с MEMS-датчиков сильно шумят. Нужно применять фильтрацию (в простейшем случае - усреднение).

Share this post


Link to post
Share on other sites

@Uhbif а разве трудно посмотреть что вернула функция? Ну пусть не ОК, но что тогда? Занято, таймаут, ошибка?

Ну и второй вопрос - мемрид удобнее что ли использовать?


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Мемрид для меня удобнее, я новичок, по крайней мере я понимаю, что читаю конкретный регистр. Это проще для меня.

ПО вопросу что она возвращает, значение 1, а это HAL_ERROR.

Share this post


Link to post
Share on other sites

BMX055, если я правильно разобрался в даташите то 0xFA, также в даташите указан адрес шины 0х18 или 0х19, все эти значения попробовал результат такой же. А еще скажите, надо его после включения как то инициализировать? Я ничего не делаю, но я хочу просто прочитать нулевой регистр например и получить дефолтное значение 0хFA.

Share this post


Link to post
Share on other sites
21 minutes ago, Uhbif said:

адрес шины 0х18 или 0х19

Надо использовать одно из этих значений. При вызове функции HAL_I2C_Mem_Read() адрес надо сдвинуть влево на 1 позицию, то есть (0x18 << 1) или (0x19 << 1). Поэтому присваиваем DevAddress = 0x30 или DevAddress = 0x32 и пользуем.

Share this post


Link to post
Share on other sites

попробовал, но значения либо 0 при 0х30 либо 1 при 0х32. Хотя светодиод у меня гаснет, то есть можно сделать вывод что HAL_OK = Ok. Читал регистры 0х00 и 0х0F, значения по умолчанию должны быть 0xFA и 0х03 соответственно. Может еще что то надо.

uint8_t ReadData(uint16_t DevAddress, uint8_t RegAddress)

     {

        HAL_StatusTypeDef status = HAL_OK;

             uint8_t pData = 0;
                 status = HAL_I2C_Mem_Read(&hi2c2, DevAddress, RegAddress, I2C_MEMADD_SIZE_8BIT, &pData, 1, 0x10000)

  if(status != HAL_OK)
             {
                 Led_on;
             }
            else
             {
         Led_off;
         }

           return pData;

     }

 

while(1)

{

ID_Acc=ReadData(0x30,0x00);

дальше вывод в программу терминал виртуального ком-порта.

}

}

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • повторю в очередной раз - мне МОНОПИСУАЛЬНО мнение про меня ЛАМЕРЬЯ, КЛИЕНТОВ и ПРОЧИХ "друзей" из кружка "Против Краба" .... Но я тебе отвечу - я СПРАВЕДЛИВЫЙ .... а это вышеперечисленной категории - как волос в супе, как буй в жопе, как заноза в  .... ну ты понял .... Так что не за мной нужно бегать и пытаться подколоть или зацепить, а чаще в ЗЕРКАЛО смотреть ....
    • Всяко разно бывает ! Но и принт скрин  никто не отменял !! Но почему ты такая сволочь ?  Ладно ! не буду ничего тут выставлять ... убей диалог ! и забудем  это общение ...
    • и что? Ну и у меня .... только толку ТУТ с тебя с твоей   ???! я с полутонами - не дружу .... посему "по-полной" привык .... ламерье в стойло ставить .... потому ПОВТОРЯЮ - твой ФЛУД тут будет подчищен и не несет НИЧЕГО .... окромя упоминания про меня .... Еще хочешь на БАН наговорить?
    • У меня LUKEY  702 !! А ты слегка ... не офуел ?
    • но еще больше - делает .... Посему хитрожопость, жмотство и ламерство афтара - будут наказаны ... а пост - удален ... Ты в секскунданты к аФтару записАлся, решил пятаком в теме засветить с постом НИ О ЧЕМ?
    • Краб много чего говорит - не надо ему верить !
    • решил засрать весь форум:   Ответ ТАМ ....

  • Выжигатель с регулировкой температура и набором жал

×
×
  • Create New...