Раздел: Документация
0 ... 151 152 153 154 155 156 157 ... 195 12.3. Режимы работы модуля USI Как уже говорилось, модуль USI имеет два основных режима работы: •трехпроводный режим; •двухпроводный режим. Кроме того, отдельные узлы модуля могут использоваться и для других целей, не обязательно связанных с передачей данных. 12.3.1. Трехпроводный режим В трехпроводном режиме модуль USI может использоваться для обмена по шине SPI (режимы 0 или 1). Принципы работы этой шины были подробно рассмотрены в главе 10. Основное отличие модуля USI от стан-дартного модуля SPI заключается в отсутствии в модуле USI входа SS для выбора ведомого устройства. Однако при необходимости поддержка этого сигнала может быть легко реализована программно. Структура модулей USI при работе в трехпроводном режиме показана на Рис. 12.4.
Рис. 12.4. Модули USI в трехпроводном режиме Сдвиговые регистры обоих модулей (ведущего и ведомого) соединяются между собой таким образом, чтобы после восьми импульсов на линии USCK содержимое сдвигового регистра ведущего оказалось в сдвиговом регистре ведомого, и наоборот. По этому же тактовому сигналу инкремен-тируется 4-битный счетчик модуля USI. Соответственно для определения момента завершения обмена можно использовать флаг прерывания по переполнению счетчика (USIOF). Тактовый сигнал формируется ведущим устройством. Состояние вывода USCK изменяется переключением бита PORTE4 или же посредством записи лог. 1 в бит USITC регистра USICR. Временные диаграммы обмена в трехпроводном режиме представлены на Рис. 12.5.
DO [ А) (£)(C)(D)(E) Puc. 12.5. Временные диаграммы обмена в трехпроводном режиме Верхний график сигнала USCK соответствует 0-му режиму внешнего тактового сигнала (USICS0 = 0). В этом режиме данные, поступающие на вход DI, считываются по нарастающему фронту сигнала USCK, а изменение состояния выхода DO (сдвиг содержимого сдвигового регистра) производится по спадающему фронту. Нижний график сигнала USCK соответствует 1-му режиму внешнего тактового сигнала (USICS0 = 1). В этом режиме назначения фронтов тактового сигнала меняются на противоположные: входные данные считываются по спадающему фронту, а выходные данные выводятся по нарастающему фронту. Указанные режимы соответствуют 0-му и 1-му режимам SPI. Таким образом, обмен в режиме SPI выполняется в несколько этапов: 1.Оба устройства подготавливают выходные данные, включают выходные драйверы и сбрасывают содержимое своих 4-битных счетчиков (точки А и В на Рис. 12.5). Подготовка данных заключается в загрузке их в сдвиговый регистр, а выходные драйверы включаются установкой соответствующего бита регистра направления передачи данных. Порядок событий А и В может быть любым, важно только, чтобы интервал между последним из событий и началом считывания данных был не меньше половины периода сигнала USCK. 2.Ведущий формирует импульсы тактового сигнала, программно изменяя состояние линии USCK (точки С и D на Рис. 12.5). Значение бита данных на входах (DI) ведущего и ведомого устройства считы-вается по первому фронту сигнала USCK (точка С), а состояние выхода (DO) изменяется по противоположному фронту (точка D). Инкрементирование счетчика производится по каждому фронту. 3.Для передачи байта 2-й этап повторяется 8 раз. 4.После 8-го импульса тактового сигнала происходит переполнение счетчика, указывающее на завершение обмена, при этом принятый байт находится в регистре данных USIDR. В заключение приведем примеры трех подпрограмм, демонстрирующих использование модуля USI в трехпроводном режиме. Первая подпрограмма реализует передачу одного байта данных ведущим устройством. Передаваемый байт содержится в регистре R16, по окончании обмена в этом же регистре находится принятый байт. Предполагается, что выводы DO и USCK уже настроены на выход. SPITransfer: sts USIDR,rl6; Загружаем сдвиговый регистр ldi rl6, (1«USI0IF) ; Сбрасываем флаг прерывания sts USISR,rl6; и счетчик SPITransfer loop: ldi rl6, (1«USIWM0) I (1«USICS1) I (1«USICLK) I (1«USITC) sts USICR,rl6; Задаем режим и переключаем USCK Ids rl6,USISR sbrs rl6,USI0IF; Проверяем флаг переполнения rjmp SPITransfer loop Ids rl6,USIDR; Запоминаем принятый байт ret Вторая подпрограмма выполняет те же самые функции, но при этом обеспечивается максимально возможная скорость передачи (/SCK =/ск/4). SPITransfer Fast: stsUSIDR,rl6 ldirl6, (1«USIWM0) I (1«USICS0) I (1«USITC) ldirl7, (1«USIWM0) I (1«USICS1) I (1«USITC) I (1«USICLK) stsUSICR, rl6; MSB stsUSICR,rl7 stsUSICR,rl6 stsUSICR,rl7 stsUSICR,rl6 stsUSICR,rl7 stsUSICR,rl6 stsUSICR,rl7 stsUSICR,rl6 stsUSICR,rl7 stsUSICR,rl6 stsUSICR,rl7 stsUSICR,rl6 stsUSICR,rl7 stsUSICR,rl6; LSB stsUSICR,rl7 Idsrl6,USIDR ret 0 ... 151 152 153 154 155 156 157 ... 195
|