Микросхема часов реального времени 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 в режим мастер, установка

Наши рекомендации