Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

324 Часть 111. Практическое программирование микроконтроллеров АVR Использование интерфейса SPI описано, например, в «аппноте» 1 5 1 (правда, с при­ мерами на языке С, а не на ассемблере) . В принципе любой последовательный про­ токол обмена может быть имитирован программно, и нередко это оказывается це­ лесообразнее, чем применение штатных средств, даже если они присутствуют. UART имитировать без крайней необходимости не стоит: штатные средства управ­ ления им достаточно удобны и просты в использовании (см. главу 13), а более од­ ного UART нам почти никогда не требуется - в отличие от Arduino, где основной UART занят под программирование. В случае SPI программная имитация конкури­ рует по простоте с использованием аппаратных средств, и зачастую она даже удоб­ нее из-за совпадения у большинства контроллеров выводов интерфейсов SPI про­ граммирования и SPI обмена с устройствами, что может, например, помешать внутрисхемному программированию при отладке системы . Поэтому тут мы рас­ смотрим и тот, и другой способы. Еще интереснее в этом плане случай интерфейса TWI, который мы будем рассматривать в следующей главе, - там программная имитация почти во всех случаях оказывается удобнее . Основные операции через SPI В большинстве случаев МК выступает при обмене через SPI в роли ведущего (Master) . Основная операция через SPI крайне проста (см. рис. 3 .3 в главе 3) и за­ ключается в том, чтобы передать через выход MOSI ведущего восемь битов данных синхронно с восемью импульсами на выводе SCK в нужной фазе. Фаза зависит от режима SPI : в режиме О (mode О) на SCK изначально низкий уровень, в режиме 3 (mode 3 ) изначально высокий, а чтение бита производится в обоих случаях по на­ растающему фронту (режимы 1 и 2 с чтением по падающему фронту, встречаются значительно реже). Одновременно с передачей через MOSI ведомый (Slave), если это предусмотрено в текущей операции, ведет передачу своих данных, которые в ведущем (Master) могут быть прочитаны сразу по окончании передачи. По сути чтение и запись через SPI - одна и та же операция . А ппаратны й вариант Для работы с аппаратным SPI его нужно сначала, естественно, инициализировать. Посмотрим, как это будет выглядеть для ATmega8535 (а также для многих других МК того же класса, например, АTmega8, АTmega 1 6 и пр. , у которых выводы аппа­ ратного SPI совпадают с интерфейсом SРI-программирования и занимают старшие биты порта В из имеющихся). Заодно инициализируем и вывод для управления «выбором кристалла» - в большинстве случаев он в интерфейсе SPI играет важ­ ную роль. Часто для этого выбирают вывод SS , который в режиме «мастера» не задействован (не забудем, что его нужно сконфигурировать на выход ! ), но мы для разнообразия выберем вывод РВО - часто требуется управлять несколькими устройствами, одного вывода SS тогда все равно недостаточно, и младшие биты порта В, идущие подряд, оказываются более удобными (листинг 1 2 . 1 ) .

RkJQdWJsaXNoZXIy MTExODQxMg==