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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> stm32 i2c
Dron_Gus
сообщение Nov 6 2009, 08:26
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Что-то не совсем адекватно работает модуль I2C2. Или я что-то не учел.
Кто-нить с ним работал. Есть какие-нить дополнительные грабли, кроме описанных в errat'е?
Симптомы: идет постоянный обмен с 8 устройствами. STM32 мастер. В какой-то момент общение со всеми устройствами выпадает на Ack Failed в момент передачи адреса. Отваливаются сразу все. Через некоторое время обмен восстанавливается.

З.Ы. на первом i2c висят часы и с ними никаких проблем не обнаружено.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 6 2009, 12:37
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Покопался на форуме ST. Вообщем, хотели как лучше, получилось как всегда.

З.Ы. ни у кого нет bit bang реализации i2c? И вообще, как на "быстром" проце делать привязку к времени? Не висеть же все время в процедуре обмена. С другой стороны вешать на прерывание таймера - больно часто выходит.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 6 2009, 18:01
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Посмотрите здесь свежак: STM32F10xxx devices: advanced I²C examples, если ещё не видели.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 8 2009, 18:57
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(IgorKossak @ Nov 6 2009, 21:01) *
Посмотрите здесь свежак: STM32F10xxx devices: advanced I²C examples, если ещё не видели.


Спасибо. Глядел диагонально. Еще пару месяцев назад этот пример содержал реализации на основе прерываний и полинга. Теперь только ДМА. У меня же основная засада в том, что заранее неизвестно, сколько данных отдаст периферийное устройство. Количество данных идет в первом байте. Т.е. ДМА не мой вариант.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
brag
сообщение Aug 12 2011, 22:29
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



У меня тоже он че-то не идет. Работает некоторое время, потом виснет. помогает только полный рестарт i2c + передергивание вручную SCL.
прерывания забустил.
Также есть несколько веток (типа https://my.st.com/public/STe2ecommunities/m...urrentviews=304 ) на их форуме, тоже без решений по сути.
Сделал софтовый I2C, благо, шина не сильно нагружена
Go to the top of the page
 
+Quote Post
rexton
сообщение Jul 10 2012, 07:29
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 6-11-11
Пользователь №: 68 153



Еще вопрос

Пытаюсь запустить обмен по шине на прерываниях. Так вот не пойму, у них прерывание по Start bit send работает в принципе?
То есть выставляю в I2C1->CR1 бит I2C_CR_START. По идее, после генерации старта на шине я должен попасть в прерывание I2C1_EV_IRQHandler() и там увидеть выставленный фдаг SB в SR1, однако, в прерывание не попадаю. Или я что то не так понял?

Другие прерывания вроде работают (например ADDR TxE).
Прерывания разрешены, переферия затактирована...
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 10 2012, 09:11
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(rexton @ Jul 10 2012, 11:29) *
Еще вопрос

Пытаюсь запустить обмен по шине на прерываниях. Так вот не пойму, у них прерывание по Start bit send работает в принципе?
То есть выставляю в I2C1->CR1 бит I2C_CR_START. По идее, после генерации старта на шине я должен попасть в прерывание I2C1_EV_IRQHandler() и там увидеть выставленный фдаг SB в SR1, однако, в прерывание не попадаю. Или я что то не так понял?

Другие прерывания вроде работают (например ADDR TxE).
Прерывания разрешены, переферия затактирована...


Резисторы подтягивающие в наличии?
Линии SDA и SCL в норме?
Go to the top of the page
 
+Quote Post
kan35
сообщение Jul 10 2012, 10:23
Сообщение #8


Знающий
****

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



Рекомендации ST по поводу I2C:
Это периферийное устройство в STM32 - сложное с кучей диагностических флагов и множеством режимов работы. Кроме того, оно чувствительно к таймингам, оттого инженеры саппорта ST обещают наложить проклятие на каждого, кто будет работать с этим модулем напрямую (и потом будет жаловаться на глюки). Вместо этого строго рекомендуется применять библиотеку CPAL, она доступна с сайта st.com. Не факт, что это ваш случай, но вероятность далеко не нулевая.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jul 11 2012, 08:32
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Dron_Gus @ Nov 8 2009, 20:57) *
Теперь только ДМА. У меня же основная засада в том, что заранее неизвестно, сколько данных отдаст периферийное устройство. Количество данных идет в первом байте. Т.е. ДМА не мой вариант.

