Интерфейс передачи данных spi. Последовательный интерфейс SPI (3-wire). Временная диаграмма сигналов

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

Аккумуляторы Li-Ion.

В современных электронных устройствах массово используются литий-ионные (Li-Ion) аккумуляторы различных форм и размеров.
Независимо от типоразмера все они имеют схожие характеристики и по большому счету отличаются лишь емкостью.
Как правило, встречаются аккумуляторы с номинальным напряжением 3,7 Вольт (хотя бывют и на 3,8 Вольт).
Li-Ion аккумуляторы на 3,7 В нельзя заряжать выше напряжения 4,23 В и нельзя разряжать ниже 2,5 В, в противном случае возникнет необратимый процесс и элемент останется только выбросить. Разряжать и заряжать аккумулятор можно до любого значения (он не обладает эффектом памяти), лишь бы напряжение находилось в диапазоне от 2,5 до 4,23 В. Однако полностью разряженный аккумулятор следует как можно скорее зарядить, чтобы он преждевременно не утратил свою емкость.
Также литий-ионные аккумуляторы отличаются друг от друга наличием защиты. Аккумулятор может быть без электронной защиты (просто гальванический элемент), а может иметь встроенную схему, которая защищает элемент от чрезмерного разряда, перезаряда и перегрева.
Но как-бы вы ни оберегали и ни следили за состоянием аккумулятора, емкость его со временем будет неуклонно падать. Чем выше температура эксплуатации и больше циклов заряда-разряда производится, тем быстрее аккумулятор стареет.

Литий-ионный аккумулятор 18650.

Аккумуляторы 18650 из батареи ноутбука

18650 — это обозначение наиболее часто встречающегося Li-Ion аккумулятора, размеры которого немного больше обычной пальчиковой батарейки (18×65 мм). Все что относится к аккумулятору 18650, применимо и к другим литий-ионным аккумуляторам!
Типоразмер аккумуляторов 18650 часто используется в мощных фонариках, лазерах, различной электронике. Из элементов 18650 собраны аккумуляторные батареи ноутбуков, некоторых шуруповертов и даже электромобилей.
Если вы покупаете фирменный аккумулятор, то он скорее всего имеет встроенную электронную защиту. Дешевые же китайские аккумуляторы, заказанные например на Aliexpress, не имеют защиты. Кроме того их ёмкость обычно в несколько раз ниже заявленной.

Измерение емкости аккумулятора 18650.

Емкость литий-ионных аккумуляторов обычно обозначается в миллиампер-часах (mAh). Если на вашем элементе 18650 есть надпись вида «1800» или «2200», это и есть его заявленная емкость. Более корректно измерять емкость в Ватт-часах, но при маркировке элементов указывают исключительно миллиампер-часы.
Для измерения емкости АКБ, зарядки и прочих изысканий существует множество специальных устройств в широком ценовом диапазоне. Наиболее известное из них, IMAX, стоит порядка 2000 рублей. Такая покупка оправдает себя, только если вы ежедневно занимаетесь зарядкой аккумуляторов разных типов.

Бюджетный вариант измерения ёмкости литий-ионного аккумулятора.

Ради чего все затевалось? Аккумулятор моего ноутбука стал очень быстро разряжаться. Как правило, аккумуляторная батарея состоит из 6 элементов 18650. Если даже один элемент выйдет из строя, это сказывается на работоспособности батареи в целом. Поэтому я решил выяснить, емкость какого из элементов уменьшилась, чтобы заменить его на новый. Элементы из батареи из ноутбука, а также большинство бюджетных аккумуляторов типоразмера 18650 не имеют индивидуальной защиты, поэтому при работе с ними нельзя допускать сильного разряда или перезаряда.

