Программирование stm32. часть 6: spi

Получение данных датчика на Arduino UNO

Доступ к ячейкам памяти для запроса и чтения данных датчика через интерфейс I2C осуществляется обычным способом. Читатели, которые программировали Arduino для работы с I2C, узнают этапы,а добавленный скетч будет хорошо прокомментирован для облегчения отслеживания работы программы.

Во-первых, для использования библиотеки I2C вам необходим оператор:

Затем вам необходим I2C адрес PIC микроконтроллера. Он программно установлен в коде MPASM для PIC микроконтроллера в строке:

Этот адрес должен быть сдвинут вправо на один бит, чтобы сформировать адрес, который будет использоваться Arduino. Те, кто знаком с 7-разрядной адресацией I2C, узнают этот часто неудобный шаг. Смещение 0x32 вправо даст нам 0x19, и это будет адрес I2C, который используется Arduinio. Конечно, вы можете установить этот адрес в коде MPASM в любое доступное значение для адреса I2C, которое у вас есть.

Чтобы начать обмен, используйте:

Ниже в качестве примера приведены шаги для выдачи команды считывания датчика #2 (значение переменной было установлено в ):

Задержка в последней строке ждет, пока завершится чтение датчика, и, возможно, она длиннее, чем необходимо, но лучше быть осторожным. Вы можете попробовать уменьшить задержку, если это необходимо для вашего приложения.

На этом этапе данные от датчика DHT22 #2 должны быть в -. Чтобы запросить данные, используем следующее:

Сначала прочитаем байт статуса в .

Проверим, равен ли байт статуса (теперь в ) , что указывает на успешность выполнения команды. Затем получим 5 байтов данных DHT (из -) с помощью следующего кода:

После того, как мы поместили эти данные в программный массив -, мы преобразуем данные во влажность (RH) и температуру и, наконец, проверим совпадает ли контрольная сумма:

Два других датчика DHT22 считываются таким же образом, используя соответствующие коды команд.

Приведенный ниже код скетча примера для Arduino просто считывает все три датчика каждые 5 секунд и отображает данные в мониторе последовательного порта.

Вывод на экран в результате работы тестового скетча Arduino

SPI (Serial Peripheral Interface)

Это протокол последовательной связи синхронного типа, который состоит из двух линий данных (MOSI и MISO), одной тактовой линии (SCK) и линии выбора подчиненных (SS).

Перед тем, как двигаться дальше, нужно прояснить значения несколько терминов, которые вы должны знать:

Master (ведущий) — устройство, которое обеспечивает синхронизацию

Slave (ведомый) — устройство, отличное от мастера, использующее тактирование ведущего для связи

MOSI — Master Out Slave In (линия, по которой мастер отправляет данные своим подчиненным)

MISO — Master In Slave Out (линия, по которой ведомые передают ведомому данные в ответ)

SCK – линия тактирования (предоставляется ведущим устройством)

SS — Slave Select (линия, используемая для выбора ведомого устройства, к которому ведущий хочет установить связь)

В случае с SPI в любой момент времени может быть только одно ведущее устройство и несколько других ведомых, которые отвечают только на вызов ведущего. Вся связь обрабатывается самим ведущим; ни один подчиненный не может отправлять данные по своей воле. Ведущий отправляет данные через MOSI, а ведомые отвечают через линию MISO. Во всем процессе SCK (последовательное тактирование) играет очень важную роль, каждое подчиненное устройство зависит от этих часов, чтобы читать данные из MOSI и отвечать через MISO. SS (выбор ведомого) используется для того, чтобы конкретное подчиненное устройство проснулось, с кем мастер хочет общаться. Ниже представлена иллюстрация принципа подключения посредством интерфейса SPI:

Существует несколько регистров, которые используются для реализации связи SPI. Все нижеперечисленные регистры имеют длину 8 бит.

SPDR (регистр данных SPI) используется для хранения одного байта данных, который должен быть передан или получен.

SPSR (регистр состояния SPI) содержит биты состояния, участвующие в передаче SPI.

SPCR (регистр управления SPI) содержит контрольные биты, участвующие в передаче SPI.

