Открытый сток
Определяющей особенностью I2C является то, что каждое устройство на шине, должно подключаться к линиям тактового сигнала (сокращенно SCL) и сигнала данных (сокращенно SDA) через выходные драйверы с открытым стоком (или открытым коллектором). Давайте посмотрим, что это на самом деле означает. Сначала рассмотрим типовой CMOS (инвертирующий) выходной каскад:
Если на входе присутствует высокий логический уровень, NMOS транзистор открыт, а PMOS транзистор закрыт. Таким образом, выход имеет низкоомное соединение с землей. Если на входе присутствует низкий логический уровень, ситуация меняется на противоположную, а выход имеет низкоомное соединение с VDD. Это называется двухтактным выходным каскадом, хотя это название не особенно информативно, поскольку оно не подчеркивает низкое сопротивление соединений, которые управляют выходом. В общем случае вы не можете напрямую соединять два двухтактных выхода, поскольку ток будет свободно протекать от VDD до земли, если на одном выходе выдается логическая единица, а на другом – логический ноль.
Теперь рассмотрим схему с открытым стоком:
PMOS транзистор был заменен резистором, внешним по отношению к микросхеме. Если на входе присутствует высокий логический уровень, NMOS транзистор обеспечивает низкоомное соединение с землей. Но если на вход подается низкий логический уровень, NMOS транзистор выглядит как разомкнутая цепь, а это означает, что выход подтягивается к VDD через внешний резистор. Такой механизм приводит к двум важным отличиям. Во-первых, появляется неочевидное рассеивание мощности, когда на выходе низкий логический уровень, поскольку ток протекает через резистор, через канал NMOS транзистора на землю (в двухтактной схеме этот ток блокируется высоким сопротивлением закрытого PMOS транзистора). Во-вторых, выходной сигнал ведет себя по-другому, когда на выходе высокий логический уровень, так как выход подключен к VDD через гораздо более высокое сопротивление (обычно не менее 1 кОм). Эта особенность позволяет напрямую соединять два (и более) устройства с открытым стоком: даже если на одном из них низкий логический уровень, а на другом – высокий логический уровень, то подтягивающий резистор гарантирует, что ток не протекает свободно от VDD на землю.
Некоторые последствия использования на шине схемы с открытым стоком:
- Сигналы всегда по умолчанию находятся в состоянии логической единицы. Напримем, если ведущее устройство I2C пытается связаться с ведомым устройством, которое вдруг перестало функционировать, сигнал данных никогда не войдет в неопределенное состояние. Если ведомое устройство не управляет сигналом, то он будет считан как логическая единица. Аналогично, если ведущее устройство выключается в середине передачи, линии SCL и SDA вернутся в состояние логической единицы. Другие устройства могут определить, что шина доступна для новых передач, наблюдая, что и SCL, и SDA находятся в состоянии логической единицы в течении определенного периода времени.
- Любое устройство на шине может безопасно приводить сигналы в состояние логического нуля, даже если другое устройство пытается привести их в состояние логической единицы. Это является основой функции «тактовой синхронизации» или «растяжки тактового сигнала» на шине I2C: ведущее устройство генерирует последовательность тактовых импульсов, но при необходимости ведомое устройство может удерживать линию SCL на низком уровне и тем самым уменьшать тактовую частоту.
- Устройства с различными напряжениями питания могут сосуществовать на одной и той же шине, пока устройства с более низким напряжением не будут повреждены более высоким напряжением. Например, устройство 3,3 В может связываться с устройством 5 В, если SCL и SDA подтянуты до 5 В – схема с открытым стоком приводит к тому, что высокий логический уровень достигает напряжения 5 В, хотя устройство 3,3 В с типовым двухтактным каскадом не может управлять линией 5 В.
функция analogRead ()
Arduino может определить, есть ли напряжение на одном из его выводов, и сообщить об этом через функцию digitalRead (). Существует разница между датчиком включения / выключения (который обнаруживает присутствие объекта) и аналоговым датчиком, значение которого постоянно изменяется. Чтобы прочитать этот тип датчика, нам нужен другой тип булавки.
В правой нижней части платы Arduino вы увидите шесть выводов с пометкой «Analog In». Эти специальные контакты показывают не только напряжение, приложенное к ним, но и его значение. Используя функцию analogRead ()
, мы можем прочитать напряжение, приложенное к одному из выводов.
Эта функция возвращает число от 0 до 1023, которое представляет напряжения от 0 до 5 вольт. Например, если на вывод № 0 подается напряжение 2,5 В, analogRead (0) возвращает 512.
HAL_SPI модуль
Для программирования SPI HAL определяет С структуру SPI_HandleTypeDef:
Давайте проанализируем наиболее важные поля данной структуры.
- Instance: указатель на дескриптор SPI, который мы будем использовать. Например, SPI1 — это дескриптор первого SPI интерфейса.
- Init: объект C структуры SPI_InitTypeDef, которая используется для настройки интерфейса, далее мы рассмотрим ее более подробно.
- ptxBuffPtr, pRxBuffPtr: указатели на временные буферы для принимаемых и отправляемых данных SPI. Они используются, когда SPI работает в режиме прерывания и не могут быть изменены из программы пользователя.
- hdmatx, hdmarx: указатели на объекты DMA_HandleTypeDef структуры, используемой, когда SPI работает в режиме с DMA.
Настройка SPI производится с использованием объекта структуры SPI_InitTypeDef:
- Mode: параметр, определяющий в каком режиме, master или slave работает SPI интерфейс. Может принимать два значения SPI_MODE_MASTER и SPI_MODE_SLAVE.
- Direction: параметр, задающий работу SPI интерфейса либо в 4-проводном режиме (2 отдельные линии для входных и выходных данных соответсвенно), либо в 3-проводном режиме (одна I/O линия). Может принимать следующие значения: SPI_DIRECTION_2LINES или полнодуплексный 4-проводной режим; SPI_DIRECTION_2LINES_RXONLY или полудуплексный 4-проводной режим; SPI_DIRECTION_1LINE или полудуплексный 3-проводной режим.
- DataSize: параметр, задающий размер данных, передаваемых по шине SPI. Может принимать два следующих значения: SPI_DATASIZE_8BIT и SPI_DATASIZE_16BIT.
- CLKPolarity: настройка SCK CPOL, принимает значения SPI_POLARITY_LOW (CPOL=0) и SPI_POLARITY_HIGH (CPOL=1).
- CLKPhase: настройка фазы тактового сигнала SCK, принимает также два значения SPI_PHASE_1EDGE (CPHA=0) и SPI_PHASE_2EDGE (CPHA=1).
- NSS: параметр, задающий поведение линии NSS. Принимает значения SPI_NSS_SOFT для программного управления NSS, SPI_NSS_HARD_INPUT и SPI_NSS_HARD_OUTPUT для настройки NSS сигнала в аппаратном режиме.
- BaudRatePrescaler: делитель частоты шины APB, определяет максимальную тактовую частоту линии SCK. Может принимать значения SPI_BAUDRATEPRESCALER_2, SPI_BAUDRATEPRESCALER_4,…,SPI_BAUDRATEPRESCALER_256.
- FirstBit: параметр, определяющий порядок передачи данных по шине SPI: SPI_FIRSTBIT_MSB или SPI_FIRSTBIT_LSB.
- TIMode: включение/выключение режима поддержки протокола TI. Значения: SPI_TIMODE_DISABLE или SPI_TIMODE_ENABLE.
- CRCCalculation и CRCPolynomial: во всех микроконтроллерах STM32 SPI периферия может аппаратно генерировать CRC контрольную сумму. Значение CRC может передаваться последним байтом в режиме передачи или автоматическая проверка на ошибку CRC может быть произведена с последним принятым байтом данных. Значение CRC вычисляется с использованием нечетного программируемого многочлена на каждом бите. Вычисление происходит на определяемом параметрами CPHA и CPOL фронте тактовой частоты каждой выборки. Вычисленное CRC проверяется автоматически в конце блока данных. Когда появляется ошибка между вычисленным значением CRC от принятых данных и CRC, переданной от передающего устройства, устанавливается состояние ошибки. CRC не доступно в режиме работы SPI с DMA в циклическом режиме. Для более подробной информации рекомендуется ознакомиться с референс мануалом на конкретный микроконтроллер.
Как обычно, для конфигурации SPI мы используем функцию:
HAL_StatusTypeDef HAL_SPI_Init (SPI_HandleTypeDef * hspi);
которая принимает в качестве входного параметра указатель на объект структуры SPI_HandleTypeDef, рассмотренной выше.
Основные характеристики подтягивающих резисторов Arduino
Основные характеристики резисторов это:
- Сопротивление (единица измерения — Ом, и кратные единицы – КилоОм, МегаОм);
- Мощность (единица измерения — Вт);
- Точность или допуск (единица измерения — %).
Сопротивление — это величина сопротивления проводника, к которому проложено напряжение в 1 Вольт и течет ток в 1 Ампер.
Допуск – отклонение сопротивления от номинала в результате технологической погрешности при изготовлении.
Мощность способность преобразовать в тепловую определенное количество электрической энергии при прохождении тока через резистор. Формула имеет вид: P= I2 x R.
Закон Ома
Закон Ома позволяет на заданном участке цепи определить одну из величин:
силу тока I, напряжение U, сопротивление R,
если известны две остальные:
Для обозначения напряжения наряду с символом U используется V.
Рассмотрим простую цепь
Расчитаем силу тока, проходящего через резистор R1
и, соответственно, затем через лампу L1. Для простоты будем предполагать,
что сама лампа обладает нулевым собственным сопротивлением.
Аналогично, если бы у нас был источник питания на 5 В и лампа, которая по
документации должна работать при токе 20 мА, нам нужно бы было выбрать
резистор подходящего номинала.
В данном случае, разница в 10 Ом между идеальным номиналом и имеющимся не играет большого значения:
можно смело брать стандартный номинал — 240 или 220 Ом.
Аналогично, мы могли бы расчитать требуемое напряжение, если бы оно было не известно, а на руках
были значения сопротивления и желаемая сила тока.
Разница между SPI, I2C и UART тремя протоколами последовательной шины:
Первый, разница, конечно же, в названии:
SPI (последовательный периферийный интерфейс: последовательный периферийный интерфейс);
UART (универсальный асинхронный приемный передатчик: универсальный асинхронный приемный передатчик)
Во-вторых, разница заключается в линии электрического сигнала:
Шина SPI состоит из трех сигнальных линий Состав: последовательные часы (SCLK), последовательный вывод данных (SDO), последовательный ввод данных (SDI). Шина SPI может соединять несколько устройств SPI друг с другом. Устройство SPI, которое обеспечивает последовательные часы SPI, является ведущим или ведущим SPI, а другие устройства являются ведомыми или ведомыми (ведомыми) SPI. Полнодуплексная связь может быть реализована между ведущими и ведомыми устройствами.При наличии нескольких ведомых устройств может быть добавлена строка выбора ведомого устройства.
Если вы используете универсальный порт ввода-вывода для имитации шины SPI, у вас должен быть выходной порт (SDO), входной порт (SDI), а другой порт зависит от типа реализованного устройства.Если вы хотите реализовать устройство ведущее-ведомое, вам понадобится порт ввода и вывода. , Если реализовано только ведущее устройство, порта вывода достаточно; если реализовано только ведомое устройство, требуется только порт ввода.
Шина I2C — это стандарт двустороннего, двухпроводного (SCL, SDA), последовательного интерфейса и интерфейса с несколькими ведущими устройствами.Он имеет механизм арбитража шины и очень подходит для передачи данных между устройствами на короткие расстояния и нечасто. В его системе протокола адрес устройства-получателя всегда переносится при передаче данных, поэтому может быть реализована сеть устройств.
Если порт ввода-вывода общего назначения используется для имитации шины I2C и достижения двунаправленной передачи, требуется порт ввода-вывода (SDA), а также порт вывода (SCL). (Примечание: данные I2C относительно плохо изучены, описание здесь может быть очень неполным)
Шина UART — это асинхронный последовательный порт Следовательно, он, как правило, намного сложнее, чем структура первых двух синхронных последовательных портов. Он обычно состоит из генератора скорости передачи (генерируемая скорость передачи в 16 раз больше скорости передачи), приемника UART и передатчика UART. На оборудовании есть два провода: один для отправки, а другой для приема.
Очевидно, что если универсальный порт ввода-вывода используется для моделирования шины UART, требуются один входной порт и один выходной порт.
В-четвертых, посмотрите на мнение быдла!
Wudanyu: Количество линий I2C меньше. Я думаю, что он более мощный, чем UART и SPI, но технически более проблематичный, потому что I2C требует поддержки двунаправленного ввода-вывода и Используйте подтягивающий резистор , Я думаю, что способность к помехам слабая, обычно используется для связи между чипами на одной плате и меньше используется для междугородной связи. Реализация SPI проще. UART требует фиксированной скорости передачи данных, что означает, что интервал между двумя битами данных должен быть одинаковым. SPI не имеет значения, потому что это синхронизированный протокол.
Quickmouse: скорость I2C немного ниже, чем у SPI, и протокол немного сложнее, чем SPI, но соединение меньше, чем у стандартного SPI.
Источник
Интерфейс
В SPI используются четыре цифровых сигнала:
- MOSI или SI – выход ведущего, вход ведомого (англ. Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому;
- MISO или SO – вход ведущего, выход ведомого (англ. Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
- SCK или SCLK – последовательный тактовый сигнал (англ. Serial CLocK). Служит для передачи тактового сигнала для ведомых устройств.
- CS или SS – выбор микросхемы, выбор ведомого (англ. Chip Select, Slave Select).Как правило, выбор микросхемы производится низким логическим уровнем.
В зависимости от комбинаций полярности и фазы синхроимпульсов возможны четыре режима работы SPI..
Хотя приведенные выше имена контактов являются наиболее популярными, в прошлом иногда использовались альтернативные соглашения об именовании контактов, поэтому имена контактов портов SPI для более старых продуктов IC могут отличаться от тех, которые представлены ниже:
Режим SPI | Временная диаграмма |
Режим SPI0
Активные уровень импульсов — высокий. |
|
Режим SPI1
Активные уровень импульсов — высокий. |
|
Режим SPI2
Активные уровень импульсов — низкий. |
|
Режим SPI3
Активные уровень импульсов — низкий. |
В таблице принято:
- MSB — старший бит;
- LSB — младший бит.
Мастеру приходится настраиваться на тот режим, который используется ведомым.
При обмене данными по интерфейсу SPI микроконтроллер может работать как ведущий (режим Master) либо как ведомый (режим Slave). При этом пользователь может задавать следующие параметры:
- режим работы в соответствии с таблицей;
- скорость передачи;
- формат передачи (от младшего бита к старшему или наоборот).
Синхронизация в SPI
Частота следования битовых интервалов в линиях передачи данных определяется синхросигналом SCK, который генерирует ведущее устройство, ведомые устройства используют синхросигнал для определения моментов изменения битов на линии данных, при этом ведомые устройства никак не могут влиять на частоту следования битовых интервалов. Как в ведущем устройстве, так и в ведомом устройстве имеется счетчик импульсов синхронизации (битов). Счетчик в ведомом устройстве позволяет последнему определить момент окончания передачи пакета. Счетчик сбрасывается при выключении подсистемы SPI, такая возможность всегда имеется в ведущем устройстве. В ведомом устройстве счетчик обычно сбрасывается деактивацией интерфейсного сигнала SS..
Так как действия ведущего и ведомого устройства тактируются одним и тем же сигналом, то к стабильности этого сигнала не предъявляется никаких требований, за исключением ограничения на длительность полупериодов, которая определяется максимальной рабочей частотой более медленного устройства. Это позволяет использовать SPI в системах с низкостабильной тактовой частотой, а также облегчает программную эмуляцию ведущего устройства.