Порядок работы

  1. Перед замером емкости исследуемый элемент 18650 следует отсоединить от других элементов схемы и полностью зарядить (до 4,23 В). Посмотрел у китайцев недорогие зарядные устройства и по отзывам понял, что по причине их низкого качества многие люди уже испортили свои аккумуляторы. Для своих же целей я купил самый дешевый Powerbank. Это коробка с электронным преобразователем на 1 или несколько аккумуляторов 18650, которая кроме прямого назначения позволяет заряжать аккумулятор до напряжения 4,23 В и разряжать до 2,5 В.
    Для зарядки достаточно поставить внутрь Powerbank аккумулятор и подключить его к обычной зарядке от мобильного телефона.
  2. Когда аккумулятор полностью зарядился, отключаем Powerbank от телефонной зарядки.
    Аккумулятор готов для замера емкости. Что нам теперь нужно, так это купленные на том же Aliexpress USB-тестер (220 рублей) и нагрузочный резистор (50 рублей).
    Просто подключаем USB-тестер одним концом к Powerbank, а другим — к нагрузочному резистору . Будьте внимательны при покупке, USB-тестеры бывают разные. Некоторые USB-тестеры показывают только ток и напряжение, но нам нужен тот, который кроме в добавок к ним измеряет еще и емкость !

Несколько фотографий и небольшой обзор USB-тестера в конце статьи

Измерение емкости аккумулятора без измерительных приборов.

Схема самодельного USB-тестера, измерение емкости Li-ion аккумулятора 18650

Намеревался узнать емкость аккумулятора вышеописанным способом, но пришедший через 2 месяца из Китая USB-тестер оказался неисправным, поэтому решил измерить емкость без измерительных приборов.
К счастью Powerbank у меня уже был. Устройство его таково, что с одной стороны он не дает разрядить аккумулятор ниже допустимого напряжения, а с другой, поддерживает постоянные 5 Вольт на своем выходе. Если подключить к выходу 5 Вольт резистор величиной 5 Ом, то получим ток разряда 1 ампер. И эта величина теоретически должна поддерживаться на протяжении всего времени разряда. Ток (1 А) и напряжение (5 В) известны, осталось засечь время. Чтобы не сидеть час с таймером в руке, к выходу Powerbank параллельно пятиомному резистору следует присоединить обычный бытовой электромеханический будильник (часы). Но часам требуется 1,5 вольта (напряжение пальчиковой батарейки), а у нас целых 5. Поэтому подключаем часы через делитель напряжения, состоящий из двух резисторов — 470 и 1070 Ом. Если у вас есть мультиметр, можно вместо этих резисторов использовать переменный резистор на 470 Ом — 1,5 кОм, выставив на входе часов 1,5-1,8 Вольт.
Итак, ставлю стрелки на 12:00 и подключаю балласт с часами к Powerbank. Через некоторое время аккумулятор разрядится до 2,5 Вольт. Powerbank при этом отключается, часы останавливаются и стрелки запечатлевают время. В моем случае время разряда составило 50 минут (50 мин/60= 0,83 часа).

Теперь вычисляем емкость аккумулятора.
Если бы мы хотели рассчитать емкость Powerbank, как самостоятельного устройства, просто перемножили бы ток и время: 1А*0,83ч=0,83 Ач или 830 миллиампер-часа.
Но нам нужно знать емкость аккумулятора 18650 , поэтому следует умножить результат на соотношение напряжения Powerbank (U.pwb) к номинальному напряжению элемента 18650 (U.акб). Вдобавок, для более точного результата всё разделим на коэффициент полезного действия преобразователя Powerbank, равный примерно 0,95.
С учетом вышесказанного окончательная формула вычисления емкости аккумулятора примет вид:

I * t * U.pwb / U.акб / КПД = 1А * 0,83ч * 5В / 3,7В / 0,95 = 1.18 Ач (1180 миллиампер-час)

Наблюдения и поправки.

