Внедрение i2c с микроконтроллером efm8

Внедрение i2c с микроконтроллером efm8
Внедрение i2c с микроконтроллером efm8
Anonim

Внедрение I2C с помощью микроконтроллера EFM8

Узнайте, как создать интерфейс I2C с помощью периферийного устройства Silicon Labs SMBus.

Вспомогательная информация

  • Введение в шину I2C
  • Шина I2C: сведения о реализации оборудования
  • Шина I2C: информация о внедрении встроенного ПО
  • Серия EFM8 от Silicon Laboratories

Помощь от выделенного оборудования

Если вы прочитали статьи, перечисленные в разделе «Поддержка информации», вы хорошо знаете, что I2C является относительно сложным протоколом, который требует подробных процедур связи и конкретной конфигурации схемы. Тем не менее, I2C широко распространен, и это справедливо, потому что взамен этой сложности он обеспечивает гибкую, надежную последовательную связь с низким числом контактов между несколькими независимыми интегральными схемами. Это правда, что проектирование интерфейса I2C «с нуля» - как низкоуровневое аппаратное обеспечение или чистая прошивка - будет немного обременительным; к счастью, однако, бесчисленные микроконтроллеры от многочисленных производителей включают периферийные устройства, которые значительно облегчают реализацию I2C. В этой серии из двух статей мы подробно обсудим, как включить связь I2C в прошивку, написанную специально для микроконтроллера EFM8, хотя представленные здесь концепции и код применимы к другим устройствам Silicon Labs. Кроме того, нетрудно адаптировать эту информацию к любому другому микроконтроллеру - в конце концов, I2C - это стандартизованный протокол, который не зависит от одного производителя к другому.

Настройка оборудования

Мы реализуем I2C с использованием периферийного устройства SMBus, которое поддерживает оба протокола (SMBus на самом деле является расширением I2C, как обсуждалось в предыдущей статье). Микроконтроллеры часто работают в качестве мастеров I2C, поэтому основная функция будет сосредоточена на нашей работе, но подчиненные функции могут быть встроены в аналогичную прошивку. Этот захват экрана из Simplicity Studio обобщает периферийную конфигурацию SMBus:

Image
Image
  • Источник для последовательных часов выбирается как Timer1, а затем Timer1 настроен на частоту переполнения 100 кГц.
  • SMBus включен.
  • В этой конкретной системе мы хотим, чтобы все было максимально простым, так что «полное обнаружение тайм-аута», «обнаружение тайм-аута SCL» и «установка и удержание времени» все отключены (вы можете прочитать об этих функциях в справочных руководствах EFM8, например, этот).
  • «Запрет ведомого» включен, поскольку в этой системе EFM8 функционирует только как ведущий. Вам необходимо отключить эту функцию, если вы хотите, чтобы EFM8 генерировал прерывание, когда другое устройство на шине пытается адресовать EFM8 в качестве ведомого.
  • Свойства ведомого адреса не изменяются, потому что этот пример не включает подчиненные функции. Если вы хотите, чтобы EFM8 функционировал как подчиненный, а не (или в дополнение к) ведущему, вы должны установить адрес, который мастер-устройство будет использовать для установления связи с EFM8. (Обратитесь к справочному руководству для объяснения функций «общий вызов» и «маска адреса».)
  • «Аппаратное подтверждение» отображается как отключенное, хотя во многих случаях его проще включить. Когда включено, периферийное устройство SMBus будет генерировать ACK или NACK без вмешательства в прошивку в реальном времени, когда EFM8 адресуется как подчиненный или когда он получает байт во время операции master / read. Дополнительная информация об функциональности подтверждения аппаратного обеспечения приведена в конце этой статьи.
  • Функция «Время удержания окна обнаружения открытия» позволяет вам изменять параметры синхронизации, применяемые к обнаружению стартового бита. Это можно использовать для компенсации основных несоответствий импеданса между линиями часов (SCL) и данных (SDA). В большинстве случаев такая компенсация не требуется.

Теперь, когда периферийное устройство настроено, нам нужно включить SMBus0 в перекладине, чтобы SCL и SDA были подключены к выводам ввода / вывода. Оба вывода должны быть сконфигурированы для ввода / вывода с открытым стоком, как показано ниже:

Image
Image

Эта конкретная вырез показывает, какие контакты будут назначены SCL и SDA, если вы также включили периферийное устройство SPI.

Флаг