Это как так? Мастер не знает, сколько спрашивает? Протокол I2C весьма детерминированный. Мастер определяет, сколько читать/писать. Если у ведомого запросить больше, чем он может дать, он выставит NACK. Это ловится в прерывании, обмен завершается, DMA останавливается. Все чисто. Не глядел еще примеры от ST: в свое время написал свою поддержку, работающую по прерываниям и с использованием DMA, работает стабильно.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Jul 11 2012, 10:00
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(KnightIgor @ Jul 11 2012, 12:32) *
Если у ведомого запросить больше, чем он может дать, он выставит NACK.


Не, 24LC можно читать до посинения по кругу, только оно никому не надо.
Go to the top of the page
 
+Quote Post
sls_
сообщение Jul 18 2012, 09:26
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



Прошу прощения, разобрался, напутал в чтении.

Сообщение отредактировал sls_ - Jul 18 2012, 12:41
Go to the top of the page
 
+Quote Post
LeonVS
сообщение Mar 8 2013, 18:50
Сообщение #12





Группа: Новичок
Сообщений: 1
Регистрация: 1-03-13
Пользователь №: 75 855



Всем доброго времени суток!
Помогите разобраться с опросом MS5611, никак не могу прочитать два байта при опросе, читается старший и все... Может кто сталкивался уже?
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 11 2013, 08:49
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(LeonVS @ Mar 8 2013, 19:50) *
Всем доброго времени суток!
Помогите разобраться с опросом MS5611, никак не могу прочитать два байта при опросе, читается старший и все... Может кто сталкивался уже?

Что значит "читается старший и все"? Что значит "всё", то есть, как это проявляется: выставляется NACK, либо I2C виснет вообще, либо младший байт неправильный по содержанию?

Как можно вообще так пространно вопросы ставить и потом на ответы надеяться?...
Go to the top of the page
 
+Quote Post
drcepera
сообщение Jul 10 2013, 09:00
Сообщение #14





Группа: Новичок
Сообщений: 4
Регистрация: 9-07-13
Из: СПб
Пользователь №: 77 447



Доброго времени суток. Юзаю i2c на STM32F4DISCOVERY для опроса датчика. Использую библиотеку CPAL. Появилась проблема, которая вот уже много времени гложет мозг. Суть в следующем.

CPAL проверяет таймауты, для чего на CPAL у меня выделен TIM3, по прерыванию раз в мс вызывается библиотечная функция CPAL_I2C_TIMEOUT_Manager(). И все вроде хорошо. НО! Возникают моменты, когда программа затыкается на __CPAL_I2C_TIMEOUT(). Это дефайн, который представляет из себя цикл, выход из которого возможен по одному из двух условий: 1) наступило ожидаемое событие (например, скинулся бит BUSY статусного регистра); 2) превышен лимит ожидания. То есть, если щелкает таймер, то рано или поздно цикл будет покинут. НО! При зависании в __CPAL_I2C_TIMEOUT() таймер хоть и работает, и выставлены нужные флаги, но прерывание, и соответственно, подсчет таймингов, не вызываются.

Привожу рисунок, на нем - собственно место затыка во время отладки, а также регистры 3-го таймера. Ниже по коду в комментах - определение самой __CPAL_I2C_TIMEOUT()

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jul 10 2013, 09:43
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(drcepera @ Jul 10 2013, 13:00) *
таймер хоть и работает, и выставлены нужные флаги, но прерывание, и соответственно, подсчет таймингов, не вызываются.

Так определите, кто (где, почему) запретил прерывание, если оно не вызывается.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 11th July 2025 - 18:12
Рейтинг@Mail.ru


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