Робототехника и интеллектуальные системы
Как использовать протоколы I2c и Spi с микроконтроллерами Pic
Table of Contents
Введение в I2C и SPI с микроконтроллерами PIC
Микроконтроллеры из семейства PIC Microchip широко используются во встроенных системах, от простых сенсорных узлов до сложных промышленных контроллеров. Ключевой навык для любого встроенного разработчика — это возможность интерфейсировать периферийные устройства с использованием последовательных коммуникационных протоколов. Два из наиболее распространенных — I2C (Inter-Integrated Circuit) и SPI (Serial Peripheral Interface). Освоение этих протоколов позволяет подключать датчики, чипы памяти, дисплеи, ADC и многие другие устройства к вашему дизайну PIC с минимальной проводкой и высокой надежностью.
В этой статье представлено практическое, глубокое руководство по внедрению I2C и SPI на микроконтроллерах PIC. Мы рассмотрим настройку оборудования, настройку реестра, типичные последовательности кода и общие методы отладки. К концу вы будете иметь знания, чтобы уверенно добавлять последовательную связь в ваш следующий проект PIC.
Обзор I2C и SPI
Оба протокола являются синхронными последовательными шинами, но отличаются архитектурой, скоростью и применением.
I2C (межинтегральная схема)
I2C использует только два провода: SDA (Serial Data) и SCL (Serial Clock). Каждое устройство на шине имеет уникальный 7-битный или 10-битный адрес, а связь является мастер-рабской. Мастер генерирует часы и инициирует транзакции. Несколько мастеров могут совместно использовать шину с арбитражем. Стандартный режим работает на частоте 100 кГц, быстрый режим на частоте 400 кГц и высокоскоростной режим до 3,4 МГц. I2C идеально подходит для периферийных устройств, которые не требуют скорости пламени, таких как датчики температуры, часы реального времени, EEPROM и небольшие дисплеи.
Поскольку требуется только два провода, I2C сохраняет контакты ввода-вывода, что делает его привлекательным для небольших PIC. Однако протокол более сложен, чем SPI, из-за адресации, распознавания битов и растяжения часов.
SPI (Serial Peripheral Interface)
SPI использует четыре линии: MOSI (Master Out Slave In), MISO (Master In Slave Out), SCLK (Slave Select) и SS (Slave Select). Это полнодуплексная шина — данные отправляются и принимаются одновременно. Мастер генерирует часы и выбирает раба, вытягивая его чип-выбор (SS) pin низко. SPI значительно быстрее I2C, со скоростями в десятки МГц, и является протоколом выбора для высокопроизводительных устройств, таких как SD-карты, графические дисплеи, ADC и цифровые потенциометры.
SPI проще реализовать в аппаратном обеспечении, но требует больше контактов - одна выделенная линия SS на раба. Многие микроконтроллеры PIC включают в себя выделенный модуль Master Synchronous Serial Port (MSSP), который может быть настроен для I2C или SPI.
Оборудование для I2C и SPI
Прежде чем погрузиться в код, вы должны правильно подобрать оборудование.
Резисторы с подтягиванием: Линии I2C являются открытыми; они требуют внешних резисторов с подтягиванием (обычно от 4,7 кОм до 10 кОм) для притяжения SDA и SCL к VDD. Значение зависит от емкости шины и скорости. Для длинных автобусов или быстрого режима могут потребоваться более низкие значения резисторов для удовлетворения спецификаций времени подъёма.
Уровни напряжения: Убедитесь, что ваш PIC и периферийное устройство работают при одном и том же логическом напряжении (например, 3,3 В или 5 В). Если они отличаются, используйте сдвигатели уровней, такие как SparkFun BOB-12009 или простую схему MOSFET.
Длина шины и емкостная нагрузка: Для более длинных проводов (выше нескольких дюймов) сохраняйте емкость шины ниже максимальной, указанной в вашей таблице данных PIC (]PIC16F1xxx часто указывает 400 pF для I2C. Для SPI более длинные линии могут вызывать отражения сигнала; используйте более медленные тактовые частоты и экранированные кабели, если это необходимо.
Разъединяющие конденсаторы: Поместите 0,1 мкФ конденсаторы рядом с каждым из контактов мощности ИС, чтобы подавить шум, который может повредить данные.
Конфигурация I2C на микроконтроллерах PIC
Большинство современных PIC включают модуль Master Synchronous Serial Port (MSSP) , который поддерживает как I2C, так и SPI. Мы сосредоточимся на MSSP в режиме I2C для типичного 8-битного PIC (например, PIC16F18877).
Ключевые регистры для I2C
- SSPxADD — значение перезагрузки генератора скорости Бода. Часовая частота I2C получена из системных часов по формуле: FSCL = FOSC / (4* (SSPxADD + 1)). Для 100 кГц с осциллятором 16 МГц SSPxADD = 39.
- SSPxSTAT — Регистр состояния. Биты указывают на столкновение шины, пишут столкновение и было ли обнаружено условие запуска/остановки.
- SSPxCON1 — Регистр управления 1.Выбирает режим I2C (master, slave) и включает модуль.
- SSPxCON2 — Управление режимом мастера.Командировки для отправки Пуск, Перезагрузка, Остановка и подтверждение.
- SSPxBUF — буфер данных. Пишите для отправки, читайте для получения.
I2C Мастер инициализации последовательность
- Отключите модуль MSSP, очистив бит SSPEN (SSPxCON1<5>).
- Установите режим работы I2C (обычно 0x08 в SSPxCON1 битах <3:0>).
- Настройте скорость бода, загрузив SSPxADD с соответствующим значением.
- Настройка SDA и SCL-штипов в качестве входов со слабыми подтягивающими устройствами (или использование внешних резисторов).
- Включите модуль, установив SSPEN.
- Опционально включить прерывания для MSSP.
Пример: Чтение с датчика температуры LM75
LM75 имеет 7-битный адрес (обычно 0x48 для заземленных контактов A0-A2). Для чтения регистра температуры (указатель 0x00) необходимо сначала записать указатель, затем сгенерировать повторный запуск и прочитать.
Написать последовательность указателей: Начать → адрес байт (0x90) → ждать ACK → указатель байт (0x00) → ждать ACK → Стоп.
Читать последовательность температур: Начать → адрес байт (0x91] → ждать ACK → читать два байта (MSB, LSB) → НАСК на последнем байте → Стоп.
Каждый байт-обмен требует опроса регистра SSPxSTAT на бит BF (Buffer Full) и флаг прерывания SSPxIF. Распространенной ошибкой является забывание отправить ACK/NACK после получения данных. Используйте биты ACKDT и ACKEN в SSPxCON2 для контроля распознавания.
Типичные подводные камни I2C
- Часы растягиваются: Некоторые рабы удерживают SCL низко, чтобы замедлить хозяина.Включить поддержку растяжения часов в MSSP (установить CKP бит соответствующим образом).
- Автоматическое столкновение: Если другой мастер пытается управлять автобусом, MSSP устанавливает флаг BCLIF.
- Застрявший автобус: Если раб не выпускает SDA после передачи, автобус может повиснуть. Введите тайм-аут, который посылает девять тактовых импульсов для восстановления.
Конфигурация SPI на микроконтроллерах PIC
MSSP также может работать в режиме SPI master или slave. Мы рассмотрим режим master, который является наиболее распространенным.
Ключевые регистры для SPI
- SPIxBRG — генератор скорости Бода.Для SPI тактовая частота — FOSC / (2* (SPIxBRG + 1)).
- SPIxSTAT — Регистр состояния. Содержит бит BF, записывает столкновение, принимает флаги переполнения.
- SPIxCON1 — Регистр управления 1.Выбирает мастер/раб, полярность часов (CKP), фазу часов (CKE) и точку выборки (SMP).
- SPIxCON2 — Дополнительное управление (например, режим кадра, включение SS2).
- SPIxBUF — буфер данных для передачи и приема (буфер).
SPI Master инициализация последовательность
- Отключите модуль SPI (четкий SSPEN).
- Установите желаемую полярность и фазу часов. Режим 0 (CKP=0, CKE=1) является наиболее распространенным: данные отбираются на восходящем краю и смещаются на падающем краю.
- Настройка скорости бод в SPIxBRG. Для 1 МГц с часами 16 МГц SPIxBRG = 7.
- Выберите мастер-режим (SSPM биты = 0b0000 для SPI мастера, часы = FOSC/4).
- На многих PIC-файлах SS-пин является выделенным входом в мастер-режиме. Для выбора раба необходимо переключать отдельный GPIO-пин, подключенный к чипу-выбору раба.
- Включите модуль.
Пример: взаимодействие с 8-канальным ADC MCP3008
MCP3008 представляет собой 10-битный ADC, который обменивается данными через SPI в режиме 0. Для чтения канала (например, канала 0) мастер отправляет три байта: стартовый бит, одноконечный/дифференциальный бит и адрес канала. Раб одновременно возвращает два байта данных.
Последовательность транзакций:
1.
2.
2. Напишите 0x01 (стартовый бит) на SPIxBUF — ждите, пока бит BF прояснится.
3. Напишите (канал | 0x80) на SPIxBUF — прочитайте первый байт мусора из предыдущей передачи.
4. Напишите 0x00 (думка) на SPIxBUF — прочитайте высокие 8 бит результата конверсии.
5. Напишите 0x00 снова — прочитайте низкие 2 бита и спусковые нули.
6. Нажмите SS high.
Обратите внимание, что каждая запись в SPIxBUF запускает одновременный прием. Вы должны прочитать буфер после каждой записи, чтобы избежать переполнения.
Управление несколькими рабами SPI
Каждый раб требует уникального чип-выборного штифта. Используйте один GPIO на раба. Убедитесь, что существует небольшая задержка между изменением штифта SS и запуском часов для удовлетворения требований времени установки раба. Многие PIC позволяют использовать аппаратный штифт SS для автоматического генерирования раба-выбора только в рабовом режиме; в мастер-режиме вы должны делать это вручную.
Отладка I2C и SPI связи
Если что-то не работает, следуйте методическому подходу:
- Используйте логический анализатор или осциллограф. Это единственный наиболее эффективный инструмент отладки. Проверьте, что часы присутствуют, происходят переходы данных и адреса верны. Для I2C проверьте условия запуска/остановки и признайте биты.
- Проверьте резисторы вытягивания. Если SDA или SCL остаются низкими, у вас может быть устройство, удерживающее шину. Отключите всех рабов, кроме одного, и попробуйте снова.
- Проверить скорость бод. Измерить тактовый сигнал с размахом. Для I2C тактовая частота должна быть в пределах спецификации раба.
- Исследуйте адрес и байты команд. Распространенной ошибкой является отправка 7-битного адреса без смещения его налево (бит R/W идет в LSB).
- Для SPI, проверьте полярность и фазу часов. Многие рабы чувствительны к точному режиму. Проконсультируйтесь с таблицей данных раба. Также убедитесь, что линия выбора чипа активна низко и приводится в движение соответственно.
Если отладка оборудования выявляет правильные формы волн, проблема может быть в вашей прошивке. Используйте отладочные светодиоды или последовательную консоль для печати регистров состояния. Многие платы разработки PIC включают встроенный программист / отладчик (например, MPLAB PICkit 4), который может помочь вам пройти через код.
Программное обеспечение Bit-Banging как резервное копирование
Если аппаратная периферия недоступна или если вам необходимо использовать PIC, в котором отсутствует MSSP, вы можете реализовать I2C или SPI в программном обеспечении с использованием GPIO-пинов. Для I2C-бит-бандинга вы переключаете SDA и SCL напрямую, соблюдая задержки времени. Для SPI вы переключаете биты через GPIO и одновременно читаете входной штифт. Bit-banging является гибким, но потребляет циклы процессора и медленнее. Это также хороший способ изучить протокол на низком уровне.
Продвинутые темы
I2C Multi-Master и настройка скорости часов
Когда несколько мастеров совместно используют шину, вы должны тщательно обрабатывать арбитраж. MSSP в PIC поддерживает режим мультимастера; он контролирует шину и откажется от управления, если другой мастер отправляет данные. Используйте прерывание столкновения шины (BCLIF) для обнаружения потери арбитража и повторного использования после случайной задержки.
Для более быстрого I2C (например, 400 кГц) включить управление скоростью разбиения на выходных штифтах (если таковые имеются) и использовать более сильные резисторы подтягивания (например, 2,2 кОм). Некоторые PIC имеют выделенный SSPxADD, который может быть установлен на значения меньше нуля с помощью прескалера.
SPI Daisy-Chaining и DMA
Некоторые устройства SPI поддерживают цепочку daisy, где выход данных (MISO) одного устройства подает вход (MOSI) следующего. Это позволяет нескольким рабам с одной линией выбора чипа. MSSP может обрабатывать цепочку daisy, если устройства поддерживают ее.
Для высокоскоростного SPI рассмотрите возможность использования контроллера прямого доступа к памяти (DMA) PIC (доступного на многих новых PIC). DMA может передавать данные в / из буфера SPI без вмешательства процессора, освобождая ядро для других задач. Периферийное устройство DMA настроено с источником, назначением и счетом, а затем срабатывает прерыванием SPI.
Заключение
I2C и SPI являются важными инструментами в любом наборе встроенных дизайнеров. С гибким модулем MSSP, найденным в большинстве микроконтроллеров PIC, реализация этих протоколов проста, как только вы понимаете параметры настройки реестра и временные параметры. Всегда начинайте с простого теста - фиктивного цикла записи / чтения - для проверки вашей аппаратной и программной основы.
Данные остаются вашим лучшим другом: официальные таблицы данных Microchip предоставляют точные карты регистров и диаграммы времени. Примечания приложений, такие как AN734 (советы I2C) и AN1009 (использование SPI) (использование SPI) являются ценными ресурсами. Практикуйтесь с платой разработки и логическим анализатором, и вы быстро обретете уверенность в добавлении любого периферийного I2C или SPI в ваши проекты на основе PIC.