Главная » Статьи » Полезная информация

SPI интерфейс. Часть 1. Конфигурация в Bascom-AVR
 Интерфейс SPI, пожалуй, самый распространенный интерфейс коммуникации между микроконтроллерами и периферией. Он широко распространился за счет универсальности, простоты реализации и высокой скорости передачи данных по шине. В каждом микроконтроллере AVR имеется поддержка интерфейса SPI, более того – эта шина используется для внутрисхемной прошивки микроконтроллера (тот самый ISP). Поэтому пришло время подобраться к этому интерфейсу поближе и разобраться с принципом работы в Bascom-AVR.

 Главной составляющей интерфейса SPI является обычный сдвиговый регистр, так что если разобрались с принципом работы сдвигового регистра 74hc595, то понять, как работает передача данных в SPI будет как два пальца обоссвальт =)

Пример подключения одного подчиненного устройства к ведущему:



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

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



 Конфигурирование SPI в Bascom-AVR

 Тут можно пойти двумя путями: использовать аппаратный SPI с жесткой привязкой к определённым портам микроконтроллера или сконфигурировать программный, со своим назначением портов. Кстати, если верить отзывам, аппаратная реализации этого интерфейса у Atmel не особа удачна и лучше юзать программный SPI. Если есть знающие люди – прошу прокомментировать. 

Синтаксис для конфигурации программного SPI
CONFIG SPI = SOFT, DIN = PIN, DOUT = PIN , SS = PIN|NONE, CLOCK = PIN , SPIIN=value , MODE=mode

Синтаксис для конфигурации аппаратного SPI
CONFIG SPI = HARD, INTERRUPT=ON|OFF, DATA ORDER = LSB|MSB , MASTER = YES|NO , POLARITY = HIGH|LOW , PHASE = 0|1, CLOCKRATE = 4|16|64|128 , NOSS=1|0 , SPIIN=value



описание параметров:

SPI: Soft/hard тут вроде все понятно, выбираем программный или аппаратный SPI

DIN: Вход данных, альтернативное обозначения линии MISO

DOUT: Выход данных, альтернативное название линии MOSI

SS: Порт отвечающий за выбор ведомого, если не требуется использование можно ставить none (если выбор ведомого будет производится в ручную)

CLOCK: Выход для синхронизирующих импульсов, альтернативное название линии SCLK

MODE: Число от 0 до 3, определяющее режим работы программного SPI. О ней чуть позже. Эта настройка поддерживается только в новых версиях компилятора 2.0.х.х

DATA ORDER: Этим параметром указывается в каком порядке в регистр будут передаваться данные (MSB – старший бит будет идти первым, LSB – младший бит идет первым)

MASTER: этим параметром устанавливается будет ли устройство ведущим на шине SPI

POLARITY: параметром указывается по какому уровню на линии SCLK в регистр будут записываться данные

PHASE:  какая-то непонятная фигня, смело ставим 0

CLOCKRATE: здесь устанавливаем с какой частотой будет работать шина SPI, скорость будет устанавливаться выбором знаменателя из чисел 4|16|64|128 на который будет делиться частота работы микроконтроллера (пример: при частоте кварца 8МГц, CLOCKRATE = 4; скорость работы шины будет составлять 2МГц)

NOSS: отключает линию SS в случае если она не используется. Это необходимо например, когда к ведущему подключается более одного ведомого устройства. Для этого ставим NOSS=1 (линия SS теперь не будет автоматически прижиматься к 0), а в качестве SS1, SS2, SSn устанавливаем свои пины для работы с ведомыми устройствами. И когда нужно будет пообщаться с каким-либо устройством, вручную ставим на его линии SS низкий уровень. После окончания общения незабываем снова ставить высокий уровень.

INTERRUPT: включаем/отключаем прерывания от SPI

SPIIN: значение которое отправляем ведомому устройству для его инициализации обычно это значение 0 (стоит по умолчанию), но может понадобиться отправить свое значение.




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

DATA ORDER = MSB, POLARITY = HIGH, MASTER = YES, PHASE = 0, CLOCKRATE = 4

 При выборе аппаратного SPI выводы данных не назначаются, они будут жестко привязаны к определенным ножкам микроконтроллера, эту информацию можно посмотреть в даташите на микроконтроллер. Пример назначения для ATmega8:





Пример конфига для использования программного SPI:
 
Config SPI = SOFT, DIN = PINB., DOUT = PORTB.1, SS = PORTB.2, CLOCK = PORTB.3
SPIINIT  'инициализируем SPI

 Обратите внимание, что DIN это вход данных и поэтому при конфигурировании этой линии необходимо писать PIN, а не PORT.
 Команда SPIINIT после конфигурации инициализирует сконфигурированные ножки микроконтроллера для работы по шине SPI, такчто незабываем использовать эту команду. 


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


Категория: Полезная информация | Добавлено: 09.02.2012
Просмотров: 20474 | Комментарии: 23 | Теги: SPI | Рейтинг: 4.2/13
Всего комментариев: 23
+1   Спам
23 top   (18.09.2015 14:20)
Разобрался. Код виснет на опросе флага конца передачи (Bitwait Spsr.spif , Set). По какой-то причине флаг не устанавливается. Порты сконфигурированы так:
Config Pinb.6 = Input 'MISO
Portb.6 = 0

Config Portc.3 = Output 'NCS
Ncs Alias Portc.3
Set Ncs

