Например TDA7294

Форум РадиоКот • Просмотр темы - Как выдержать интервал между пакетами на шине i2c
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Вс июл 21, 2019 09:23:27

Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Как выдержать интервал между пакетами на шине i2c
СообщениеДобавлено: Вс фев 11, 2018 16:48:58 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн июл 20, 2009 02:17:05
Сообщений: 23
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
Задача такая. Микроконтроллер STM32F1. На шине i2c две микросхемы датчиков, нужно опрашивать их 16 раз в секунду в фоне, не мешая основной задаче.
Для этого реализовал работу с i2c целиком через прерывания и DMA. На вход подаётся набор опкодов, которые управляют последовательностью действий на шине I2C (START, записать 7-битный адрес, читать N байт и так далее, в конце опкод STOP который на шине выставляет состояние STOP).

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

Далее написал подпрограммы для работы с датчиками. На один датчик просто идёт последовательность чтения/записи регистров, в конце STOP. На второй датчик обмен идёт в два этапа, сначала читаем один регистр, потом STOP, анализируем что получили и в зависимости от этого генерируем новую последовательность опкодов, которую снова запускаем на выполнение.

И так 16 раз в секунду.

По отдельности каждая подпрограмма работает нормально. Проблемы начинаются когда начинаешь их вызывать сразу друг после друга.
Иногда это работает, иногда нет. Причина в том, что последнее прерывание (по которому выполняется опкод STOP и, соответственно, вызов моей подпрограммы) вызывается ДО того, как на шине выставилось состояние STOP. И если я прямо во время этого прерывания "заряжаю" автомат на выполнение следующей последовательности, то периферийный контроллер I2C сбивается с ритма и часто подвисает. То есть, в идеале, после выставления бита STOP в регистре CR1 нужно прождать какое-то время, пока этот STOP реально выполнится, и только после этого начинать следующий обмен по шине.

К сожалению, даташит меня огорчает.
Вложение:
1.jpg [137.33 KiB]
Скачиваний: 152

Как видно, событие (прерывание) EV8_2 вызывается до выставления STOP, а после сигнала STOP никаких событий уже не возникает.

А мне бы хотелось выставить STOP, подождать какое-то время, затем начать следующий цикл обмена. Но такой аппаратной возможности, без тупого ожидания в цикле, я не нашёл. Можно припахать для этого один из таймеров, но хочется обойтись только I2C (библиотека работы с I2C общего плана, не заточенная под конкретный проект).

Кто-нибудь встречался с такой ситуацией?

_________________
С уважением,
Андрей


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выдержать интервал между пакетами на шине i2c
СообщениеДобавлено: Пн фев 12, 2018 05:50:23 
Прорезались зубы

Карма: -6
Рейтинг сообщений: -24
Зарегистрирован: Вт авг 15, 2017 11:51:13
Сообщений: 243
Рейтинг сообщения: 0
А мне бы хотелось выставить STOP, подождать какое-то время, затем начать следующий цикл обмена. Но такой аппаратной возможности, без тупого ожидания в цикле, я не нашёл.

Создать отдельную задачу ОС для опроса по I2C. После STOP задачу ставить на паузу на несколько тиков системного таймера, после чего опрашивать следующее устройство.


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Как выдержать интервал между пакетами на шине i2c
СообщениеДобавлено: Ср фев 14, 2018 22:19:56 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн июл 20, 2009 02:17:05
Сообщений: 23
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
Ну это по сути то же самое, что задействовать ещё один таймер.
В общем, победил я её. Оказывается, между обращениями к разным чипам вовсе не обязательно выставлять на шину сигнал STOP. Достаточно подать повторный START, потом адрес второго чипа и всё отлично работает. Поэтому теперь все запросы к разным чипам идут одной пачкой, между запросами лишь повторный START. Так что на длительность STOP мне теперь уже плевать, он подаётся один в конце.

_________________
С уважением,
Андрей


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y