Преимущества интерфейса SPI следующие. Во-первых он обеспечивает синхронную последовательную связь, которая намного надежнее асинхронной. Во-вторых, несколько устройств (ведомые устройства) могут быть подключены к одному ведущему устройству. В-третьих, это быстрая форма последовательной связи.

Недостатки SPI следующие. Во-перых, требуется несколько линий выбора ведомых для подключения нескольких подчиненных устройств. Во-вторых, только ведущий контролирует весь процесс коммуникации; никакие подчиненные не могут напрямую связываться друг с другом.

Запуск

Программное обеспечение, необходимое для работы схем, приведено ниже и состоит из исходного кода MPASM для 12F1840, HEX файла для 12F1840 и тестового скетча для Arduino. Вам нужно будет запрограммировать микроконтроллер PIC12F1840. Если вы раньше использовали PIC-контроллеры, это не должно быть сложным. Если вы не знакомы с PIC-контроллерами, то это может показаться сложной задачей. Однако есть много недорогих программаторов, в том числе несколько самодельных разработок, которые получили большую поддержку. Ассемблер MPASM доступен бесплатно от Microchip.

Кроме того, начиная с мелкого PIC-контроллера, такого как 12F1840, задача становится менее сложной, чем может показаться. Вы можете собрать приведенный исходный код MPASM для программирования, как есть, или внести изменения, такие как адрес I2C. В качестве альтернативы, большинство программаторов позволит вам напрямую использовать HEX файл для программирования микроконтроллера.

Реализация пользовательского датчика I2C

PIC12F1840 является примером усовершенствованной 8-разрядной архитектуры среднего класса от Microchip. Это 8-выводный микроконтроллер, который включает в себя большое число функций периферийного устройства. Главной из этих функций периферийного устройства, для данного проекта, является модуль синхронного последовательного интерфейса MSSP (Master Synchronous Serial Port). Эта функция позволяет нам реализовать интерфейс I2C таким образом, что чип будет работать как ведомое устройство I2C. Возможно, самое главное, что программное обеспечение уже сделано для нас в примечании к применению (AN734C). Код из этого примечания к применению составляет основу нашего средства I2C. Он управляется прерываниями и позволит чипу, по сути, работать в качестве 32-байтового массива памяти, позволяющего совершать между ведущим и ведомым устройствами двунаправленные чтение и запись. Прилагаемая программа включает в себя код из примечания к применению, немного измененный для использования на 12F1840.

Ведущее устройство I2C (в этом примере Arduino UNO) будет выдавать команды ведомому устройству I2C путем записи в выбранное место в массиве памяти. PIC, как ведомое устройство I2C, будет выполнять команды (т.е. считывать показания датчиков DHT22) и отправлять назад информацию о состоянии и информацию с датчиков через массив памяти. Затем устройство-мастер считывает массив памяти для извлечения показаний датчиков.

Разница между последовательной и параллельной связью

Как следует из названия, в таком виде данные связи передаются последовательно (один за другим), а не параллельно (все вместе). Таким образом, как и ожидалось, последовательная связь может быть реализована с использованием меньшего количества проводов по сравнению с параллельным методом коммуникации, при этом также требуется какой-то механизм синхронизации (тактирования) для успешной связи. Следует отметить, что в случае последовательных протоколов связи только сама передача данных выполняется последовательно, все остальное, обработка данных и т. п., выполняется параллельно, то есть в виде регистров.

Характеристики

Обе микросхемы обеспечивают преобразование данных из последовательного интерфейса в параллельный 16-разрядный, состоящий из двух 8-разрядных портов. Микросхемы отличаются только типом последовательного интерфейса: МСР23017 имеет интерфейс I2C, a MCP23S17 — интерфейс SPI. Набор внутренних регистров микросхем позволяет сконфигурировать любой вывод порта ввода-вывода. С помощью этих регистров можно задать направление, полярность и тип вывода. Кроме того, данные регистры позволяют создать гибкую систему с различными условиями генерации прерываний. Аппаратные адресные выводы используются для задания адреса самой микросхемы, что позволяет

