В этом уроке, который я дал на конференции по встраиваемым Linux-системам, мы пытаемся ответить на вопросы, предоставляя ссылки на более подробное описание затронутых тем и используя практический пример вождения беспилотника 4WD, где Arduino Mini Pro действует как подчиненный и управляет 4 независимыми колесами , Оригинальный документ можно найти здесь .
Примечание. Этот ответ в настоящее время находится в стадии разработки, так как я адаптирую основные моменты по ссылке.
Типичные области применения шины I2C
- Взаимодействие с относительно медленной периферией. Пример: датчики, механические приводы.
Управление «быстрыми» периферийными устройствами, которые используют другие каналы для обмена данными. Пример: кодеки.
В ПК операционная система обычно взаимодействует через I2C с:
- измерители температуры и напряжения батареи;
- регуляторы скорости вращения вентиляторов;
- аудиокодеки.
При наличии нескольких контроллеров шины периферийные устройства группируются по скорости, поэтому быстрые не наказываются более медленными.
Краткое введение в шину I2C - ключевые особенности
- Серийный автобус.
- Всего 2 линии: Serial CLock и Serial DAta (плюс заземление).
- 4 скорости: 100 кГц, 400 кГц, 1 МГц, 3,2 МГц.
- Как правило, 1 ведущее устройство и 1 или более подчиненных.
- Связь всегда инициируется ведущим устройством.
- Несколько мастеров могут сосуществовать на одной шине (multi-master).
- Open-Drain: SDA и SCL нужны подтягивающие резисторы.
- «Растяжка часов»
- Мастер контролирует SCL, но ведомый может удерживать его (потому что открыт сток), если ему нужно отрегулировать скорость.
- Мастер должен проверить этот сценарий.
- Раб может застрять и заклинить шину: требуется сброс линий от мастера до раба.
- Обычно поддерживается 7-битная адресация, но также и 10-битная.
- Логический протокол: фактические уровни напряжения не указаны и зависят от отдельных реализаций. Пример: 1,8 В / 3,3 В / 5,0 В
URL ссылки:
Пример конфигурации шины
Характеристики протокола (упрощенно)
- 2 типа сообщений: чтение и запись
- Бит Старт / Стоп - обозначается как «[« и «]» в остальной части ответа
- Адрес: 7 или 10 бит
- R / W bit: R = 1 / W = 0 Используется для определения типа отправленного сообщения.
- Данные по шине: (Адрес << 1 | R / W)
- Регистрируется как обработчик информации в выбранном устройстве.
Пример движения автобусов
Таможенные Рабы
Зачем создавать кастомное ведомое устройство I2C?
- Требуемый датчик / привод недоступен с интерфейсом I2C.
- Доступно меньше уникальных адресов, чем требуется для рабов.
- Желаемый пользовательский функционал на ведомом устройстве:
- Полуавтономные реакции на раздражители.
- Фильтрация / предварительная обработка входных данных.
- Оптимизация энергопотребления: настраиваемый «датчик-концентратор» выполняет уборку, пока основной процессор не используется.
- Реакция в реальном времени на входы.
- [ваше воображение здесь]
Как спроектировать кастомное ведомое устройство I2C?
- Определите требования (см. Предыдущий слайд).
- Выберите микроконтроллер или микропроцессор.
- Выберите Планировщик или Операционную систему (если есть).
- Определить коммуникационный подпротокол:
- Определите параметры и команды для обмена.
- Организуйте их в «реестры» и выберите бесплатный адрес.
Дизайн Мастера I2C
Ключевые критерии дизайна:
- Вес / Размеры.
- Требуемая вычислительная мощность и средняя задержка.
- ПК-подобное устройство
- Встроенное устройство, как правило, без головы.
- Предпочитаемый язык программирования: интерпретируется и компилируется.
- Наличие автобусов / gpios для вождения раба (ов):
- Только для GPIO: протокол bitbang
- I2C: приложение пользовательского пространства против драйвера ядра.
- Нет доступных интерфейсов GPIO / I2C: переходник USB-I2C.
Отладка: разделяй и властвуй
Возьмите прямой контроль над автобусом с помощью специального устройства. Примеры:
АВТОБУС Пират
- В первую очередь для целей развития.
- Можно и понюхать автобус, и водить его.
- Консольный интерфейс через последовательный порт (ttyACM), включая макросы, или программный доступ для нескольких языков программирования.
- Встроенные подтягивающие резисторы и источники напряжения (5 В / 3,3 В)
- Поддерживает множество других протоколов.
- Рекомендации: Википедия , главная страница
USB-адаптер I2C
- Маленький след.
- Подходит для постоянных установок.
- Нет необходимости в специальных соединениях на хосте: его можно использовать для взаимодействия с обычным ПК.
- Доступен вариант с поддержкой SPI.
- Нет консольного интерфейса, только последовательный двоичный протокол.
- Требуется оболочка протокола .
- Ссылка: протокол
сигрок и пульсвью
Сигрок (бакенд компонент) логотип
Pulseview (визуализатор) пример
Пример младшего логического анализатора
- Де-факто стандарт для измерений на компьютере под управлением Linux (но доступен и для других ОС).
- Поддержка широкого спектра логических анализаторов, областей применения и счетчиков.
- Различные протоколы декодирования, в том числе I2C.
- Полезно для визуализации логических сигналов и ошибок протокола отладки.
- Даже очень дешевый HW может предложить совершенно новое измерение для отладки.
- Рекомендации: сигрок , Pulseview , поддерживаемое оборудование
Пример: управление дроном 4WD
Прототип построен с использованием 2 Arduino Mini Pro.
Что делает раб в примере?
I2C раб:
- Управляет величиной крутящего момента, приложенного к каждому колесу.
- Управляет направлением вращения каждого колеса.
- Измеряет скорость вращения каждого колеса через оптический энкодер (одометр).
- Предоставляет вышеуказанные параметры мастеру I2C.
Блок-схема высокого уровня ведомого устройства I2C.
- Достаточно штифтов / функций для каждого колеса:
- 1 ШИМ-выход с независимой конфигурацией рабочего цикла.
- 1 GPIO для регистрации входа одометра в качестве IRQ.
- 2 GPIO для выбора:
- Вперед
- Обратный
- вхолостую
- Замок
- Блок I2C HW для управляемых прерываниями обменов i2c.
- Выделенные контакты для программирования на основе SPI.
- Маленький след.
- Бюджетный.
- Макет платы клона, представленной на рисунке, оптимизирован для монтажа на DIL-разъем.
- ОСРВ: приоритет, задачи, семафоры, динамические системные тики и т. Д.
- Небольшая площадь: ссылка только на используемый код / данные.
- Различие между ОСРВ и BSP через HAL.
- GPLv3 для некоммерческого использования.
- Активно развивается, но уже зрелый.
- Поддерживает 8 бит AVR.
Однако он имел ограниченную поддержку BSP для AVR, отсутствие: - драйвера прерываний для AVR GPIO (добавлено). - Поддержка I2C для режима ведомого AVR (пользовательский). Который должен был быть разработан отдельно как часть Drone SW для AVR .
Определение параметров связи
Для каждого колеса:
Рабочий цикл сигнала ШИМ, используемого для его управления, - 1 байт. 0xFF = максимальный крутящий момент / 0x00 = нет крутящего момента.
Направление вращения - 1 байт.
- 0x00 = простаивает
- 0x01 = обратный
- 0x02 = вперед
- 0x03 = заблокирован
Средний период между слотами оптического кодера - 2 байта.
- Запись чего-либо сбрасывает измерение.
Индекс параметра - 1 клев:
- 0 = рабочий цикл
- 1 = Направление
- 2 = Средний период
Колесные индексы - 1 клев:
- 0 = левый тыл
- 1 = правый задний
- 2 = правая передняя
- 3 = Левый передний
- 4 = все
Субпротокол: определение регистров
Формат регистра: 0xαβ
- α = индекс параметра - β = индекс колеса
Адрес (выбран произвольно): 0x10
Шинный пиратский формат:
- [= начальный бит -] = конечный бит - r = считанный байт - времена адреса 2 (сдвиг влево 1), для бита R / W
Пример - в формате Bus Pirate
[i2c_addr reg_addr = (parm, wheel) reg_value]
[0x20 0x20 0x02] Left Rear Forward
[0x20 0x21 0x01] Right Rear Backward
[0x20 0x22 0x01] Right Front Backward
[0x20 0x23 0x02] Left Front Forward
[0x20 0x14 0xFF] Wheels set to max torque
Машина вращается по часовой стрелке.