Например TDA7294

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





Текущее время: Вт апр 23, 2024 18:48:02

Часовой пояс: UTC + 3 часа


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



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

Зарегистрирован: Пн июл 20, 2009 01: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]
Скачиваний: 385

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

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

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

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


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

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

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


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

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

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


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

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

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

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: Google [Bot] и гости: 25


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

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


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