подключить к одному последовательному интерфейсу одновременно несколько таких микросхем.

Ниже перечислены особенности и основные технические параметры описываемых микросхем:

— наличие двух 8-разрядных дистанционных двунаправленных портов ввода-вывода А и В, которые по умолчанию сконфигурированы как входы;

— скорость работы интерфейса I2C может составлять 100, 400 кГц или 1,7 МГц;

— скорость работы интерфейса SPI может достигать 10 МГц;

— три адресных вывода позволяют использовать до восьми микросхем на одной шине интерфейса;

— допускается конфигурировать выходной сигнал прерывания на выводах INTA и INTB как активный высокий и низкий уровни или открытый сток;

— выходные сигналы прерываний INTAn INTB могут быть сконфигурированы для независимого или совместного обслуживания;

— источник сигнала прерываний конфигурируется с помощью специального регистра и по умолчанию настроен на слежение за изменением сигнала на выводах портов;

— полярность входных данных портов ввода может изменяться с помощью конфигурационного регистра полярности;

— содержит схему сброса при включении питания;

— наличие входа внешнего сброса;

— ток потребления в режиме ожидания не превышает 1 мкА;

— максимальный выходной ток любого вывода составляет 25 мА;

— суммарная максимальная рассеиваемая мощность — 700 мВт;

— диапазон рабочего напряжения от 1,8 до 5,5В;

— температурный рабочий диапазон от -40 до +125°С;

— изготавливаются в 28-выводных корпусах типов PDIP (300 mil), SOIC (300 mil), SSOP и QFN (6×6 мм).

Рис. 1. Архитектура микросхем МСР23017 и MCP23S17

Аппаратное обеспечение

Схема состоит из интерфейса I2C на PIC и трех датчиков DHT22. PIC интерфейс I2C содержит микросхему 12F1840, несколько вспомогательных компонентов, разъем/перемычку (JP1) для подключения платы к ведущему устройству и три дополнительных разъема/перемычки для подключения трех плат датчиков. Четыре контакта на J1 для подключения к Arduino UNO – это +5V, GND, SDA и SCL, линии которых доступны на разъемах платы Arduino. 12F1840 имеет 6 выводов ввода/вывода. Два из этих выводов, RA1 и RA2, образуют линии SDA и SCL для связи по I2C. К этим линиям я подключил подтягивающие резисторы по 10 кОм (R1 и R2), и всё работает хорошо; для своего приложения вы можете подобрать номиналы этих резисторов. Кроме того, может потребоваться полностью убрать эти резисторы, если у вас в вашей системе уже есть подтягивающие резисторы на линиях I2C.

Три вывода ввода/вывода, RA0, RA4 и RA5, подключаются к линиям данных датчиков DHT22 #1, #2 и #3 соответственно. Оставшийся вывод (RA3) не используется и остается неподключенным. При использовании дополнительных схем расширения этот вывод может быть задействован как вход общего назначения или для включения аппаратного сброса (MCLR).

Схема для платы PIC I2C

Перечень элементов для платы PIC I2C
Компонент Описание
U1 PIC 12F1840
C1 Конденсатор 0,1 мкФ
R1, R2 Резистор 10 кОм
J1, DHT1-3 4-пиновый разъем/перемычка
Кабели 3 x 4-пиновый

Каждый из датчиков монтируется на отдельной плате с намерением разместить их на некотором расстоянии друг от друга и подключить к плате I2C с помощью 4-контактных кабелей. Поскольку на DHT22 можно использовать только 3 из 4 контактов, вы можете использовать 3-контактные кабели и разъемы.

Датчик температуры и влажности воздуха DHT22 или AM2302. Выводы: 1 – Vdd, 2 – данные, 3 – не подключен, 4 – GND.

Платы датчиков также относительно просты, содержат только датчик DHT22, подтягивающий резистор на линии данных и конденсатор развязки на линиях питания.

Схема платы одного датчика DHT22. Для каждого из трех датчиков требуется отдельная плата

