Перейти к содержанию
    

Вопрос по I2C на STM32F103

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

 

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

Изменено пользователем haker_fox
Уточнил название темы, добавил теги, переместил в нужный раздел.

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


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

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

 

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

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

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


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

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

 

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

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

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

Успехов.

 

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


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

Спасибо. Хотелось услышать людей непосредственно работающих этой штукой. Я то же попробую для начала прерывания (они как то ближе) у а потом ......

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


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

Спасибо. Хотелось услышать людей непосредственно работающих этой штукой. Я то же попробую для начала прерывания (они как то ближе) у а потом ......

Мда, сочуствую: начинать с I2C F103 по прерываниям. Это полная катастрофа...

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


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

KnightIgor, а почему катастрофа?
Присоединяюсь к вопросу. Я сразу начал и с прерываниями и с ПДП и под ОС. Все работет. Что я сделал неправильно?

 

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


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

Мда, сочуствую: начинать с I2C F103 по прерываниям. Это полная катастрофа...

 

А в чем интересно проблема. Поделитесь ПОЖАЛУЙСТА.

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


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

Мда, сочуствую: начинать с I2C F103 по прерываниям. Это полная катастрофа...

Присоединяюсь к вопросу. Я сразу начал и с прерываниями и с ПДП и под ОС. Все работет. Что я сделал неправильно?

А в чем интересно проблема. Поделитесь ПОЖАЛУЙСТА.

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

 

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

 

Но вот совсем не пойму, а какой смысл использовать на медленной шине I2C прием и передачу по прерываниям, и еще DMA для I2C использовать? Поясните в двух словах, если не сложно! :rolleyes:

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


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

А вообще использую интерфейсы UART и SPI
А еще бывают внешние микросхемы, у которых I2C прибит гвоздями. К тому же и UART и SPI - интерфейс "точка-точка" и для опроса нескольких внешних микросхем придется городить огород. У меня на двух проводах I2C висят три заказных индикатора и 124 линии ввода-вывода (кнопки, светодиоды) через расширители, все это разбросано по плате размером с полтора листа A4.

Но вот совсем не пойму, а какой смысл использовать на медленной шине I2C прием и передачу по прерываниям, и еще DMA для I2C использовать?
Про принцип "пустил-забыл" слышали? Передача: дождался освобождения шины, запустил обмен, пошел делать другие дела. Прием: дождался освобождения шины, запустил обмен, жду сигнала от ОС о готовности данных (в это время процессор делает другие полезные дела вместо тупого опроса флагов I2C или тупого шевеления ногами "медленной шины I2C").

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


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

Но вот совсем не пойму, а какой смысл использовать на медленной шине I2C прием и передачу по прерываниям, и еще DMA для I2C использовать? Поясните в двух словах, если не сложно! :rolleyes:

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

 

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


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

... 124 линии ввода-вывода (кнопки, светодиоды) через расширители...

Если не секрет, можно вопрос? Кнопки циклично опрашиваются или какой-то доп сигнал "прерывание" используете? Какие расширители используете?

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


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

А еще бывают внешние микросхемы, у которых I2C прибит гвоздями. К тому же и UART и SPI - интерфейс "точка-точка" и для опроса нескольких внешних микросхем придется городить огород. У меня на двух проводах I2C висят три заказных индикатора и 124 линии ввода-вывода (кнопки, светодиоды) через расширители, все это разбросано по плате размером с полтора листа A4.

Про принцип "пустил-забыл" слышали? Передача: дождался освобождения шины, запустил обмен, пошел делать другие дела. Прием: дождался освобождения шины, запустил обмен, жду сигнала от ОС о готовности данных (в это время процессор делает другие полезные дела вместо тупого опроса флагов I2C или тупого шевеления ногами "медленной шины I2C").

Спасибо! В случае SPI для нескольких микросхем потребуется дешифратор 3-8 для CS и три лини SI, SO, SCK. Получается, что можно и I2C использовать с прерываниями, но лучше еще и с RTOS, если я правильно понял. Про принцип, естественно, слышал, сам использую USART передатчик по прерываниям или через DMA.

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

Спасибо!

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


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

Если не секрет, можно вопрос? Кнопки циклично опрашиваются или какой-то доп сигнал "прерывание" используете? Какие расширители используете?
Расширители PCA9555PW, 6 микросхем по 16 бит. Да, она имеет вывод прерывания с открытым стоком, выводы прерывания всех микросхем объединены, опрос по прерыванию.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

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

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

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

×
×
  • Создать...