В ходе эксперимента обнаружилось возникновение пульсаций, мешающих работе часов. Поэтому параллельно их входу (на место батарейки) пришлось припаять конденсатор. Емкость, при которой схема работает стабильно — 100 микрофарад (можно больше), напряжение конденсатора любое, но не меньше 5 вольт.
Во время разряда балластный резистор величиной 5 Ом раскаляется выше 100 градусов, поэтому не хватайтесь за него. Паяйте схему так, чтобы этот резистор не касался корпуса Powerbank’a или конденсатора, иначе они расплавятся.
Если хотите, чтобы разряд шел быстрее, используйте 2 резистора по 5 Ом спаянных параллельно, ток в этом случае удвоится а время разряда вдвое сократится. На видео в ускоренном режиме продемонстрирована работа часов с шаговым двигателем, которые тоже оказались китайскими и в лежачем положении периодически заклинивали. Для дальнейших для опытов подключил советские часы с маятниковым механизмом, которые работают абсолютно стабильно.
Для удобства можно рассчитать цену деления циферблата в соответствии со своей схемой и разметить шкалу в Амер-часах и/или в Ватт-часах. В этом случае на часах всегда будет готовый результат и дополнительные расчеты никогда не понадобятся.

Небольшой обзор USB-тестера

Итак, краткий обзор USB-тестера купленного в Китае через сайт Aliexpress — всё что удалось заснять до его выхода из строя.

После получения и распаковки решил проверить работоспособность тестера. Для этого подключил его между зарядным устройством и смартфоном. Можно увидеть, что при этом устройство показывает напряжение, ток, текущую потребляемую мощность, время работы и израсходованную энергию (Ватт-час). Для замера емкости аккумулятора достаточно включить USB-тестер между аккумулятором и нагрузочным резистором, после полного разряда аккумулятора USB-тестер отключится и измеренная емкость сохранится в его памяти. Однако дальше теории дело не пошло, т.к. тестер оказался бракованным. При подключении нагрузки в 5 Ом, что соответствует 1 амперу, устройство перестало отображать ток и прочие подлежащие замеру параметры, хотя заявленный допустимый ток нагрузки — 3 Ампера. В конце видеоролика демонстрируется работа мышки, подключенной к ноутбуку через USB-тестер. Здесь тестер уже в неисправном состоянии. Ранее замеренный им же ток мышки составлял от 10 до 30 миллиампер для состояния покоя и активности соответственно, теперь ток не отображается.

USB-тестер в разобранном виде:

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

На Рисунке 1 показана блок-схема стандартного измерителя заряда. Он состоит, по меньшей мере, из двух АЦП, один из которых предназначен для измерения тока аккумулятора. Второй АЦП мультиплексирован и может использоваться для измерения напряжения и температуры аккумулятора или выполнять функцию АЦП общего назначения. Измеренные напряжение, ток и температура подаются в микропроцессор, в котором реализован алгоритм определения заряда. В энергонезависимой памяти микропроцессора содержится определенная информация о специфических характеристиках аккумулятора, таких как импеданс или зависимость емкости ячейки от напряжения. Встроенный или внешний стабилизатор обеспечивает микропроцессор, АЦП и другие цепи регулируемым напряжением питания. Измеритель заряда взаимодействует с остальной частью системы с помощью стандартных протоколов, например, I 2 C.

Простейший алгоритм оценки заряда заключается в определения емкости аккумулятора по измеренному на нем напряжению с использованием графиков Рисунка 2. На Рисунке 2 показана стандартная зависимость напряжения литий-ионного аккумулятора от его емкости. Из графика можно получить значение емкости при данном напряжении. Рисунок 2 также показывает, как уменьшается емкость с увеличением количества циклов заряда-разряда. Метод, основанный на измерении напряжения, прост в реализации и позволяет узнать точное значение максимальной емкости аккумулятора (Q MAX) при отсутствии на нем нагрузки. Однако фактическая полезная емкость аккумулятора (Q USABLE) меньше максимальной емкости из-за внутреннего импеданса аккумулятора (Рисунок 3). Для оценки полезной емкости можно использовать среднее значение импеданса аккумулятора (R BAT), но эта оценка, скорее всего, будет содержать большие ошибки, поскольку R BAT является функцией температуры аккумулятора (T), его возраста (Age) и состояния заряда (SoC). Хотя, в принципе, для корректировки сопротивления аккумулятора может использоваться большая многомерная таблица, для расчета сопротивления требуется много информации об аккумуляторе и цепи.

Более совершенным решением является метод подсчета заряда. В этом случае для получения точной оценки текущей емкости интегрируется заряд, втекающий в аккумулятор и вытекающий из него. Данный метод хорошо работает при условии, что точно известно начальное состояние заряда. Если исходная емкость аккумулятора известна, интегрируя общий ток, можно получить текущую емкость. Основная проблема, связанная с этим методом, заключается в том, что здесь не учитывается саморазряд аккумулятора, поскольку ток саморазряда не протекает по внешней цепи. Это может привести к неточной оценке емкости. Саморазряд может быть смоделирован, но любые модели неточны, и, кроме того, уровень саморазряда зависит от температуры и возраста аккумулятора.

Чтобы решить проблемы обоих методов, для прогнозирования емкости можно использовать информацию о напряжении и токе, а также о температуре аккумулятора. В этом случае напряжение холостого хода измеряется при ненагруженном аккумуляторе, а измерение тока выполняется, когда аккумулятор заряжается или разряжается. Напряжение аккумулятора измеряется постоянно, даже при отсутствии нагрузки. Непрерывное измерение напряжения используется для обновления информации о текущем состоянии заряда на основе графика, изображенного на Рисунке 2.

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

Выбор микросхемы для измерения заряда

Основное внимание при выборе микросхемы определения заряда следует уделить точности алгоритма, потребляемому току и количеству внешних компонентов, необходимых для ее нормальной работы, прежде всего, регуляторов напряжения и токочувствительных резисторов. Даже тогда, когда фактическая нагрузка отключена, микросхема остается включенной для периодического измерения напряжения холостого хода. Любая энергия, используемая измерителем заряда, сокращает время работы системы, поэтому микросхема должна иметь низкий ток покоя. Ей требуется регулируемый источник питания для АЦП, микропроцессора и других блоков, а также низкоомный резистор для измерения тока аккумулятора. В идеале все это должно быть интегрировано на одном кристалле, чтобы сократить число внешних компонентов и сэкономить место на плате. В качестве примера такого измерителя можно привести микросхему , содержащую LDO регулятор.

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

Заключение

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

  1. Yevegen Barasukov, «Challenges and Solutions in Battery Fuel Gauging,» .
  2. «Theory and Implementation of Impedance Track Battery Fuel-Gauging Algorithm in bq2750x Family,» Application Note (SLUA450), Texas Instruments, January 2008.

Еще один интерфейс, которым можно без особых проблем связать устройство с электронным проектом — это SPI интерфейс.

SPI (Serial Peripheral Interface — последовательный периферийный интерфейс) как и UART довольно старый, простой и популярный интерфейс. Существует множество устройств работающие по этому интерфейсу (микроконтроллеры, EEPROM, ADC, DAC …). Будем и мы его использовать для наших устройств.
В SPI интерфейсе для передачи данных используется три линии: MOSI – передача; MISO – прием; SCK – тактирование. Дополнительно используется линия SS (Slave Select ?) – выбор устройства (если их несколько). SPI — полнодуплексный синхронный интерфейс — передача и прием осуществляется параллельно. Инициирует и тактирует обмен ведущее устройство – master (может быть только одно). Ведомое — slave -устройство (может быть несколько) принимает/отдает байт под действием тактового сигнала.

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

Итак, как устроен SPI интерфейс?
А устроен он до безобразия просто (его то и интерфейсом назвать сложно) — два сдвиговых регистра (master и slave), плюс генератор на стороне master – все! Сдвиговые регистры замкнуты в кольцо по линиям MOSI и MISO, тактовый сигнал от генератора подается на оба сдвиговых регистра (на slave через линию SCK).

До начала обмена данные помещаются в сдвиговые регистры, мастер запускает генератор, генератор «отщелкивает» 8 тактов, за эти 8 тактов сдвиговые регистры «меняются» содержимым (мастер получает байт слэйва, а слэйв – мастера) – все!
Если ведомых устройств несколько – обмен осуществляется только с одним, у которого сигнал на SS низкого уровня.

SPI – самый быстрый последовательный интерфейс. При частоте задающего генератора микроконтроллера 20МГц он может осуществлять обмен со скоростью 10 000 000 Бод
(1.2 мегабайта за секунду)!

Недостатком интерфейса есть то, что инициатором обмена всегда является мастер. Это значит, что если на периферии что-то произошло, мастер об этом узнает только тогда когда сам «надумает» провести сеанс связи (теряется оперативность). Производители AVR нашли способ обойти этот недостаток. Если SPI микроконтроллера сконфигурирован как master ножку SS можно сконфигурировать как на вход, так и на выход. Если ножка сконфигурирована как выход, то она используется для выбора slave-устройства. Но если ножка SS сконфигурирована на вход, то при появлении на этой ножке низкого уровня микроконтроллер автоматически переключит SPI в режим slave и сможет принять данные от другого мастера. После сеанса обмена SPI остается в режиме slave, для перевода его в режим master нужно повторно конфигурировать SPI.

Я думаю, для устройств блога, данный алгоритм переключения master- slave редко будет нужен, поэтому мы будем использовать SPI только как master или только как slave.
Если устройство блога – устройство вывода (например клавиатура), то SPI будет master, а в Вашем проекте SPI будет slave.
Если устройство блога – устройство ввода (например цифровой индикатор), то SPI будет slave, а в Вашем проекте SPI будет master.

Для связи устройства с Вашим проектом через интерфейс SPI нужно:
1 Подключить устройство блога к соответствующим ножкам микроконтроллера.
2 Настроить SPI Вашего контроллера (как master или как slave). Для этого в соответствующие порта ввода/вывода записать определенные значения.
3 Иметь (написать) процедуры приема/передачи сообщений по SPI в Вашей программе.
Теперь рассмотрим подробно каждый пункт:


1 СОЕДИНЕНИЕ УСТРОЙСТВ ЧЕРЕЗ SPI.
Просто соединяем одноименные выводы MOSI-MOSI, MISO-MISO, SCK-SCK, SS-SS. Если соединение только между двумя устройствами, то SS-SS, в принципе, не обязательно, но нужно позаботится о том, чтобы на ножке SS slave-устройства был низкий уровень (притянуть к «земле») иначе устройство не будет участвовать в обмене.


2 НАСТРОЙКА SPI.

У SPI есть четыре режима работы (0, 1, 2, 3). Режим работы зависит от того, по какому фронту тактового сигнала осуществляется обмен. Кроме того можно настроить какой бит (старший или младший) передается первым. Для обмена это не имеет никакого значения – результат будет одинаковым (режимы работы нужны для подстройки SPI к устройствам разных производителей). Master и slave должны работать в одном режиме.
Для устройств блога будем применять следующие настройки SPI:
Режим – 0
Старший бит передается первым
Частота тактирования — по обстоятельствам (для SPI частота не столь важна, так как тактирование происходит от одного источника).
Для примера возьмем микроконтроллер ATmega8 с внутренним задающим генератором на 8МГц. Настроим управляющие порта ввода-вывода контроллера и в различных средах программирования.

Algorithm Builder.
Создаем проект (Файл/Новый ). Выбираем микроконтроллер и частоту задающего генератора в Опции/Опции проекта… (ATmega8, внутренний задающий генератор на 8МГц). В панели инструментов жмем кнопочку «S» – настройщик управляющих регистров» выбираем SPI.
Настройки для master (для связи с устройством вывода):

