Во всех микроконтроллерах семейства Mega имеется аппаратный модуль SPI. Он очень прост в своём использовании. После настройки и инициализации модуля нужно записать в регистр SPDR передаваемый байт данных — это запустит генератор тактового сигнала SPI, данные начнут передаваться от Master к Slave и обратно. После установки флага окончания передачи в SPDR будет находиться принятый байт. В общем всё просто. Да и по моему мнению SPI самый лёгкий в освоении и использовании интерфейс, к тому же достаточно скоростной. Однако в некоторых контроллерах семейства Tiny аппаратного SPI нет — там установлен модуль USI, например в очень распространённой и применяемой ATtiny2313. На различных форумах я встречал неоднократные вопросы по поводу использования USI в качестве SPI, т.е. у народа возникают некоторые трудности. ?, хотя, USI, может быть, чуть сложнее SPI, но особых трудностей при разборе его работы возникнуть не должно. Основные части USI — это сдвиговый 8-ми разрядный регистр (для передачи/приёма данных) и 4-х разрядный счётчик (для определения окончания передачи). В тонкости построения USI я углубляться не буду — кто захочет разобраться подробнее тот раскурит даташит. Главное отличие работы USI в режиме SPI от аппаратного SPI семейства Mega — то, что синхроимпульсы для передачи/приёма формируются не аппаратно, а, или программно, или от внешнего источника, или по прерыванию таймера 0. Кроме того, сдвиговый регистр и 4-х разрядный счётчик можно тактировать от разных источников, что позволяет построить на основе USI некоторые дополнительные модули.
В даташите на ATtiny2313 есть программные примеры на ассемблере для работы USI в качестве SPI. Я их переписал на Си, сохранив логику работы один к одному, и успешно использую в своей работе.
Для демонстрации работы USI в качестве SPI, я возьму микроконтроллерные модули с ATtiny2313 и ATmega8, клавиатуру, в которой использую только одну кнопку и ЖК?.
Опыт №1. 2313-я MASTER 8-я SLAVE.
Скачиваем архив. В нём две папки. В папке USI_SPI — проект для ATtiny2313, а в папке SPI — для ATmega8A. Внимательно просмотрите исходники каждого проекта — там написано, что нужно раскомментировать и что нужно закомментировать для настройки MASTER/SLAVE (Подсказка: там два варианта главной функции). Также в каждом проекте подключены заголовочный и Си-шный файлы для работы с ЖК? HD44780. Они необходимы для отображения принятых символов. Откомпилируйте проекты, чтобы 2313-я выступала в качестве MASTER, а 8-я — SLAVE и прошейте контроллеры. По разделу defane посмотрите назначение выводов, и, соответственно им соберите макет (Подсказка: для подключения ЖК? (он подключается к SLAVE), что в 2313-й, что в 8-й используется порт D. PD0 — PD3 МК — DB4 — DB7 ЖК?, PD4 — RS, PD5 — EN). Кнопка (подключается к MASTER) тоже вешается одинаково — на PD1.
Собрали макет. Подали питание. На ЖК? должна высветиться надпись ОК — значит , по крайней мере: 1) ЖК? подключён правильно; 2) компиляция и прошивка SLAVE прошла успешно. Нажимаем кнопку и наблюдаем на ЖК? SLAVE приём символов (я использовал десятичные цифры. Вот фотка где 2313 — MASTER.
Опыт №2. 2313-я SLAVE 8-я MASTER.
Теперь компилируем проекты, чтобы 2313-я выступала в качестве SLAVE, а 8-я — MASTER и соответственно прошиваем. ЖК? подключаем на 2313-ю, а кнопку — на 8-ю. Не забудьте ПОМЕНЯТЬ местами соединители с MISO на MOSI для 8-й. Повторяем действия из опыта №1. Убеждаемся в чёткой работе. Фотку демонстрировать не вижу смысла, т.к. она ничем не отличается, кроме подключения проводов.
В данной реализации SPI, что для ATtiny2313, что для ATmega8A, я не использовал прерывания, а также различные варианты тактирования для 2313. Всё это в Ваших руках, вернее в головах. Целью данной статьи было показать простейшие способы реализации интерфейса SPI. Для tiny, точно так, как и в даташите, есть два варианта функций передачи данных. Я замерял частоту тактовых сигналов «быстрого» варианта с кварцем 20 МГц — реально вышло 10 МГц!
Готовые исходники, я думаю, пригодятся Вам в дальнейшем творчестве. Всем удачи.
Поиск
Вход
Архивы
27 комментариев на «SPI для ATtiny2313»