воскресенье, 9 января 2022 г.

USI в режиме SPI slave на ATtiny2313

 SPI - это полнодуплексный последовательный синхронный интерфейс передачи данных. Полнодуплексный означает что прием данных и их передача может происходить одновременно. Для этого в данном интерфейсе есть 2 провода один из которых называется MOSI (M-мастера O-выход S-слейва I-вход) а второй MISO (M-мастера I-вход S-слейва O-выход). Если по SPI соединяются два устройства то один из них является мастером а другой слейвом. Мастер управляет процессом передачи и приема а также генерирует синхроимпульсы. Синхроимпульсы нужны для того чтобы точно задавать моменты времени в которые на проводах MOSI и MISO замеряются уровни напряжений чтобы быть записанными. Синхронные интерфейсы надежнее асинхронных т.к. в асинхронных приемник и передатчик должны работать с одинаковой (чего практически никогда не бывает) или очень близкой частотой чтобы приемник записывал 0 или 1 именно тогда когда это нужный по счету 0 или 1. Неточность частот также влияет на скорость передачи данных в худшую сторону. Поэтому синхронные интерфейсы также быстрее асинхронных. Из за полного дуплекса и синхронности возможно что это самый быстрый последовательный интерфейс который только можно придумать. Быстрее могут быть только параллельные интерфейсы. Синхроимпульсы идут по проводу CSK. Итого, как минимум и не учитывая земли, для данного интерфейса нужно 3 провода. Если необходимо соединить по SPI более 2х устройств то задействуются дополнительные провода SSx где x-номер слейва. Из за этого количество проводов увеличивается на 1 при добавлении одного нового устройства на шину. Т.е. количество проводов SS равно количеству слейвов если оно больше 1. Если слейв 1 то провод SS можно не использовать. Поэтому SPI плох в плане экономии проводов. Если требуется передача, с небольшой скоростью, данных по небольшому количеству проводов то лучше использовать например I2C. Если нужна большая скорость передачи данных с небольшим количеством устройств то SPI лучше подойдет чем I2C. Из за того что данный интерфейс синхронный, стабильность частоты его работы не важна, настолько что если например микроконтроллер является слейвом то мастером может быть человек с кнопкой подключенной к SCK, переключателем подключенным к MOSI и светодиодом подключенным к MISO. С таким подключением человек-мастер может протестировать слейва. Чтобы подключить два устройства по SPI нужно соединить MOSI вывод мастера с MOSI выводом слейва, MISO мастера с MISO слейва а также CSK мастера с CSK слейва. Мастер и слейв имеют внутри себя сдвиговые регистры и после соединения, их описанным выше способом, получается кольцевой сдвиговый регистр при сдвиге битов столько раз сколько битов в одном из регистров (мастера или слейва) происходит обмен данными между мастером и слейвом:




Рисунок 1 - Диаграмма обмена данными межу слейвом и мастером по SPI

Сдвиг на один бит происходит при переднем фронте синхроимпульса или при и заднем спаде синхроимпульса. В микроконтроллерах обычно можно настроить данный параметр. Обычно обмен по SPI происходит по 8 бит но в микроконтроллерах часто имеется возможность настроить обмен на другое количество бит за раз, однако чаще всего используется 8 бит т.е. 1 байт. После того как обмен произошел мастер может забрать байт данных данных из регистра и поместить новый для обмена. Слейв может поступить аналогично. В обоих устройствах д.б. счетчик который указывает на то когда можно забирать байт данных и записывать новый и отсчитывать он должен одинаковое количество раз т.е. 8 если передается 1 байт за раз. Обычно в микроконтроллерах имеются специальные флаги сигнализирующие об окончании обмена. Схема со ATtiny2313 слейвом для взаимодействия с человеком мастером м.б. например такой:
Рисунок 2 - Схема SPI слейва на ATtiny2313 для взаимодействия с человеком

Кнопка S2 обязательно должна быть бездребезговой т.к. иначе одно нажатие на такую кнопку может создать (а скорее почти наверняка создаст) количество синхроимпульсов больше одного. О бездребезговой кнопке есть статья -> https://electe.blogspot.com/2019/04/blog-post.html практика показала (см. видео ниже) что такая кнопка может успешно работать как источник синхроимпульсов. В микроконтроллере ATtiny2313 на SPI. Зато есть USI (универсальный синхронный интерфейс) который может работать в режиме SPI мастера или слейва. Для настройки USI на режим SPI slave есть регистр USICR. Но прежде нужно настроить пины микроконтроллера соответствующим образом. Т.е. Пин SCK д.б. настроен на вход (т.к. если микроконтроллер слейв то синхроимпульсы на него подаются от мастера),  пин MOSI тоже на вход а пин MISO на выход. На входные пины также следует поставить внутреннюю подтяжку к плюсу питания. Режим SPI настраивается битами 4 и 5 регистра USICR, битами 1...3, этого регистра, настраивается источник тактирования сдвигового регистра а также счетчика. Если сделать источником тактирования сдвигового регистра внешний сигнал то микроконтроллер будет работать как слейв. Для счетчтка также нужно установить внешний сигнал. В общем чтобы настроить USI как SPI slave нужно установить биты 3 и 4 регистра USICR:

Чтобы мастер смог забрать байт данных от слейва, нужно поместить этот байт в регистр USIDR. после того как обмен произойдет, из этого регистра можно извлечь байт данных пришедший от мастера. Об окончании обмена свидетельствует бит 6 регистра USISR. Его можно проверять в цикле прежде чем забирать байт от мастера но прежде его нужно программно сбросить записав в регистр число 0b01000000 т.е. именно присвоить это число этому регистру а не выполнить операцию побитового или с данным числом. На схеме на рисунке 2 есть светодиод VD1. Этот светодиод нужен для того чтобы сигнализировать об окончании обмена с мастером т.к. если считать синхроимпульсы слишком долго то можно сбиться со счета а данный светодиод упрощает тестирование слейва вручную. Полный код программы приведен в текстовом поле ниже:


Видео:

Комментариев нет:

Отправить комментарий