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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Вопрос по I2C
dimon_rub
сообщение Dec 15 2016, 12:21
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282



Здравствуйте. Вопрос наверно стар но конкретного ответа так я и не нашел. КАКОЙ метод (прерывание или DMA)нужно использовать при работе с STM32F103 по шине I2C с несколькими устройствами. Примеры попадающиеся на просторах в основном проверка в цикле с тайм-аутом (как по мне не очень красиво). Устройства всегда слейв. При этом: одно память чтение/запись не постоянная, второе датчик опрос постоянный. Кроме этого используется АЦП(где тоже соответственно опрос постоянный, сдесь DMA), USART(DMA) и SPI Ethernet(планируется DMA).

СПАСИБО ЗА СОВЕТ!!!
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 15 2016, 13:01
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (dimon_rub @ Dec 15 2016, 20:21) *
Здравствуйте. Вопрос наверно стар но конкретного ответа так я и не нашел. КАКОЙ метод (прерывание или DMA)нужно использовать при работе с STM32F103 по шине I2C с несколькими устройствами. Примеры попадающиеся на просторах в основном проверка в цикле с тайм-аутом (как по мне не очень красиво). Устройства всегда слейв. При этом: одно память чтение/запись не постоянная, второе датчик опрос постоянный. Кроме этого используется АЦП(где тоже соответственно опрос постоянный, сдесь DMA), USART(DMA) и SPI Ethernet(планируется DMA).

СПАСИБО ЗА СОВЕТ!!!

Да по-бубену biggrin.gif Как вам удобно: поллинг, прерывания, ПДП. Можно даже программную шину сделать... НО! Таймауты должны быть, и полноценная обработка состояний шины (конечный автомат) дабы не повесить всю программу из-за отвалившихся часов. Я не использую ПДП, т.к. не гоняю через I2C большие потоки данных, но использую прерывания.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Obam
сообщение Dec 15 2016, 13:11
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



По бубну wink.gif


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
pitt
сообщение Dec 15 2016, 13:25
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



Цитата(dimon_rub @ Dec 15 2016, 07:21) *
Здравствуйте. Вопрос наверно стар но конкретного ответа так я и не нашел. КАКОЙ метод (прерывание или DMA)нужно использовать при работе с STM32F103 по шине I2C с несколькими устройствами. Примеры попадающиеся на просторах в основном проверка в цикле с тайм-аутом (как по мне не очень красиво). Устройства всегда слейв. При этом: одно память чтение/запись не постоянная, второе датчик опрос постоянный. Кроме этого используется АЦП(где тоже соответственно опрос постоянный, сдесь DMA), USART(DMA) и SPI Ethernet(планируется DMA).

СПАСИБО ЗА СОВЕТ!!!

В приводимых ST примерах есть несколько различных задержек. В большинстве случаев, более уместно использовать прерывания, но не всегда. Например, я использую поллинг для START и STOP clocks - число циклов задержки сопоставимо с затратами на вход и вычод из прерываний, а вот wo всеx остальных случаях, прерывания будут отнимать меньше MCU clocks.
В сети есть множество разнообразных примеров - изучайте их. ST код пригоден исключительно для понимания работы их железа, так как их документация просто отвратительна. Есть еще вариант выключения мосгов и использования Cube, но тогда надо знать правильные молитвы, чтобы все работало ВСЕГДА, но тут я помочь не в состоянии.
Успехов.


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Dec 15 2016, 14:04
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282



Спасибо. Хотелось услышать людей непосредственно работающих этой штукой. Я то же попробую для начала прерывания (они как то ближе) у а потом ......
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Dec 15 2016, 20:11
Сообщение #6


Знающий
****

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



Цитата(dimon_rub @ Dec 15 2016, 16:04) *
Спасибо. Хотелось услышать людей непосредственно работающих этой штукой. Я то же попробую для начала прерывания (они как то ближе) у а потом ......

Мда, сочуствую: начинать с I2C F103 по прерываниям. Это полная катастрофа...
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Dec 16 2016, 06:07
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



KnightIgor, а почему катастрофа?


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 16 2016, 06:48
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (arhiv6 @ Dec 16 2016, 08:07) *
KnightIgor, а почему катастрофа?
Присоединяюсь к вопросу. Я сразу начал и с прерываниями и с ПДП и под ОС. Все работет. Что я сделал неправильно?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Dec 16 2016, 07:36
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282



Цитата(KnightIgor @ Dec 15 2016, 20:11) *
Мда, сочуствую: начинать с I2C F103 по прерываниям. Это полная катастрофа...


А в чем интересно проблема. Поделитесь ПОЖАЛУЙСТА.
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 16 2016, 09:35
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(KnightIgor @ Dec 15 2016, 23:11) *
Мда, сочуствую: начинать с I2C F103 по прерываниям. Это полная катастрофа...

