Микросхема часов реального времени DS1307
Отличительные особенности микросхемы:
− подсчет реального времени в секундах, минутах, часах, датах месяца, месяцах, днях недели и годах с учетом високосности текущего года вплоть до 2100 г.;
− 56 байт энергонезависимого ОЗУ для хранения данных;
− последовательный интерфейс TWI (I2C);
− программируемый генератор прямоугольных импульсов;
− автоматическое определение отключения основного источника питания и подключение резервного;
− потребление не более 500 нA при питании от резервной батареи питания при температуре 25 °C;
− возможность поставки в промышленном диапазоне температур от -40 °C до +85 °C .
Условное обозначение микросхемы приведено на рис. 7.6.
Рис. 7.6. Условное обозначение микросхемы DS1307
Микросхема DS1307 размещена в 8-контактном пластиковом корпусе типа DIP. Назначение выводов микросхемы DS1307 приведены в табл. 7.6.
Управление микросхемой осуществляется по последовательному TWI интерфейсу. Микросхема имеет 7-битный идентификатор 1101000.
Диапазон адресного пространства микросхемы приведен в табл. 7.7.
Время и календарь устанавливаются записью в соответствующие регистры. Бит 7 регистра 0 – бит остановки часов. Часы начинают работу после записи логического «0» в 7-й бит регистра 0.
Таблица 7.6
Назначение выводов микросхемы DS1307
Выводы | Номер | Назначение |
VCC | Основной источник питания | |
X1, X2 | 1, 2 | Подключение кварцевого резонатора 32,768 кГц |
VBAT | Подключения резервного питания (+3 В) | |
GND | Общий | |
SDA | Ввод-вывод данных в последовательном формате | |
SCL | Синхронизация последовательной связи | |
SQW/OUT | Выход генератора прямоугольных импульсов/ выход программируемого ключа |
Таблица 7.7
Адресное пространство
Адрес | Бит 7 | Бит 6 | Бит 5 | Бит 4 | Бит 3 | Бит 2 | Бит 1 | Бит 0 | Функция | Диапазон |
0x0 | CH | Десятки секунд | Секунды | Секунды | 00…59 | |||||
0x1 | Десятки минут | Минуты | Минуты | 00…59 | ||||||
0x2 | 12 24 | Десятки часов PM/AM | Десятки часов | Часы | Часы | 1…12 + AM/PM 0…23 | ||||
0x3 | День недели | День | 01…07 | |||||||
0x4 | Десятки даты | Дата | Дата | 01…31 | ||||||
0x5 | - | - | Десятки месяцев | Месяцы | Месяцы | 01…12 | ||||
0x6 | Десятки лет | Года | Года | 00…99 | ||||||
0x7 | OUT | SQWE | RS1 | RS0 | Управление | - | ||||
0x8… 0x3F | - | - | - | - | - | - | - | - | ОЗУ 56х8 | 0x0…0xFF |
7.6. Электрическая принципиальная схема
Электрическая принципиальная схема к данной лабораторной работе представлена в прил. 2. Для организации клавиатуры используются кнопки S1–S12, включенные по матричной схеме. Сигналы выбора ряда матрицы формируются на транзисторных ключах VT1, VT3, VT5 и VT7, управляемых выходами Q0–Q3 дешифратора DD3 HC138. Для управления дешифратором используются выходы порта микроконтроллера PC.0–PC.2. Для считывания состояния нажатых клавиш используются порты PC.5–PC.7. Для управления ЖКИ используются линии PF.0…PF.3, PE.2, PD.5 и PD.7 микроконтроллера, а для организации шины I2C – порты PD.0, PD.1.
Практическая часть
7.7. Контрольные вопросы
1. Как осуществляется объединение устройств по интерфейсу TWI (I2C)?
2. Каков формат пакетов, передаваемых по интерфейсу TWI?
3. Каковы условия СТАРТа и ОСТАНОВа?
4. Поясните принцип работы модуля TWI микроконтроллера.
5. Какие регистры управления шиной TWI вы знаете?
6. Опишите порядок инициализации шины.
7. Каково условное графическое обозначение микросхемы DS1307?
8. Что собой представляет адресное пространство микросхемы DS1307?
9. Приведите алгоритм передачи и приема информации микросхемой по шине TWI.
7.8. Варианты заданий
Разработать программу для учебного стенда НТЦ 31.100, позволяющую реализовать:
1. Часы реального времени с отображением времени на ДСИ.
2. Часы реального времени со срабатывающим «будильником» во время, введенное с клавиатуры с отображением всех значений на МЖКИ («будильник» выбрать самостоятельно).
3. Часы реального времени с дополнительным выведением на МЖКИ даты, номера месяца и дня недели.
4. Программу, в которой в установленное с клавиатуры время срабатывает ДД1.
5. Программу, в которой в установленное с клавиатуры время срабатывает ДД1. Информацию выводить на МЖКИ.
6. Программу, в которой через 10 секунд после включения стенда срабатывает ДД1.
7. Программу, в которой через 6 секунд после включения стенда загораются все сегменты ДСИ.
8. Программу, в которой через 8 секунд после включения стенда на МЖКИ выводится сообщение «Тревога!».
9. Секундомер с выводом информации на МЖКИ.
10. Секундомер с выводом информации на ДСИ.
11. Секундомер с выводом информации на ДСИ, который каждые 6 секунд увеличивает счетчик событий на 1.
12. Секундомер с выводом информации на МЖКИ, который каждые 8 секунд увеличивает счетчик событий на 1.
13. Таймер обратного отсчета с 15 секунд до нуля с отображением информации на ДСИ.
14. Таймер обратного отсчета с 15 секунд до нуля с отображением информации на МЖКИ.
15. Таймер обратного отсчета с заданием времени отсчета с клавиатуры и выводом информации на МЖКИ. При обнулении таймера выдать сообщение «Время вышло».
7.9. Пример выполнения лабораторной работы
Задача
Реализовать часы с выводом на МЖКИ.
Решение
.include "m128def.inc"
.cseg
.org 0000
jmp Init
Init: ;Инициализация указателя вершины стека
ldi R16,0x00 ;Формируем стек, начиная с ячейки памяти 0х400
out SPL,R16
ldi R17,0x04
out SPH,R17
sbi DDRD,5 ; R/W
sbi DDRD,7 ; RS
sbi DDRE,2 ; E
ldi R16,0b00001111 ; DB7..DB4
sts DDRF,R16
cbi PortD,5 ; R/W = 0 (Write)
;Задержка
ldi R17,0
dec R17
brne PC-1
dec R18
brne PC-3
cbi PortD,7 ;RS = 0
ldi R16,0b0011
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
dec R17
brne PC-1
dec R18
brne PC-3
ldi R16,0b0011
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
dec R17
brne PC-1
ldi R16,0b0011
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
ldi R16,0b0010 ;4-битный интерфейс
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
ldi R16,0b0010 ;Подтверждение 4-битного интерфейса
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
ldi R16,0b1000 ;N = 1, F = 0 (симв. матрица 5х7 пикселей)
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Гашение дисплея
ldi R16,0b0000
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
ldi R16,0b1000 ;D = 0, C = 0, B = 0
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Установка режима ввода
ldi R16,0b0000
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
ldi R16,0b0110 ;I/D = 1, S = 0
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Включение индикатора
ldi R16,0b0000
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
ldi R16,0b1111 ;D = 1, C = 1, B = 1
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Регистры для работы с TWI
clr r21
clr r22
clr r23
clr r25
;Регистры-счетчики
clr r17
clr r18
clr r19
;Регистр для работы с дисплеем:
clr r16
;Инициализация и2с
ldi r25,5 ;Задаем скорость связи по шине
sts TWBR,r25
;Загружаем коэффициент деления частоты генератора в регистр скор. связи
ldi r25,(0<<TWPS1)|(0<<TWPS0)
;Устанавливаем значение предделения скорости связи, равное 1
sts TWSR,r25
;Загружаем значение предделителя в регистр состояния шины
;Задание массива чисел для вывода на дисплей
ldi r26,0x00
ldi r27,0x03
;Задание массива чисел для записи после нажатия клавиши
ldi r28,0x00
ldi r29,0x03
;Очищаем область памяти массива
ldi r16,0x00
st x+,r16
andi r26,7
brne pc-3
clr r30
clr r31
rcall DS_Start ;Вызываем старт часов
start:
;Установка курсора в левом верхнем углу 0x80
cbi PortD,7 ;RS = 0 – установка дисплея на прием команд
ldi R16,0x8 ;Отправляем старшую тетраду команды
sts PortF,R16 ;Отправляем ее
sbi PortE,2 ;Активируем прием дисплеем
call delay ;Ждем
cbi PortE,2 ;Закрываем прием
ldi R16,0x0 ;Загружаем младшую тетраду команды
sts PortF,R16 ;Отправляем
sbi PortE,2 ;Активируем прием
call delay ;Ждем
cbi PortE,2 ;Завершаем прием
;Запись символа "В" 0x42
ldi r16,0x42
call lcd_print_symbol
;Запись символа "р" 0x70
ldi r16,70
call lcd_print_symbol
;Запись символа "е" 0x65
ldi r16,0x65
call lcd_print_symbol
;Запись символа "м" 0xBC
ldi r16,0xBC
call lcd_print_symbol
;Запись символа "я" 0xC7
ldi r16,0xC7
call lcd_print_symbol
;Запись символа " " 0x20
ldi r16,0x20
call lcd_print_symbol
;Запись символа " " 0x20
ldi r16,0x20
call lcd_print_symbol
rcallDS_get_time ;Считываем время с часов
;Запись первого символа значения часов
ldi R16,0x3
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
mov r16,r23
andi r16,0xf0
swap r16
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Запись второго символа значения часов
ldi R16,0x3
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
mov r16,r23
andi r16,0x0f
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Запись символа ":" 0x3A
ldi r16,0x3A
call lcd_print_symbol
;Запись первого символа значения минут
ldi R16,0x3
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
mov r16,r22
andi r16,0xf0
swap r16
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Запись второго символа значения минут
ldi R16,0x3
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
mov r16,r22
andi r16,0x0f
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Запись символа ":" 0x3A
ldi r16,0x3A
call lcd_print_symbol
;Запись первого символа значения секунд
ldi R16,0x3
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
mov r16,r21
andi r16,0xf0
swap r16
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Запись второго символа значения секунд
ldi R16,0x3
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
mov r16,r21
andi r16,0x0f
sts PortF,R16
sbi PortE,2
call delay
cbi PortE,2
;Запись символа " " 0x20
ldi r16,0x20
call lcd_print_symbol
jmpstart ;Возврат на начало программы
DS_Start: ;Процедура запускает ход часов
call i2c_start ;Отправляем стартовую посылку
ldi r25,0b11010000 ;Адрес микросхемы
call i2c_send ;Отправляем его в шину
ldi r25,0x00 ;Адрес ячейки памяти
call i2c_send ;Отправляем в шину
call i2c_start ;Повторная отправка стартовой посылки
ldi r25,0b11010001 ;Адрес микросхемы с битом чтения
call i2c_send ;Отправляем в шину
call i2c_recive_last ;Читаем нулевой байт
cbr r25,0b10000000 ;Сбрасываем 7-й бит
push r25 ;Сохраняем в стек
call i2c_stop ;Отправляем стоповую посылку
call i2c_start ;Отправляем стартовую посылку
ldi r25,0b11010000 ;Адрес микросхемы + бит записи
call i2c_send ;Отправляем в шину
ldi r25,0 ;Адрес ячейки памяти
call i2c_send ;Отправляем в шину
pop r25 ;Загружаем из стека
call i2c_send ;Отправляем в шину
call i2c_stop ;Завершаем
ret
DS_get_time:
;Считывание времени из часов DS1307
;Секунды будут записаны в R21, минуты в R22, часы в R23
Call i2c_start ;Отправляем стартовую посылку
ldi r25,0b11010000 ;Адрес микросхемы
call i2c_send ;Отправляем в шину
ldi r25,0x00 ;Адрес ячейки памяти
call i2c_send ;Отправляем в шину
call i2c_start ;Повторная отправка стартовой посылки
ldi r25,0b11010001 ;Адрес микросхемы с битом чтения
call i2c_send ;Отправляем в шину
call i2c_recive ;Читаем секунды
cbr r25,0b10000000 ;Сбрасываем 7-й бит
mov r21,r25 ;Копируем секунды в R21
call i2c_recive ;Читаем минуты
mov r22,r25 ;Копируем минуты в R22
rcall i2c_recive_last ;Читаем часы
mov r23,r25 ;Копируем часы в R23
call i2c_stop ;Отправляем стоповую посылку
ret
i2c_stop: ;Отправляет стоповую посылку
ldi r25, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
;Устанавливаем бит прерывания, бит разрешения работы, бит "Стоп"
sts TWCR, r25 ;Загружаем установленные биты в регистр ;управления
ret
i2c_start: ;Передача стартовой посылки
ldi r25, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
;Устанавливаем биты прерыв., условия "старт" и разреш. работы шины
sts TWCR, r25
;Отправляем установленные биты в регистр управления работой шины
wait1: ;Ждем подтверждения
lds r25,TWCR
;Загружаем значение регистра управления шиной
sbrs r25,TWINT ;Проверяем, установлен ли флаг прерываний
jmp wait1 ;Если нет, прыгаем обратно на wait1, если да, то
;выходим из подпрограммы
ret
i2c_recive_last: ;Считать последний байт и записать в R25
ldi r25, (1<<TWINT|1<<TWEN)
;Устанавливаем биты прерывания и бит разрешения работы
sts TWCR, r25
;Загружаем установленные биты в регистр управления
wait3: ;Ждем получения
lds r25,TWCR ;Загружаем в R25 значение регистра управления
;шиной
sbrs r25,TWINT ;Проверяем, установлен ли бит прерываний
jmp wait3 ;Если нет – ждем дальше
lds r25,TWDR ;Если да, считываем в R25 пришедшие данные
ret ;Выходим из подпрограммы
i2c_recive: ;Считывает байт и записывает его в R25
ldi r25, (1<<TWINT|1<<TWEN|1<<TWEA)
;Устанавливаем биты прерыв., разреш. работы и бит условия "Старт"
sts TWCR, r25 ;Загружаем эти биты в регистр управления
;шиной
wait4: ;Ждем получения
lds r25,TWCR ;Загружаем значение регистра управления шиной
sbrs r25,TWINT ;Проверяем, установлен ли бит прерываний
jmp wait4 ;Если нет – ждем дальше
lds r25,TWDR ;Если да – загружаем в R25 значение регистра
;данных шины
ret ;Выход из подпрограммы
i2c_send: ;Передача байта из регистра R25
sts TWDR,r25 ;Загружаем в регистр данных значение R25
ldi r25, (1<<TWINT)|(1<<TWEN)
;Устанавливаем биты прерываний и разрешения работы
Sts TWCR, r25
;Загружаем биты в регистр управления работой шины
wait2: ;Ждем подтверждения
lds r25,TWCR ;Проверяем значение регистра управления
;работой шиной
sbrs r25,TWINT ;Если флаг прерываний установлен, то передача
;завершена
rjmp wait2 ;Если нет, ждем дальше
ret
lcd_print_symbol: ;Запись символа на ЖК дисплей
sbi PortD,7 ;RS = 1 – установка дисплея на прием символов
mov r17,r16 ;Копируем выводимый символ в R16
andi r16,0xF0 ;Удаляем младшую тетраду из R16
swap r16 ;Меняем местами тетрады
sts PortF,R16 ;Отправляем эту тетраду на дисплей
sbi PortE,2 ;Включаем прием
call delay
cbi PortE,2 ;Выключаем прием
mov r17,r16 ;Снова копируем в R16
andi r16,0x0F ;Удаляем старшую тетраду – остается только
;младшая
sts PortF,R16 ;Отправляем ее на дисплей
sbi PortE,2 ;Включаем прием
call delay
cbi PortE,2 ;Выключаем прием
ret ;Выход из подпрограммы
delay: ;Блок задержки
clr r17 ;Очищаем используемый регистр
dec r17 ;Уменьшаем на единицу
brne pc-1 ;Если не ноль – возвращаемся на уменьшение
ret ;Если ноль – выход их подпрограммы
;Конец программы
Содержание отчета по лабораторной работе: цель работы, задание, листинг программы, вывод.
ЛАБОРАТОРНАЯ РАБОТА №8
ИССЛЕДОВАНИЕ ОРГАНИЗАЦИИ И РАБОТЫ
ПОСЛЕДОВАТЕЛЬНОГО ПЕРИФЕРИЙНОГО ИНТЕРФЕЙСА SPI
Цель работы: ознакомиться с последовательным периферийным интерфейсом SPI, микросхемой энергонезависимой памяти, изучить схему сопряжения микросхемы энергонезависимой памяти DATAFLASH с микроконтроллером, разработать и отладить программу для обслуживания устройства.
Теоретическая часть
8.1. Приборная шина SPI
SPI – популярный интерфейс для последовательного обмена данными между микросхемами. Интерфейс SPI наряду с I2C относится к самым широко используемым интерфейсам для соединения микросхем. Изначально он был реализован компанией Motorola, а в настоящее время используется в продукции многих производителей. Его наименование является аббревиатурой от «Serial Peripheral Bus», что отражает его предназначение – шина для подключения внешних устройств. Шина SPI организована по принципу «ведущий-подчиненный».
Главным составным блоком интерфейса SPI является обычный сдвиговый регистр, сигналы синхронизации и ввода/вывода битового потока которого и образуют интерфейсные сигналы. Таким образом, протокол SPI правильнее назвать не протоколом передачи данных, а протоколом обмена данными между двумя сдвиговыми регистрами, каждый из которых одновременно выполняет и функцию приемника, и функцию передатчика. Непременным условием передачи данных по шине SPI является генерация сигнала синхронизации шины. Этот сигнал имеет право генерировать только ведущий шины и от этого сигнала полностью зависит работа подчиненного шины.
Существует три типа подключения к шине SPI, в каждом из которых участвуют четыре сигнала. Самое простое подключение, в котором участвуют только две микросхемы, показано на рис. 8.1. Здесь ведущий шины передает данные по линии MOSI синхронно со сгенерированным им же сигналом SCLK, а подчиненный захватывает переданные биты данных по определенным фронтам принятого сигнала синхронизации. Одновременно с этим подчиненный отправляет свою посылку данных. Представленную схему можно упростить исключением линии MISO, если используемая подчиненная ИС не предусматривает ответную передачу данных или в ней нет потребности. Одностороннюю передачу данных можно встретить у таких микросхем, как ЦАП, цифровые потенциометры, программируемые усилители и драйверы. Таким образом, рассматриваемый вариант подключения подчиненной ИС требует 3 или 4 линии связи. Чтобы подчиненная ИС принимала и передавала данные, кроме наличия сигнала синхронизации, необходимо также, чтобы линия SS была переведена в низкое состояние. В противном случае подчиненная ИС будет неактивна.
Рис. 8.1. Простейшее подключение к шине SPI
При необходимости подключения к шине SPI нескольких микросхем используется либо независимое (параллельное) подключение (рис. 8.2), либо каскадное (последовательное) (рис. 8.3). Независимое подключение более распространенное, т. к. достигается при использовании любых SPI-совместимых микросхем. Здесь все сигналы, кроме выбора микросхем, соединены параллельно, а ведущий шины переводом того или иного сигнала SS в низкое состояние задает, с какой подчиненной ИС он будет обмениваться данными. Главным недостатком такого подключения является необходимость в дополнительных линиях для адресации подчиненных микросхем (общее число линий связи равно 3 + n, где n – количество подчиненных микросхем). Каскадное включение избавлено от этого недостатка, т. к. здесь из нескольких микросхем образуется один большой сдвиговый регистр. Для этого выход передачи данных одной ИС соединяется со входом приема данных другой, как показано на рис. 8.3. Входы выбора микросхем здесь соединены параллельно и, таким образом, общее число линий связи сохранено равным 4. Однако использование каскадного подключения возможно только в том случае, если его поддержка указана в документации на используемые микросхемы.
Рис. 8.2. Независимое подключение к шине SPI
Протокол передачи по интерфейсу SPI предельно прост и, по сути, идентичен логике работы сдвигового регистра, которая заключается в выполнении операции сдвига и, соответственно, побитного ввода и вывода данных по определенным фронтам сигнала синхронизации. Установка данных при передаче и выборка при приеме всегда выполняются по противоположным фронтам синхронизации. Это необходимо для гарантирования выборки данных после надежного их установления.
Рис. 8.3. Каскадное подключение к шине SPI
Электрические сигналы шины SPI представлены в табл. 8.1.
Таблица 8.1
Электрические сигналы шины SPI
Ведущий шины | Подчиненный шины | ||||
Основное обозначение | Альтернативное обозначение | Описание | Основное обозначение | Альтернативное обозначение | Описание |
MOSI | DO SDO OUT | Выход последовательной передачи данных | MOSI | DO SDO OUT | Выход последовательной передачи данных |
MISO | DI SDI DIN | Вход последовательного приема данных | MISO | DI SDI DIN | Вход последовательного приема данных |
SCLK | DCLOCK CLK SCK | Выход синхронизации передачи данных | SCLK | DCLOCK CLK SCK | Вход синхронизации передачи данных |
SS | CS | Выход выбора подчиненного | SS | CS | Вход выбора подчиненного |
В качестве первого фронта в цикле передачи может выступать нарастающий или падающий фронт, то всего возможно четыре варианта логики работы интерфейса SPI. Эти варианты получили название режимов SPI и описываются двумя параметрами:
1. CPOL – исходный уровень сигнала синхронизации (если CPOL = 0, то линия синхронизации до начала цикла передачи и после его окончания имеет низкий уровень, (т. е. первый фронт нарастающий, а последний – падающий), иначе, если CPOL = 1 – высокий (т. е. первый фронт падающий, а последний – нарастающий));
2. CPHA – фаза синхронизации. От этого параметра зависит, в какой последовательности выполняется установка и выборка данных (если CPHA = 0, то по переднему фронту в цикле синхронизации будет выполняться выборка данных, а затем по заднему фронту – установка данных; если же CPHA = 1, то установка данных будет выполняться по переднему фронту в цикле синхронизации, а выборка – по заднему).
Ведущая и подчиненная микросхемы, работающие в различных режимах SPI, являются несовместимыми, поэтому перед выбором подчиненных микросхем важно уточнить, какие режимы поддерживаются ведущим шины. Аппаратные модули SPI, интегрированные в микроконтроллеры, в большинстве случаев поддерживают возможность выбора любого режима SPI и, поэтому к ним возможно подключение любых подчиненных SPI-микросхем (относится только к независимому варианту подключения). Кроме того, протокол SPI в любом из режимов легко реализуется программно.
8.2. Реализация интерфейса SPI в микроконтроллерах ATMega
Отличительными особенностями интерфейса SPI (рис. 8.4) в микроконтроллерах ATmega128 являются:
– полнодуплексная, трехпроводная синхронная передача данных;
– ведущая или подчиненная работа;
– передача первым младшего или старшего бита;
– семь программируемых скоростей связи;
– флаг прерывания для индикации окончания передачи данных;
– защитный флаг при повторной записи;
– пробуждение из режима холостого хода (Idle);
– режим ведущего (мастера) SPI с удвоением скорости (CK/2).
Ведущий SPI инициирует сеанс связи подачей низкого уровня на вход SS того подчиненного устройства, с которым необходимо обмениваться данными. Оба респондента (ведущий и подчиненный) подготавливают данные к передаче в своем сдвиговом регистре, при этом на стороне ведущего генерируются также импульсы синхронизации на линии SCK. По линии MOSI всегда осуществляется передача данных от ведущего к подчиненному, а по MISO, наоборот, от подчиненного к мастеру. По окончании передачи каждого пакета данных ведущий SPI должен засинхронизировать подчиненный путем подачи высокого уровня на линию SS (выбор подчиненного интерфейса).
Рис. 8.4. Функциональная схема интерфейса SPI
Если SPI настроен как ведущий (мастер), то управление линией SS происходит не автоматически. Данная операция должна быть выполнена программно перед началом сеанса связи. После этого запись в регистр данных SPI инициирует генерацию синхронизации и аппаратный сдвиг восьми разрядов в подчиненное устройство. По окончании сдвига одного байта генератор синхронизации SPI останавливается, при этом устанавливая флаг окончания передачи (SPIF). Если установлен бит SPIE в регистре SPCR, то разрешается прерывание SPI и по окончании передачи байта будет генерирован запрос на прерывание. Мастер может продолжить сдвигать следующий байт, если записать его в регистр SPDR, или подать сигнал окончания пакета путем установки низкого уровня на линии SS. Последний принятый байт сохраняется в буферном регистре. В режиме подчиненного интерфейс SPI находится в состоянии ожидания, в котором MISO переводится в третье состояние до тех пор, пока на выводе SS присутствует высокий уровень. В этом состоянии программа может обновлять содержимое регистра данных SPI (SPDR), но при этом входящие импульсы синхронизации не сдвигают данные до подачи низкого уровня на вывод SS. После того, как один байт был полностью сдвинут, устанавливается флаг окончания передачи SPIF. Если установлен бит разрешения прерывания SPI (SPIE) в регистре SPCR (табл. 8.2), то установка флага SPIF приводит к генерации запроса на прерывание. Подчиненный может продолжать размещать новые данные для передачи в регистр SPDR перед чтением входящих данных. Последний принятый байт хранится в буферном регистре.
В направлении передачи данных система выполнена как однобуферная, а в направлении приема используется двойная буферизация. Это означает, что передаваемые байты не могут быть записаны в регистр данных SPI прежде, чем полностью завершится цикл сдвига. Во время приема данных необходимо следить, чтобы принятая посылка была считана из регистра данных SPI прежде, чем завершится цикл входящего сдвига новой посылки. В противном случае первый байт будет потерян.
В подчиненном режиме SPI управляющая логика осуществляет выборку входящего сигнала SCK. Чтобы гарантировать корректность выборки тактового сигнала необходимо использовать частоту синхронизации SPI не более fosc/4.
Таблица 8.2
Регистр управления SPI – SPCR
Разряд | ||||||||
Имя | SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |
Чтение/ запись | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп |
Исходное значение |
Разряд 7 – SPIE: Разрешение прерывания SPI
Если установлен флаг SPIF в регистре SPSR (табл. 8.3) и установлен бит общего разрешения прерываний I в регистре SREG, то установка данного бита приведет к исполнению процедуры обработки прерывания по SPI.
Разряд 6 – SPE: Разрешение SPI
Если в SPE записать логическую «1», то разрешается работа SPI. Данный бит должен быть установлен, если необходимо использовать SPI независимо от того, в каком режиме он будет работать.
Разряд 5 – DORD: Порядок сдвига данных
Если DORD = 1, то при передаче слова данных первым передается младший разряд. Если же DORD = 0, то первым передается старший разряд.
Разряд 4 – MSTR: Выбор ведущего/подчиненного
Если в данный бит записана логическая «1», то SPI работает как ведущий (мастер), иначе (MSTR = 0) как подчиненный. Если SS настроен как вход и к нему приложен низкий уровень, когда MSTR был равен 1, то бит MSTR автоматически сбрасывается и устанавливается флаг прерывания SPIF в регистре SPSR. Для возобновления ведущего режима SPI пользователь должен предусмотреть программную установку бита MSTR.
Разряд 3 – CPOL: Полярность синхронизации
Если данный бит равен логической «1», то SCK имеет высокий уровень в состоянии ожидания. Если CPOL = 0, то SCK имеет низкий уровень в состоянии ожидания.
Разряд 2 – CPHA: Фаза синхронизации
Значение бита фазы синхронизации (CPHA) определяет, по какому фронту SCK происходит выборка данных: по переднему или заднему.
Разряды 1, 0 – SPR1, SPR0: Биты 1 и 0 выбора частоты синхронизации
Данные биты задают частоту синхронизации (табл. 8.4) на выводе SCK в режиме мастера. SPR1 и SPR0 не оказывают никакого влияния в режиме подчиненного.
Таблица 8.3
Регистр статуса SPI – SPSR
Разряд | ||||||||
Имя | SPIF | WCOL | - | - | - | - | - | SPI2X |
Чтение/ запись | Чт | Чт | Чт | Чт | Чт | Чт | Чт | Чт/Зп |
Исходное значение |
Таблица 8.4
Выбор частоты синхронизации
SPI2X | SPR1 | SPR0 | Частота SCK |
fosc/4 | |||
fosc/16 | |||
fosc/64 | |||
fosc/128 | |||
fosc/2 | |||
fosc/8 | |||
fosc/32 | |||
fosc/64 |
Разряд 7– SPIF: Флаг прерывания по SPI
Флаг SPIF устанавливается по завершении последовательной передачи. Прерывание генерируется в том случае, если установлен бит SPIE в регистре SPCR и разрешены общие прерывания. Если SS настроен как вход и к нему приложен низкий уровень, то, если SPI находился в режиме мастера, также установится флаг SPIF. SPIF сбрасывается аппаратно при переходе на соответствующий вектор прерывания. Альтернативно, бит SPIF сбрасывается при первом чтении регистра статуса SPI с установленным флагом SPIF, а также во время доступа к регистру данных SPI (SPDR) (табл. 8.5).
Разряд 6 – WCOL: Флаг повторной записи
Бит WCOL устанавливается, если выполнена запись в регистр данных SPI (SPDR) во время передачи данных. Бит WCOL (а также бит SPIF) сбрасывается при первом чтении регистра статуса SPI с установленным WCOL, а также во время доступа к регистру данных SPI.
Разряды 5…1 – Res: зарезервированные биты
В микроконтроллере ATmega128 данные биты не используются и всегда считываются как логический «0».
Разряд 0 – SPI2X: Бит удвоения скорости SPI
Если в данный бит записать логическую «1», то скорость работы SPI (частота SCK) удвоится, если SPI находится в режиме мастера, это означает, что минимальный период SCK будет равен двум периодам синхронизации ЦПУ. Если SPI работает как подчиненный, то работа SPI гарантирована только на частоте fosc/4 или менее.
Таблица 8.5
Регистр данных SPI – SPDR
Разряд | ||||||||
Чтение/ запись | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп | Чт/Зп |
Исходное значение | х | х | х | х | х | х | х | х |
Регистр данных SPI имеет доступ на чтение и запись и предназначен для обмена данными между файлом регистров (R0–R31) и сдвиговым регистром SPI. Запись в данный регистр инициирует передачу данных. При чтении данного регистра фактически считывается содержимое приемного буфера сдвигового регистра.
8.3. Микросхема Flash памяти (DataFlash) AT45DB041B
Отличительными особенностями микросхемы AT45DB041B являются:
- однополярное напряжение питания 2,5…3,6 В или 2,7…3,6 В;
- совместимость с последовательным периферийным интерфейсом типа SPI;
- максимальная тактовая частота 20 МГц;
- постраничный режим программирования;
- одиночный цикл перепрограммирования (стирание плюс программирование);
- 2048 страниц основной памяти (264 байта на страницу);
- поддержка страничного и блочного режимов стирания;
- два 264-байтных буфера данных SRAM, обеспечивающих прием данных в режиме перепрограммирования энергонезависимой памяти;
- поддержка режима непрерывного считывания полного массива данных;
- поддержка приложений теневого дублирования кода;
- низкое энергопотребление: 4 мА – типичный ток в режиме активного чтения, 2 мкА – типичный потребляемый ток КМОП в режиме ожидания;
- аппаратная функция защиты данных;
- входы сигналов SI, SCK, CS (активный низкий), RESET (активный низкий) и WP (активный низкий) устойчивы к логическим уровням 5 В.
Условное обозначение микросхемы представлено на рис. 8.5, назначение выводов приведены в табл. 8.6, а структура микросхемы – на рис. 8.6.
Рис. 8.5. Условное обозначение микросхемы AT45DB041B
Таблица 8.6
Назначение выводов микросхемы AT45DB041B
Наименование вывода | Назначение |
CS (активный низкий) | Вход выбора подчиненного |
SCK | Вход синхронизации |
SI | Последовательный вход |
SO | Последовательный выход |
WP (активный низкий) | Вход защиты записи памяти |
VCC | Питание |
GND | Общий |
4 325 376 бит памяти данной микросхемы организованы в 2048 страницах по 264 байта каждая. Кроме памяти общего назначения, микросхема также имеет два SRAM буфера данных по 264 байта. Буферы обеспечивают возможность приема данных в режиме перепрограммирования страницы основной памяти, или считывание, или запись непрерывных потоков данных. Режим эмуляции EEPROM (с побитным или побайтным изменением) прост в применении благодаря встроенной 3-ступенчатой системе команд Read – Modify – Write. Память типа DataFlash использует последовательный интерфейс для обращения к своим данным в режиме последовательного доступа. Микросхема поддерживает SPI – режимы типа 0 и 3, функционирует с тактовыми частотами, вплоть до 20 МГц при типовом потребляемом токе в режиме активного чтения 4 мА.
Рис. 8.6. Структура микросхемы AT45DB041B
Для обеспечения удобства внутрисистемного перепрограммирования микросхема не требует высоких входных напряжений в режиме программирования. Питание осуществляется от однополярного источника с напряжением 2,5…3,6 В или 2,7…3,6 В как в режиме программирования, так и в режиме чтения.
Матрица памяти AT45DB041B разделена на три уровня, включающих сектора, блоки и страницы. Работа устройства управляется командами, поступающими от главного процессора. Список команд и их соответствующие коды операций приведены в табл. 8.7–8.9.
Таблица 8.7
Команды чтения
Команда | Код операции |
Непрерывное чтение массива | 68h |
Чтение страницы основной памяти | 52h |
Чтение буфера 1 | 54h |
Чтение буфера 2 | 56h |
Чтение регистра состояния | 57h |
Команда начинается по заднему фронту сигнала CS, за которым следует соответствующий 8-битный код операции и адресная ячейка требуемого буфера или основной памяти. Пока на выводе низкий уровень, переключение вывода SCK управляет загрузкой кода операции и адресной ячейки нужного буфера или основной памяти через вывод SI (последовательный вход). Все команды, адреса и данные передаются, начиная со старшего бита. Чтение происходит в режиме SPI0 или 3.
Все циклы программирования имеют встроенный контроль временных характеристик, а для проведения программирования предварительный цикл стирания не требуется.
Таблица 8.8
Команды записи и стирания
Команда | Код операции |
Запись буфера 1 | 84h |
Запись буфера 2 | 87h |
Запись буфера 1 в страницу основной памяти со встроенным стиранием | 83h |
Запись буфера 2 в страницу основной памяти со встроенным стиранием | 86h |
Запись буфера 1 в страницу основной памяти без встроенного стирания | 88h |
Запись буфера 2 в страницу основной памяти без встроенного стирания | 89h |
Стирание страницы | 81h |
Стирание блока | 50h |
Запись страницы основной памяти через буфер 1 | 82h |
Запись страницы основной памяти через буфер 2 | 85h |
Таблица 8.9
Дополнительные команды
Команда | Код операции |
Передача страницы основной памяти в буфер 1 | 53h |
Передача страницы основной памяти в буфер 2 | 55h |
Сравнение страницы основной памяти с буфером 1 | 60h |
Сравнение страницы основной памяти с буфером 2 | 61h |
Автоматическая перезапись страницы через буфер 1 | 58h |
Автоматическая перезапись страницы через буфер 2 | 59h |
Побитовая детализация адресной последовательности представлена в табл. 8.10.
Таблица 8.10
Побитовая детализация адресной последовательности
Код операции (HEX) | Адресный байт | Адресный байт | Адресный байт | Доп. биты | |||||||||||||||||||||
r | r | r | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | x | x | x | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | B | B | B | B | B | B | B | B | B | 4 байта | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | x | Нет | |
x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | B | B | B | B | B | B | B | B | B | 1 байт | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | B | B | B | B | B | B | B | B | B | Нет | |
x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | B | B | B | B | B | B | B | B | B | 1 байт | |
Нет | Нет | Нет | Нет | ||||||||||||||||||||||
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | B | B | B | B | B | B | B | B | B | 4 байта | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | B | B | B | B | B | B | B | B | B | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | Нет | |
x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | B | B | B | B | B | B | B | B | B | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | B | B | B | B | B | B | B | B | B | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | Нет | |
x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | B | B | B | B | B | B | B | B | B | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | Нет | |
r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | x | x | x | x | x | x | x | x | x | Нет | |
D2 | r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | B | B | B | B | B | B | B | B | B | 4 байта |
D4 | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | B | B | B | B | B | B | B | B | B | 1 байт |
D6 | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | B | B | B | B | B | B | B | B | B | 1 байт |
D7 | Нет | Нет | Нет | Нет | |||||||||||||||||||||
E8 | r | r | r | P | P | P | P | P | P | P | P | P | P | P | P | B | B | B | B | B | B | B | B | B | 4 байта |
8.4. Электрическая принципиальная схема к лабораторной работе
В электрической принципиальной схеме стенда НТЦ-31.100 (рис. 8.7) организована последовательная шина.
Рис. 8.7. Электрическая принципиальная схема
Для выбора конкретного устройства на шине используется набор сигналов CS0–CS7. Эти сигналы формируются на выходах дешифратора DD4 74HC138 (К1564ИД7). Для формирования кода выбираемого устройства используются порты PB.0, PB.4 и PB.5.
Для организации клавиатуры используются кнопки S1–S12, включенные по матричной схеме. Сигналы выбора ряда матрицы формируются на транзисторных ключах VT1, VT3, VT5 и VT7, управляемых выходами Q0–Q3 дешифратора DD3HC138. Для управления дешифратором используются выходы порта микроконтроллера PC.0 – PC.2, для считывания состояния нажатых клавиш – порты PC.5–PC.7, для управления жидкокристаллическим индикатором – линии PF.0–PF.3, PE.2, PD.5 и PD.7 микроконтроллера.
Практическая часть
8.5. Контрольные вопросы
1. Опишите принцип работы интерфейса SPI.
2. Какие способы подключения устройств к шине SPI Вы знаете?
3. Как реализован интерфейс SPI в микроконтроллерах ATMega?
4. Какие регистры управления интерфейсом Вы знаете?
5. Опишите структуру микросхемы AT45DB041B.
6. Каков алгоритм отправки информации по шине SPI?
7. Каков алгоритм приема информации по шине SPI?
8.6. Варианты заданий
Напишите программу для стенда НТЦ 31.100, позволяющую:
1. Записать в основную FLASH-память микросхемы AT45DB041B вводимые с клавиатуры символы, а при нажатии клавиши «#» – загрузить их из FLASH-памяти с выводом на ДСИ.
2. Записать в основную FLASH-память микросхемы AT45DB041B вводимые с клавиатуры символы, а при нажатии клавиши «*» – загрузить их из FLASH-памяти с выводом на МЖКИ.
3.Записать в буфер 1-й микросхемы AT45DB041B вводимые с клавиатуры символы, а при нажатии клавиши «*» – загрузить их из FLASH-памяти с выводом на ДСИ.
4. Записать в буфер 1-й микросхемы AT45DB041B вводимые с клавиатуры символы, а при нажатии клавиши «#» – загрузить их из FLASH-памяти с выводом на МЖКИ.
5. Записать в буфер 2-й микросхемы AT45DB041B вводимые с клавиатуры символы, а при нажатии клавиши «#» – загрузить их из FLASH-памяти с выводом на ДСИ.
6. Записать в буфер 2-й микросхемы AT45DB041B вводимые с клавиатуры символы, а при нажатии клавиши «*» – загрузить их из FLASH-памяти с выводом на МЖКИ.
7. Ввести двухзначное число и вычесть из него двухзначное число, хранящееся в AT45DB041B.
8. Ввести двухзначное число и сложить его с двухзначным числом, хранящемся в AT45DB041B.
9. Ввести двухзначное число и выполнить операцию поразрядное ИЛИ с двухзначным числом, хранящемся в AT45DB041B.
10. Ввести двухзначное число и перемножить его с двухзначным числом, хранящемся в AT45DB041B.
11. Ввести двухзначное число и выполнить операцию поразрядное исключающее ИЛИ с двухзначным числом, хранящемся в AT45DB041B.
12. Ввести двухзначное число и выполнить операцию поразрядное И с двухзначным числом, хранящемся в AT45DB041B.
13. Ввести двухзначное число, вывести на МЖКИ предупреждение, если это число равно хранящемуся в AT45DB041B.
14. Ввести двухзначное число, вывести на МЖКИ предупреждение, если это число больше, чем хранящееся в AT45DB041B.
15. Ввести двухзначное число, вывести на МЖКИ предупреждение, если это число меньше, чем хранящееся в AT45DB041B.
8.7. Пример выполнения лабораторной работы
Задача
Разработать программу для учебного стенда НТЦ-31.100, позволяющую выводить на ЖК дисплей содержимое ячеек 100h и 101h основной памяти микросхемы AT45DB041B.
Решение
.include "m128def.inc"
.cseg
.org 0000
jmp Init
Init:
;Инициализация указателя вершины стека
ldi R16,0x00 ;Формируем стек, начиная с ячейки памяти 0х400
out SPL,R16
ldi R17,0x04
out sph,r17
jmp LCD_INIT ;Инициализация работы ЖК дисплея
complete:
;Настройка SPI для работы с flash
sbi DDRB,0 ;Настраиваем линии порта В на передачу
sbi DDRB,4
sbi DDRB,5
;Устанавливаем нужные линии порта В для выбора микросхемы
cbi PORTB,0
cbi PORTB,4
cbi PORTB,5
;Установка линий MOSI и SCK на вывод
ldi r17,(1<<DDB2)|(1<<DDB1) out ddrb,r17
;Перевод SPI в режим мастер, установка скорости связи fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
start:
;Снимаем слово с FLASH-памяти и заносим его в регистры R21 и R22
call dataflash_read
;Вывод информации на ЖК дисплей
;Установка курсора в левом верхнем углу 0x80
cbi PortD,7 ;RS = 0 – установка дисплея на прием команд
ldi R16,0x8 ;Отправляем старшую тетраду команды
sts PortF,R16 ;Отправляем ее
sbi PortE,2 ;Активируем прием дисплеем
clr r14
dec r14
brne pc-1 ;Ожидаем
cbi PortE,2 ;Закрываем прием
ldi R16,0x0 ;Загружаем младшую тетраду команды
sts PortF,R16 ;Отправляем
sbi PortE,2 ;Активируем прием
clr r14
dec r14
brne pc-1 ;Ожидаем
cbi PortE,2 ;Завершаем прием
sbi PortD,7 ;RS = 1– установка дисплея на прием символов
;Запись символа "F" 0x46
ldi r20,0x46
call lcd_print_symbol
;Запись символа "l" 0x6C
ldi r20,0x6C
call lcd_print_symbol
;Запись символа "a" 0x61
ldi r20,0x61
call lcd_print_symbol
;Запись символа "s" 0x73
ldi r20,0x73
call lcd_print_symbol
;Запись символа "h" 0x68
ldi r20,0x68
call lcd_print_symbol
;Запись символа " " 0x20
ldi r20,0x20
call lcd_print_symbol
;Запись символа " " 0x20
ldi r20,0x20
call lcd_print_symbol
;Запись первого символа
mov r20,r21
andi r20,0xF0
swap r20
call lcd_print_number
;Запись второго символа
mov r20,r21
andir20,0x0f
call lcd_print_number
;Запись третьего символа
mov r20,r22
andir20,0xF0
swap r20
call lcd_print_number
;Запись четвертого символа
mov r20,r22
andi r20,0x0f
call lcd_print_number
jmp start ;Возвращаемся на старт
;Блок подпрограмм
dataflash_read: ;Операция чтения с FLASH-памяти
;Выдаем низкий сигнал на линию SC, чтобы включить устройство
sbi PORTB,0
ldi r20,0x52 ;Код команды чтения
call spi_send
ldi r20,0ч00 ;Первый байт адреса
call spi_send
ldi r20,0x01 ;Второй байт адреса
call spi_send
ldi r20,0x00 ;Третий байт адреса
call spi_send
ldi r20,0x00 ;Незначимый байт
call spi_send
ldi r20,0x00 ;Незначимый байт
call spi_send
ldi r20,0x00 ;Незначимый байт
call spi_send
;Принимаем ответ
call spi_recieve
mov r21,r20 ;Сохраняем принятый байт
;Выдаем высокий сигнал на линию SC, чтобы отключить устройство
cbi PORTB,0
;Выдаем низкий сигнал на линию SC, чтобы включить устройство
sbi PORTB,0
ldi r20,0x52 ;Код команды чтения
call spi_send
ldi r20,0x00 ;Первый байт адреса
call spi_send
ldi r20,0x01 ;Второй байт адреса
call spi_send
ldi r20,0x01 ;Третий байт адреса
call spi_send
ldi r20,0x00 ;Незначимый байт
call spi_send
ldi r20,0x00 ;Незначимый байт
call spi_send
ldi r20,0x00 ;Незначимый байт
call spi_send
ldi r20,0x00 ;незначимый байт
call spi_send
call spi_recieve ;Принимаем ответ
mov r22,r20 ;Сохраняем принятый байт
;Выдаем высокий сигнал на линию SC, чтобы отключить устройство
cbi PORTB,0
ret
SPI_send: ;Операция посылки данных в шину
;Загрузка отправляемых данных в регистр данных SPI
out SPDR,r20
;Перевод SPI в режим мастер, установка