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

326 Часть 111. Практическое программирование микроконтроллеров А VR ldi ternp , ( l<<SCK ) + ( l<<МOSI ) + ( l<<CS ) + ( l<<PB4 ) out DDRВ , ternp ; SCK, MOS I , CS , SS - выходы ser temp ; OxFF out PORTB , ternp ; РВ7 . . 0 - высокий уровень весь порт В Процедура записи/чтения у «мастера» тогда будет выглядеть очень просто (лис­ тинг 1 2 .4) . WR_spi : ; запись /чтение SPI , в temp данные на входе и на выходе out SPDR, temp ; начать передачу wait_spi : sbis SPSR, SPI F ; ожидаем конца передачи rjmp wait_spi in temp , SPDR ; чтение данных ret При работе с большинством устройств через SPI, к сожалению, этой простой про­ цедурой дело не ограничивается - чаще всего требуется, по крайней мере, вовремя правильно установить «выбор кристалла», причем иногда (если интерфейс у ведо­ мого устройства недостаточно скоростной) с формированием искусственных задержек и прочими сложностями, сильно загромождающими программу. ПОДРОБНОСТИ Если используется аппаратный SPI , то его выводы, как мы не раз говорили , в боль­ шинстве случаев совпадают с последовательным интерфейсом программирования. Если ISР-разъем для программирования установлен прямо в схеме, то я рекомендо­ вал устанавливать внешние «подтягивающие» резисторы для повышения помехо­ устойчивости . В подавляющем большинстве случаев наличие этих резисторов никак не скажется на работе SP I . Однако следует учитывать , что формируя выводы MISO и SCK на выход и оставляя на них низкий уровень (как в режиме О) , тем самым мы обеспечиваем дополнительное потребление через «подтягивающие» резисторы на этих выводах, что может быть важно в устройствах с энергосберегающими режимами. В некоторых случаях наличие резистора на выводе MI SO необходимо - например, если ведомое устройство работает от питания 2 , 7 В, а МК - от 5 В, то уровня логиче­ ской единицы на этом выводе может не хватить для нормальной работы МК, и рези­ стор поможет решить эту проблему (кстати , МК семейства х51 этого недостатка лише­ ны) . Однако в таком случае неизбежна утечка через этот резистор и ограничивающий диод на входе ведомого устройства. По всем этим причинам в аппаратуре с примене­ нием режимов энергосбережения в общем случае устанавливать «подтягивающие» резисторы по выводам SP I не рекомендуется (как и во многих других случаях, когда выводы программирования служат обычными портами на выход) . В процессе обмена возможно использовать и прерывания SPI . Хотя это и разгрузит контроллер на время посылки байта, но менее удобно - сильно усложняется логи­ ка построения программы. Прерывание возникает всякий раз, когда заканчивается передача очередного байта, а связанные с этой передачей действия существенно различаются, и обработчик прерывания состоял бы из сплошной «лапши» услов-

RkJQdWJsaXNoZXIy MTExODQxMg==