Цитата(Сергей Борщ @ Dec 16 2016, 09:48) *
Присоединяюсь к вопросу. Я сразу начал и с прерываниями и с ПДП и под ОС. Все работет. Что я сделал неправильно?

Цитата(dimon_rub @ Dec 16 2016, 10:36) *
А в чем интересно проблема. Поделитесь ПОЖАЛУЙСТА.

Я вообще шину I2С использовал только на MCU PIC16 от Microchip, да и то программный вариант: выделяешь два вывода и работаешь. Медленная она, но полезная, когда нечасто нужно опрашивать несколько микросхем на шине I2C или в пределах печатной платы связать все узлы, поддерживающие I2C.

А вообще использую интерфейсы UART и SPI, они быстрые (несколько мегабит или несколько десятков мегабит в секунду), по ним можно передавать большие блоки данных, и здесь удобно пользоваться прерываниями на низких скоростях и DMA на больших.

Но вот совсем не пойму, а какой смысл использовать на медленной шине I2C прием и передачу по прерываниям, и еще DMA для I2C использовать? Поясните в двух словах, если не сложно! rolleyes.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 16 2016, 11:15
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Pridnya @ Dec 16 2016, 11:35) *
А вообще использую интерфейсы UART и SPI
А еще бывают внешние микросхемы, у которых I2C прибит гвоздями. К тому же и UART и SPI - интерфейс "точка-точка" и для опроса нескольких внешних микросхем придется городить огород. У меня на двух проводах I2C висят три заказных индикатора и 124 линии ввода-вывода (кнопки, светодиоды) через расширители, все это разбросано по плате размером с полтора листа A4.
QUOTE (Pridnya @ Dec 16 2016, 11:35) *
Но вот совсем не пойму, а какой смысл использовать на медленной шине I2C прием и передачу по прерываниям, и еще DMA для I2C использовать?
Про принцип "пустил-забыл" слышали? Передача: дождался освобождения шины, запустил обмен, пошел делать другие дела. Прием: дождался освобождения шины, запустил обмен, жду сигнала от ОС о готовности данных (в это время процессор делает другие полезные дела вместо тупого опроса флагов I2C или тупого шевеления ногами "медленной шины I2C").


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 16 2016, 11:18
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Pridnya @ Dec 16 2016, 11:35) *
Но вот совсем не пойму, а какой смысл использовать на медленной шине I2C прием и передачу по прерываниям, и еще DMA для I2C использовать? Поясните в двух словах, если не сложно! rolleyes.gif

Вот именно потому, что она МЕДЛЕННАЯ и следует использовать прерывания, дабы не ждать ожидания транзакции. Причем все точно так же обстоит и с помянутыми Вами SPI и UART.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Dec 16 2016, 12:05
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(Сергей Борщ @ Dec 16 2016, 14:15) *
... 124 линии ввода-вывода (кнопки, светодиоды) через расширители...

Если не секрет, можно вопрос? Кнопки циклично опрашиваются или какой-то доп сигнал "прерывание" используете? Какие расширители используете?
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 16 2016, 12:05
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(Сергей Борщ @ Dec 16 2016, 14:15) *
А еще бывают внешние микросхемы, у которых I2C прибит гвоздями. К тому же и UART и SPI - интерфейс "точка-точка" и для опроса нескольких внешних микросхем придется городить огород. У меня на двух проводах I2C висят три заказных индикатора и 124 линии ввода-вывода (кнопки, светодиоды) через расширители, все это разбросано по плате размером с полтора листа A4.
Про принцип "пустил-забыл" слышали? Передача: дождался освобождения шины, запустил обмен, пошел делать другие дела. Прием: дождался освобождения шины, запустил обмен, жду сигнала от ОС о готовности данных (в это время процессор делает другие полезные дела вместо тупого опроса флагов I2C или тупого шевеления ногами "медленной шины I2C").

Спасибо! В случае SPI для нескольких микросхем потребуется дешифратор 3-8 для CS и три лини SI, SO, SCK. Получается, что можно и I2C использовать с прерываниями, но лучше еще и с RTOS, если я правильно понял. Про принцип, естественно, слышал, сам использую USART передатчик по прерываниям или через DMA.
Цитата(zltigo @ Dec 16 2016, 14:18) *
Вот именно потому, что она МЕДЛЕННАЯ и следует использовать прерывания, дабы не ждать ожидания транзакции. Причем все точно так же обстоит и с помянутыми Вами SPI и UART.

Спасибо!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 16 2016, 12:11
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Kabdim @ Dec 16 2016, 14:05) *
Если не секрет, можно вопрос? Кнопки циклично опрашиваются или какой-то доп сигнал "прерывание" используете? Какие расширители используете?
Расширители PCA9555PW, 6 микросхем по 16 бит. Да, она имеет вывод прерывания с открытым стоком, выводы прерывания всех микросхем объединены, опрос по прерыванию.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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