Цей підручник, який я дав на конференції Embedded Linux, намагається відповісти на запитання, надаючи посилання на більш детальний опис розглянутих тем та використовуючи практичний приклад управління 4WD безпілотником, де Arduino Mini Pro діє як раб і керує 4 незалежними колесами . Оригінальний документ можна знайти тут .
Примітка. Ця відповідь наразі триває, оскільки я адаптую основні моменти за посиланням.
Типові програми шини I2C
- Взаємодія з відносно повільними периферійними пристроями. Наприклад: датчики, механічні приводи.
Контроль «швидких» периферійних пристроїв, які використовують інші канали для обміну даними. Наприклад: кодеки.
На ПК операційна система, як правило, взаємодіє через I2C з:
- вимірювачі температури та напруги акумулятора;
- регулятори швидкості вентилятора;
- аудіокодеки.
У разі наявності декількох контролерів шини периферійні пристрої групуються за швидкістю, так що швидкі не караються повільнішими.
Швидке ознайомлення з шиною I2C - основні функції
- Серійна шина.
- Тільки 2 рядки: Serial CLock і Serial DAta (плюс земля).
- 4 швидкості: 100 кГц, 400 кГц, 1 МГц, 3,2 МГц.
- Як правило, 1 головний пристрій і 1 або більше рабів.
- Зв'язок завжди ініціюється головним пристроєм.
- На одній шині може співіснувати кілька майстрів (мультимайстер).
- Відкритий злив: і SDA, і SCL потребують підтягуючих резисторів.
- "Розтягування годинника"
- Головний керує SCL, але підлеглий може утримувати його (тому що відкритий злив), якщо йому потрібно регулювати швидкість.
- Майстер повинен перевірити цей сценарій.
- Раб може застрягнути і заклинити шину: потребує скидання ліній від ведучого до раба.
- Зазвичай підтримується 7-бітна адресація, але також 10-бітна.
- Логічний протокол: фактичні рівні напруги не задаються і залежать від окремих реалізацій. Вихід: 1,8 В / 3,3 В / 5,0 В
Довідкові URL-адреси:
Приклад конфігурації шини
Характеристики протоколу (спрощено)
- 2 типи повідомлень: читання та запис
- Біт пуску / зупинки - в решті відповіді представлений як "[" і "]"
- Адреса: 7 або 10 біт
- Біт R / W: R = 1 / W = 0 Використовується для розмежування типу надісланого повідомлення.
- Дані про шину: (Адреса << 1 | R / W)
- Реєструється як обробник інформації в межах вибраного пристрою.
Приклад руху автобусів
Нестандартні раби
Навіщо створювати користувацький підлеглий I2C?
- Бажаний датчик / привід недоступний з інтерфейсом I2C.
- Менш унікальних адрес, ніж потрібних рабів.
- Бажана спеціальна функціональність на підлеглому:
- Напівавтомні реакції на подразники.
- Фільтрація / попередня обробка вхідних даних.
- Оптимізація потужності: спеціальний "датчик-концентратор" веде господарство, поки основний процесор не працює.
- Відповідь у реальному часі на входи.
- [ваша фантазія тут]
Як спроектувати користувацький I2C раб?
- Визначте вимоги (див. Попередній слайд).
- Виберіть мікроконтролер або мікропроцесор.
- Виберіть Планувальник або Операційну систему (якщо такі є).
- Визначте підпротокол зв'язку:
- Визначте параметри та команди для обміну.
- Впорядкуйте їх у «регістри» та виберіть безкоштовну адресу.
Дизайн майстра I2C
Основні критерії дизайну:
- Вага / розміри
- Необхідна обчислювальна потужність і середня затримка.
- Пристрій, подібний до ПК
- Вбудований пристрій, як правило, без голови.
- Бажана мова програмування: інтерпретується vs компілюється.
- Наявність автобусів / gpios для водіння раба (ів):
- Тільки GPIO: бітбанг протоколу
- I2C: програма для користувальницького простору та драйвер ядра.
- Немає доступних інтерфейсів GPIO / I2C: адаптер USB до I2C.
Налагодження: розділити і перемогти
Безпосередньо керуйте шиною за допомогою спеціального пристрою. Приклади:
АВТОБУС-Пірат
- В першу чергу для цілей розвитку.
- Можна як нюхати автобус, так і їздити на ньому.
- Інтерфейс консолі через послідовний порт (ttyACM), включаючи макроси або програмний доступ для декількох мов програмування.
- Вбудовані резистори та джерела напруги (5 В / 3.3 В)
- Підтримується безліч інших протоколів.
- Список літератури: Вікіпедія , головна сторінка
Адаптер USB до I2C
- Маленький слід.
- Підходить для постійних установок.
- Не потрібно спеціальних з'єднань на хості: його можна використовувати для взаємодії з типовим ПК.
- Доступний варіант, який також підтримує SPI.
- Немає консольного інтерфейсу, лише послідовний двійковий протокол.
- Потрібно протокол обгортки .
- Довідка: протокол
сигрок і пульс-огляд
логотип sigrok (резервний компонент)
приклад імпульсного перегляду (візуалізатор)
Приклад логічного аналізатора низького рівня
- Фактично стандарт для вимірювань, керованих ПК на linux (але доступний і на інших ОС).
- Підтримка широкого спектру логічних аналізаторів, приладів та лічильників.
- Різні декодери протоколів, включаючи I2C.
- Корисно для візуалізації логічних сигналів та налагодження помилок протоколу.
- Навіть дуже низький рівень, недорогий HW може надати зовсім новий вимір для налагодження.
- Посилання: сигрок , імпульсний перегляд , підтримуване обладнання
Приклад: керування безпілотником 4WD
Прототип побудований за допомогою 2 Arduino Mini Pro.
Що робить раб у прикладі?
Раб I2C:
- Контролює кількість крутного моменту, прикладеного до кожного колеса.
- Керує напрямком обертання кожного колеса.
- Вимірює швидкість обертання кожного колеса через оптичний кодер (Одометр).
- Розкриває вище параметри майстру I2C.
Блок-схема високого рівня I2C Slave.
- Достатньо шпильок / функцій для кожного колеса:
- 1 вихід ШІМ з незалежною конфігурацією робочого циклу.
- 1 GPIO для реєстрації вводу одометра як IRQ.
- 2 GPIO для вибору:
- Вперед
- Зворотний
- Холостий
- Блокування
- Блок I2C HW для керованих обміном i2c обмінів.
- Виділені штифти для програмування на основі SPI.
- Маленький слід.
- Низька вартість.
- Макет дошки клону, зображеного на малюнку, оптимізований для встановлення на розетці DIL.
Специфічний для рабовласницького МКБ: AVR Dragon
- RTOS: попередження, завдання, семафори, динамічний тик системи тощо.
- Невеликий слід: посилання використовує лише код / дані.
- Відмінність RTOS від BSP через HAL.
- GPLv3 для некомерційного використання.
- Активно розвинений, але вже зрілий.
- Підтримує 8-бітний AVR.
Однак у нього була обмежена підтримка BSP для AVR, відсутність: - перериває драйвер для відеореєстраторів AVR (додано). - Підтримка I2C для підлеглого режиму 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
Приклад - у піратському форматі шини
[i2c_addr reg_addr = (парм, колесо) 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
Машина крутиться за годинниковою стрілкою.