Перечень элементов для платы датчика
Компонент Описание
DHT22 Датчик DHT22
C1 Конденсатор 0,1 мкФ
R1 Резистор 4,7 кОм
J1 4-пиновый разъем/перемычка

Данный проект разрабатывался для работы с напряжением 5 вольт, но я также протестировал его при питании от 3,3 вольт, и всё отлично работало, поскольку это напряжение находится в рабочем диапазоне как микроконтроллера PIC, так и DHT22.

Чтение показаний датчика влажности и температуры DHT22

Работа по считыванию показаний датчиков DHT22 и хранение их в массиве памяти также ложится на микроконтроллер PIC. Низкая цена, доступность и относительная надежность DHT22 сделали его использование повсеместным. Однако последовательный протокол, который используется этим чипом, требует очень точной временно́й работы. Эти требования к синхронизации могут стать проблемой для систем, использующих относительно медленный ввод/вывод, и для систем (например, микросхем систем на кристалле, SoC), чьи многочисленные высокоприоритетные функции могут сделать требуемые выделения времени неудобными. В этом отношении имеет смысл «разгрузить» работу на отдельную микросхему.

Связь с датчиком осуществляется через специальный «однопроводный» последовательный протокол, который не следует путать с однопроводным протоколом от Dallas/Maxim semiconductor – они совершенно разные. В данной связи задействованы три соединения (Vcc, GND и данные). Вывод данных – это место, где происходят все манипуляции, и тщательное прочтение технического описания даст более подробную информацию.

Вкратце, следующие шаги описывают взаимодействие со стороны PIC микроконтроллера, необходимое для считывания датчика, а прилагаемая программа MPASM была подробно прокомментирована для облегчения прослеживания действий программы:

  1. Установить линию данных в режим выхода, установить на ней низкий уровень и ждать 18 микросекунд.
  2. Установить на линии данных высокий уровень на 30 микросекунд.
  3. Установить линию данных в режим входа и мониторить её состояние. DHT22 должен установить на ней низкий уровень на 80 микросекунд, а затем высокий уровень на 80 микросекунд.
  4. Шаги 1-3 являются преамбулой к потоку данных. Затем DHT22 установит на линии данных низкий уровень на 50 микросекунд, что сигнализирует о старте бита данных.
  5. Теперь всё становится немного сложнее. После времени стартового бита DHT22 установит на линии данных высокий уровень либо на ~27 микросекунд, либо на 70 микросекунд. Первый сигнал соответствует биту данных ‘0’, а второй сигнал – биту данных ‘1’.
  6. После передачи бита данных (шаг 5 выше) DHT22 перейдет к следующему 50-микросекундному стартовому биту, за которым следует следующий бит данных (либо ‘0’, либо ‘1’, как описано в шаге 5), и эта последовательность повторяется для 40 битов, составляющих 5 байтов данных датчика (влажность целая часть, влажность часть после десятичной запятой, температура целая часть, температура часть после запятой и контрольная сумма).

Вы можете видеть, что протокол требует точной синхронизации, и что время считывания датчика является переменным значением в том смысле, что оно зависит от количества битов ‘0’ и ‘1’ в чтении. Одна из стратегий состоит в том, чтобы измерить каждый из интервалов и затем решить, соответствует ли бит данных интервалу ‘0’ или ‘1’. Я выбрал другую стратегию, описанную ниже, которая менее требовательна и очень надежна.

Стратегия распознавания битов ‘0’ и ‘1’ в последовательном потоке

После преамбулы мы ждем окончания времени стартового бита, затем ждем около 43 микросекунд, после чего считываем состояние линии данных. Если на линии данных уровень низкий, то бит был равен ‘0’, и мы находимся во времени передачи следующего стартового бита. В этом случае мы записывает бит как ‘0’ и ждем окончания времени стартового бита перед чтением следующего бита данных. Если на линии данных уровень высокий, то бит был равен ‘1’, и мы всё еще находимся во времени передачи бита данных. В этом случае, мы записываем бит как ‘1’ и ждем начала времени следующего стартового бита, затем ждем окончания времени стартового бита перед чтением следующего бита данных.