Настройки для slave (для связи с устройством ввода):


Жмем «ОК». Готово – SPI проинициализирован и готов к работе.

Ассемблер. Можно поковыряться в даташите на контроллер, можно взять кусок асма из скомпиленного проекта на С, можно перевести мнемокоманды Algorithm Builder — выбираем, что нравится.
Настройки для master (для связи с устройством вывода):

init-SPI-slave: sbi 0x17,0x04 ldi r16,0x00 out 0x0E,r16 ldi r16,0xC0 out 0x0D,r16

CodeVisionAVR . Для генерации настроек SPI, нажимаем на значок шестеренку (CodeWisardAVR ) на панели инструментов. В открывшемся окошке сначала выбираем вкладку Chip в ней выбираем микроконтроллер и устанавливаем частоту, с которой будет работать задающий генератор. Далее выбираем и заполняем вкладку SPI в соответствии с нужными характеристиками.

Настройки для master (для связи с устройством вывода):

// Port B initialization // Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In // State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T PORTB= 0x00 ; DDRB= 0x2C ; // SPI initialization // SPI Type: Master // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR= 0xD0 ; SPSR= 0x00 ;

// Port B initialization // Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In // State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T PORTB=0x00; DDRB=0x2C; // SPI initialization // SPI Type: Master // SPI Clock Rate: 2000,000 kHz // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR=0xD0; SPSR=0x00;

Настройки для slave (для связи с устройством ввода):

// Port B initialization // Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T PORTB= 0x00 ; DDRB= 0x10 ; // SPI initialization // SPI Type: Slave // SPI Clock Rate: 2000,000 kHz // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR= 0xC0 ; SPSR= 0x00 ;

// Port B initialization // Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x10; // SPI initialization // SPI Type: Slave // SPI Clock Rate: 2000,000 kHz // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR=0xC0; SPSR=0x00;

Сохраняем сгенерированный проект (File\Generate, Save and Exit ). Создан проект со всеми нужными установками для SPI. В проекте инициализируется и другая периферия (зачастую не нужная). После создания проекта его можно подкорректировать – удалить все не нужное.


3 СОЗДАНИЕ ПРОЦЕДУР ОБРАБОТКИ SPI.

Работа с SPI в микроконтроллере организована очень просто. Чтобы начать обмен данными в мастер-контроллере достаточно записать передаваемый байт в регистр SPDR – обмен начнется автоматически. По завершению обмена вызовется процедура обработки прерывания, в ней считываем из SPDR полученный байт. Со слэйв-контроллером еще проще по окончании обмена вызовется процедура обработки прерывания, в ней считываем из SPDR полученный байт.

Algorithm Builder.
Передача . Как для master’a, так и для slave передаваемый байт нужно записать в регистр SPDR. Для master’a запись байта в SPDR инициирует обмен.
Прием . Как для master’a, так и для slave после принятия байта вызовется прерывание, в котором и обрабатывается посылка.

Если во время передачи байта будет попытка записи в регистр SPDR — возникнет конфликт записи. Поэтому в программе нужно позаботится о том, чтобы следующий байт передавался по окончании приема предыдущего. Наилучшим решением этой проблемы будет следующий алгоритм: первый байт-начало пакета байт передается из тела программы, а остальные передаются из прерывания окончании передачи по SPI. Таким образом основная программа «освобождается» от работы по передаче строки байт и в тоже время не может возникнуть конфликт записи, так как прерывание вызывается о окончании обмена.

Так как мы планируем передавать единичные байты по SPI, приведенный выше алгоритм мы использовать не будем.

Ассемблер.
Код предельно прост. Для передачи пишем в SPDR, полученный байт читаем из SPDR в теле прерывания.

CodeVisionAVR . CodeWisardAVR кроме инициализации создаст и процедуру обработки прерывания. Ничего дополнительного не потребуется.

// прием/передача данных по SPI в теле прерывания interrupt void spi_isr(void) { unsigned char data; data=SPDR; } // подготовка/передача данных по SPI в теле программы unsigned char data; SPDR=data;

Вот, вроде бы, и все, что хотелось сказать по SPI.
Интерфейс довольно простой и не должен вызывать проблем при его использовании.

(Visited 5 231 times, 1 visits today)

Доброго времени суток! Сегодняшняя статья – небольшое теоретическое отступление, которое поможет нам при освоении курса «Программирование Ардуино» . Речь пойдёт об интерфейсе SPI. Что это такое и с чём его едят, мы постараемся разобраться в данной статье.

Для начала определение . SPI (Serial Peripheral Interface — последовательный периферийный интерфейс ) – это последовательный синхронный стандарт передачи данных, который предназначен для связи контроллера с различной периферией. Этот интерфейс простой и удобный. Под Аrduino написана специальная библиотека для работы с SPI.

Связь строится по принципу «ведущий-ведомый». В качестве ведущего устройства обычно выступает контроллер. Все остальные устройства, что подключаются в систему — ведомыми. Данные от ведущего устройства по шине данных передаются к одному из выбранных ведомых или наоборот от ведомого устройства к ведущему синхронно, по тактирующему сигналу ведущего.

Распиновка шины данных SPI состоит из 4-х линий: MOSI, MISO, CS и SCLK:

  • MOSI (Master Out Slave In — Ведущий-выход, Ведомый-вход ) или просто SI – передача данных происходит от ведущего устройства к ведомому.
  • MISO (Master In Slave Out — Ведущий-вход, Ведомый-выход ) или просто SO – передача данных происходит от ведомого устройства к ведущему.
  • CS (Chip Select — Выбор чипа ) или SS (Slave Select — Выбор ведомого ) – выбор ведомого устройства.
  • SCLK (Serial CLocK ) или просто SCK – передача тактового сигнала от ведущего устройства к ведомому.

Для того, чтобы передать данные от ведущего устройства к ведомому необходимо, чтобы ведущий выставил низкий уровень сигнала на линии CS ведомого, с которым собирается настроить связь. После этого биты передаются по линии MOSI. Для прекращения передачи данных ведущий как бы «отпускает» линию CS – выставляя на ней высокий уровень сигнала.

Для подключения нескольких ведомых устройств к шине данных SPI нужно на каждое из них завести свою индивидуальную линию CS. После того, как это будет выполнено, ведущее устройство сможет поочерёдно «дергать» линиями, переключаясь между ведомыми устройствами. Несколько ведомых можно подключать по разному: параллельно или последовательно.

Параллельное подключение ведомых устройств по шине данных SPI

Особенность параллельного подключения нескольких ведомых устройств заключается в том, что для создания связи используются общие линии SCLK, MOSI и MISO. При этом каждое ведомое устройство имеет свою линию SS(CS). Ведущее устройство определяет с каким «текущим ведомым» наладить обмен данными, путем формирования низкого уровня сигнала на соответствующей линии SSn (где n – 1,2…).

Для подключения к контроллеру n-числа ведомых устройств по интерфейсу SPI нужно выделить для данной цели n+3 выводов микроконтроллера.

Последовательное подключение ведомых устройств к шине SPI

Что же касается последовательного подключения ведомых устройств, то они используют общие линии SCLK и SS, а выход одного подключается ко вход другого. Линия MOSI ведущего устройству подключается к первому ведомому, а линия MISO — к последнему. Если смотреть на это подключение с точки зрения ведущего устройства, то по шине данных SPI, как бы подключено одно ведомое устройство.

Следует отметить преимущество такого типа подключения: можно подключать n-ое число устройств задействовав для этой цели всего 4 вывода микроконтроллере.

На этом пока всё, продолжение следует…

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то