Как обсуждалось в предыдущей статье, транзакции I2C должны соответствовать определенной последовательности событий. Поэтому неудивительно, что Silicon Labs ожидает, что вы реализуете I2C-связь в виде конечного автомата: каждое событие ведет прошивку из одного состояния в другое, а код, выполняемый на каждом этапе транзакции, определяется значением переменной состояния. Это достаточно интуитивно понятно, но важно понять то, что может быть не сразу очевидным, а именно, что флаг прерывания SMBus является доминирующим фактором в работе конечного автомата. Флаг прерывания функционирует как светофор, управляющий взаимодействием между прошивкой, перемещающейся с востока на запад, и аппаратными средствами, идущими с севера на юг:

  • Оборудование SMBus устанавливает флаг прерывания после каждого события в транзакции.
  • Когда флаг установлен, аппаратное обеспечение удерживает SCL на логическом минимуме, что по сути является «неактивным» тактовым состоянием, поскольку SDA разрешено переходить, когда SCL низкий. Таким образом, автобус остается «остановленным», пока установлен флаг.
  • Прошивка, связанная с I2C, выполняется во время этого «застопорившегося» состояния; эта умная компоновка гарантирует, что процессор выполнит свои задачи до того, как шина снова активируется со следующим нарастающим фронтом SCL. Даже медленные процессоры или длинные подпрограммы прошивки не являются проблемой этой методики, потому что (как обсуждалось здесь в отношении «синхронизации часов») протокол I2C предназначен для поддержки расширенных периодов с тактовой частотой.
  • Флаг прерывания SMBus должен быть очищен прошивкой; на самом деле, действие установки бита флага на ноль - это то, что инициирует следующее аппаратное событие в транзакции I2C. Вот почему очистка бит флагов - это последняя команда, выполняемая в блоке кода, назначенной каждой части конечного автомата.

Поток

В своих справочниках EFM8 Silicon Labs предоставляет некоторые очень полезные диаграммы состояний и событийных последовательностей. Начнем с операции master / write:

Image
Image

Диаграмма идентифицирует каждое событие и связанное с ним прерывание в типичной транзакции I2C; буквы-в-синих кругах соответствуют кодовым блокам, описанным в соответствующей блок-схеме состояния-машины (см. ниже). Все байты данных передаются от ведущего к ведомому, поэтому каждый ACK генерируется ведомым. Вот почему прерывания одинаковы независимо от того, включена ли аппаратная ACK или отключена - мастер не генерирует никаких ACK в операции master / write.

Image
Image

(Примечание. В некоторых, возможно, и всех справочных руководствах EFM8 на этой диаграмме есть опечатка, указывающая, что бит R / W должен быть установлен на 1 вместо 0 для операции записи. Вышеприведенная диаграмма исправлена.) Взгляните на эту блок-схему, которая очень информативна. Опять же, обратите внимание, что за каждым аппаратным событием в транзакции следует прерывание, и, следовательно, каждое прерывание соответствует переходу из одного состояния в другое. Ключом к эффективному, чистому и надежному I2C-коду является конечный автомат, управляемый событиями прерывания: процедура обслуживания прерывания вызывается, когда установлен флаг прерывания, а затем оператор switch используется для выполнения блока кода, соответствующего текущему состоянию сделки. Окончательный оператор в каждом блоке кода сбрасывает бит флага прерывания до нуля, тем самым инициируя следующее аппаратное событие.

Ниже приведена последовательность событий для операции master / read:

Image
Image

Обратите внимание на разницу в том, когда генерируются прерывания: если аппаратная ACK включена, прерывание генерируется после того, как мастер (автоматически) генерирует ACK или NACK на основе существующего состояния бит ACK / NACK в управляющем регистре SMBus; действие, требуемое прошивкой в этом случае, - это сохранение полученного байта при подготовке к следующему байту. Если аппаратное ACK отключено, прерывание генерируется сразу после получения последнего бита байта данных. Бит «ACK request» в регистре управления SMBus установлен, чтобы указать, что требуется микропрограммное обеспечение, и в ответ прошивку должно записать соответствующее значение бит ACK / NACK. Затем выполнение продолжается с сохранением полученного байта и сбросом флага прерывания.

Вот блок-схема ведущего / чтения:

Image
Image

Обратите внимание на отличия здесь: 1) R / W установлен как высокий, а не низкий; 2) мастер считывает (а не записывает) регистр данных SMBus; и 3) мастер управляет ответом ACK / NACK, чтобы подтвердить, что байт был успешно принят (через ACK) или указать, что больше данных не требуется (через NACK). В справочных руководствах EFM8 также представлены последовательности событий и блок-схема для ведомых функций.

Вывод

Мы рассмотрели наиболее важные характеристики периферийного устройства SMBus / I2C EFM8, и мы также установили основополагающие концепции для разработки эффективного, надежного интерфейса прошивки I2C. Часть 2 будет более подробно изучать разработку кода; будет предоставлен пример кода для основных функций I2C, и мы рассмотрим трассировку области для сигналов SCL и SDA.

Следующая статья в серии: Внедрение I2C с микроконтроллером EFM8, часть 2