Когда PIC микроконтроллер закончит считывание запрошенного датчика DHT22, данные будут доступны для чтения через интерфейс I2C. В этом случае будет считан как , что указывает на успешное завершение последней команды.

Протокол обмена с микросхемами

Обращение к микросхемам по последовательному интерфейсу осуществляется путем передачи нескольких байт. Первый байт несет информацию о коде операции, включающим в себя адрес микросхемы и режим обращения (чтение или запись). Второй передаваемый байт содержит адрес внутреннего регистра микросхемы. Третий байт содержит байт данных.

Микросхема МСР23017 с интерфейсом PC поддерживает 7-разрядную адресацию. Восьмой разряд данных в управляющем байте определяет режим обращения к микросхеме. Он имеет обозначение R/W и инициирует режим чтения (R) или записи (W) при установке соответственно уровня лог. 1 или лог. О в этом разряде. Передача данных на шине всегда начинается со стартового условия S и заканчивается стоповым условием Р, которые показаны на рис. 2.

Для подтверждения приема данных используется девятый бит квитирования, имеющий название АСК. Микросхема MCP23S17 с интерфейсом SPI поддерживает байтовый обмен данными и имеет вход выбора кристалла CS, наличие низкого уровня сигнала на котором разрешает обращение к ней. Формат управляющего байта данных для интерфейса PC представлен на рис. 3, а для интерфейса  SPI — на рис. 4.

Как видно из рисунков, адрес микросхем состоит из двух частей — неизменной части 0100, представляющей собой старшую часть двоичного адреса, и переменной младшей части адреса, определяемой состоянием разрядов А2, А1 и АО. При совпадении их значений адреса и значения сигналов, установленных на адресных выводах микросхемы, последняя будет откликаться на него.Адресация внутренних регистров микросхем производится с помощью адреса, передаваемого во втором байте. Формат первого и второго байтов для интерфейсов PC и SPI представлен на рис. 5 и 6 соответственно.

Таблица 1. Назначение выводов микросхем МСР23017 и MCP23S17

Условные обозначения: 1 — ввод, О — вывод, Р — питание.

Рис. 2. Передача данных на шине

Рис. З. Формат управляющего байта данных для интерфейса I2С

Рис. 4. Формат управляющего байта данных для интерфейса SPI

Рис. 5. Формат первого и второго байтов для интерфейса I2С

Рис. 6. Формат первого и второго байтов для интерфейса SPI

UART / USART

UART означает универсальный асинхронный приемник и передатчик, а USART – универсальный синхронный и асинхронный приемник и передатчик. Разница между ними заключается в том, что UART выполняет только асинхронную последовательную связь, в то время как USART может выполнять как синхронный, так и асинхронный последовательный коммуникационный процесс.

Для асинхронного режима этот протокол использует только два провода, а именно Rx и Tx. Поскольку здесь не нужна синхронизация, оба устройства должны использовать свои независимые внутренние системы тактирования для функционирования. Тем не менее, существует термин «скорость передачи», который помогает этим устройствам оставаться в режиме синхронизации, фиксируя скорость обмена данными. Скорость передачи данных в бодах равно число бит данных, передаваемое в секунду, поэтому оба устройства должны работать с одинаковой скоростью передачи в бодах, чтобы поддерживать его надлежащее функционирование.

Интерфейс UART/USART имеет большое ограничение, связанное с тем, что только два устройства могут обмениваться данными с помощью этого протокола одновременно. Линия Tx одного устройства передает данные на лннию Rx другого устройства и аналогично Tx последнего передает данные в Rx первого устройства. Так происходит обмен данными.

Для синхронного режима используется дополнительный вывод XCK. Импульсы тактирования генерируются устройством, отправляющим данные в это время.

Преимущества UART/USART следующие. Во-первых, этот протокол обеспечивает как синхронную, так и асинхронную последовательную связь. Во-вторых, обеспечивается наличие различных скоростей передачи, что делает его пригодным для широкого применения и устройств. В-третьих, это одна из самых простых форм последовательной связи. Недостатком здесь является то, что одновременно могут быть подключены только два устройства.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Семинар по технике
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: