Главная » Статьи » Полезная информация |
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.0 , DOUT = PORTB.1, SS = PORTB.2, CLOCK = PORTB.3
SPIINIT 'инициализируем SPI Обратите внимание, что DIN это вход данных и поэтому при конфигурировании этой линии необходимо писать PIN, а не PORT. Команда SPIINIT после конфигурации инициализирует сконфигурированные ножки микроконтроллера для работы по шине SPI, такчто незабываем использовать эту команду. На этом сухой теории пока хватит, чуть позже попробуем покидаться данными между микроконтроллерами. Оставайтесь на линии ;) | |
Просмотров: 29555 | Комментарии: 25
| Теги: |
авторизация
рубрики
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |
метки