Config Portb.4 = Output 'SS
Portb.4 = 1

Config Portb.5 = Output 'MOSI
Config Portb.7 = Output 'SCK

22 top   (18.09.2015 11:45)
Сегодня пробовал на низком уровне. Настроил регистры вручную, передача/прием через SPDR. Все равно не работает. На линиях MOSI MISO SCK тишина. Что за чертовщина с этим SPI.

21 top   (17.09.2015 20:11)
vakulyuk, одновременный прием/передача производится командой spimove
А теперь вопрос от меня. Раньше слышал что у людей проблемы с spi в аппаратном режиме. Сегодня столкнулся с этим сам. Программный работает, хард - нет. Делителем игрался, прочими настройками тоже. Факт - в протеусе симулирует корректно и тот и другой режим, в железе работает только софт. В чем моя проблема?
bascom 1.11.9.8

20 vakulyuk   (07.05.2015 15:26)
Начал разбираться с SPI на основе АЦП MCP3208, но наткнулся на проблему стандартные команды SPIIN и SPIOUT не умеют одновременно принимать и отправлять байты. А нужно в ЦАП отправить 12 бит и получить с него 12 бит. Отправляя командой SPIOUT 3 байта, АЦП одновременно возвращает значение напряжения, но как его принять не знаю. Подскажите, пожалуйста, как можно это сделать? Можно ли это сделать командами SHIFTIN и SHIFTOUT?

19 vakulyuk   (15.01.2015 16:11)
Когда же уже будет статейка с перекидыванием информации по SPI интерфейсу?) Хотя бы что-нить банальное)

+1   Спам
18 Cerber   (24.08.2014 14:58)
Освоил передачу данных за один вечер,собрал устройство. Все превосходно работает.

17 Cerber   (24.08.2014 08:06)
У меня ваще все плохо. надо передавать адрес (8 бит) и 24 бита остальная лабуда. Не получается пока освоить этот интерфейс...

16 Leosix   (11.12.2013 03:32)
Возможно ли наладить обратную связь? допустим множество датчиков опрашивает 1 МК в ответ датчики (с МК) должен послать информацию о своём состоянии.

+1   Спам
15 top   (30.08.2013 00:06)
artmel, в SPI, устройство, которое является мастером, одновременно является "поставщиком" тактовых импульсов. Поэтому тактировать, я думаю, можно как захочется (поправьте коль не так). Примеры должны быть рабочими. А я бы использовал UART, или самопальный двухпроводный интерфейс с использованием прерываний, или мои любимые функции SHIFTOUT и SHIFTIN.

14 artmel   (29.08.2013 22:43)
можете помочь?
есть 2 атмега8
одна с кварцем.
если их соединять по spi , то обязательно вести от xtail1 к xtail2 провод? или можно тактировать от внутреннего источника вторую мегу?

может кто даст 2 исходника для мастера и слейва? просто от мастера к слейву передать 1 или 0.
примеры в которые идут с баскомом не понял, не хочет совершенно работать.

13 top   (06.08.2013 23:47)
Выходит, что в програмном режиме нельзя выбрать предделитель? И раз уж так, то на сколько в програмном режиме (по умолчанию) делится частота кв.рез.?

12 exersizze   (05.09.2012 10:41)
Нет, такого небыло. Но обдумывал подключение по UART, там вобще по одному проводу (без земли) можно было бы подключать. Но практической пользы мало, поэтому дальше дело не пошло.

11 amv2000   (04.09.2012 12:10)
А не было мысли прикрутить на ЖК индикатор интерфейс SPI? посредством какой нибудь тиньки к примеру, тогда подключать ЖК можно всего по 3 проводам...

10 top   (26.04.2012 13:36)
Ув. exersizze ждем продолжения) Тема очень актуальна!

9 exersizze   (26.03.2012 23:05)
продолжение обязательно будет, но только после того как появится время и желание копать в этом направлении дальше.

8 rk2555   (26.03.2012 18:41)
Интересная тема. Когда продолжение ожидать?

7 exersizze   (14.02.2012 00:51)
кажется понял о чем речь, обычно прокрутка страницы помогает в таких ситуациях.

6 AlekS   (13.02.2012 20:26)
Это Опера Jpg иногда душит.
Ужо настройки подерга.

5 4ester   (13.02.2012 18:45)
у меня с картинкой все в порядке, и статья отличная, спасибо!

4 AlekS   (11.02.2012 09:56)
Как бут то выподание горизонтальных строк. Название ног видно до половины верх или низ. Чисто картинку открываю все в норме. Может глюк моего браузера?

3 RD3AVJ   (10.02.2012 23:47)
Картинка в поряде. Тема важная и нужная! Примеров бы побольше..))) Спасибо!

2 exersizze   (10.02.2012 21:59)
постараюсь разжевать эту тему, что не так с картинкой? у меня все нормально грузит

1 AlekS   (10.02.2012 18:22)
Спасибо, тема очень интересная.
atmega8_pinout_.jpg поправь, пожалуйста, невидно.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
Спасибо) Я принцип действия понял, а вот откуда взялась именно цифра 195 не поня...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
pchela5, ну так это в военное, а у нас в мирное время все примерно)) Наше...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - pchela5:
> Полуволна в нашей электросети по времени длится примерно 10 мс

...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
Чтобы понять откуда взялась цифра 195 надо сначала въехать в принцип работы: ког...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
А почему минимальный накал при 195? Насколько минимум можно занизить Wt?
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.