Микроконтроллеры для систем автоматики - часть 24

 

  Главная      Учебники - Производство     

 

поиск по сайту           правообладателям

 

 

 

 

 

 

 

 

 

содержание   ..  22  23  24  25   ..

 

 

Микроконтроллеры для систем автоматики - часть 24

 

 

 

95 

º 

Бит 5 – UDRIE (UART Data Register Empty Interrupt Enable) - Разрешение 
прерывания по пустому регистру данных. При установленном в состояние 1 
бите UDRIE и  установленном  разрешении  глобального  прерывания 
установка  бита UDRE в  регистре USR приведет к выполнению прерывания 
по пустому регистру данных UART.  

º 

Бит 4 – RXEN (Receiver Enable) - разрешение приемника. Установленный в 
состояние 1 бит RXEN разрешает приемник UART. Если приемник запрещен, 
то  флаги  статуса TXC, DOR и FE установить  невозможно.  Если  эти  флаги 
установлены, то очистка бита RXEN не приведет к очистке этих флагов.  

º 

Бит 3 – TXEN (Transmitter Enable) - разрешение передатчика. Установленный 
в  состояние  1  бит TXEN разрешает  передатчик UART. При  запрещении 
передатчика во время передачи символа, передатчик не будет заблокирован 
прежде, чем будут полностью переданы символ в сдвиговом регистре плюс 
любой находящийся в UDR следующий символ.  

º 

Бит 2 - CHR9 (9 Bit Characters) - режим 9-разрядных  символов.  При 
установленном  в  состояние  1  бите CHR9 передаются  и  принимаются 9 -
разрядные  символы  плюс  стартовый  и  стоповый  биты.  Девятые  биты 
читаются  и  записываются  с  использованием  битов RXB8 и TXB8 
(соответственно) 

регистра UCSRA. Девятый  бит  данных  может 

использоваться  как  дополнительный  стоповый  бит  или  бит  контроля 
четности.  

º 

Бит  1 - RXB8 (Receive Data Bit 8) - прием 8-разрядных  данных.  При 
установленном в состояние 1 бите CHR9 бит RXB8 является девятым битом 
данных принятого символа.  

º 

Бит 0 - TXB8 (Transmit Data Bit 8) - передача 8-разрядных  данных.  При 
установленном в состояние 1 бите CHR9 бит TXB8 является девятым битом 
данных передаваемого символа.  

П

Р О Г Р А М М И Р О В А Н И Е  

U A R T  

При  программировании  UART в  простейшем  случае  решаются  три  задачи: 

инициализация UART(задание  режимов  работы),  организация  приема  данных  и 
организация передачи данных. 

Примером 

инициализирующей 

подпрограммы 

может 

быть 

следующая 

последовательность команд: 

   

.def tmp =r20 

Init_uart: ldi 

tmp,0b00011101  ;Инициализация UART 

  

out 

UCR,tmp 

;TXEN=1,RXEN=1,СРH9=1,TXB8=1 

 

 ldi 

tmp,25 

 ;9600 

бит/c при fclk=4МГц 

  

out 

UBRR,tmp 

  

ret 

Если  микропроцессор  использует  последовательный  канал  для  коротких 

однобайтных  сообщений,  то  передавать  и  принимать  данные  можно,  просто  опрашивая 
флаги  готовности  передатчика  и  приемника UART. При  передаче  байта  в 
последовательный канал все, что должен сделать процессор – дождаться установки флага 
готовности передатчика UDRE и записать затем передаваемый символ в регистр данных 
передатчика: 

trans: sbis USR, UDRE 

;Если бит UDRE в USR установлен, то пропустить 
;cледующую ;команду 

 

96 

           rjmp trans 

 

;Вернуться на метку trans 

out UDR, r15  

;Вывести в регистр данных передатчика 

UART ;содержимое r15 

           ret 
Во время приема данных, очевидно, регистр данных приемника UART необходимо 

считывать лишь тогда, когда установлен флаг готовности RXC. Например: 

receive: sbis USR, RXC 

;Если бит UDRE в USR установлен, то пропустить  
;следующую  команду 

             rjmp receive   

;Вернуться на метку receive 

in r15, 

UDR 

  ;Cчитать регистр данных приемника в r15 

ret 
Или, например, так: 
receive: sbiс USR, RXC 

; Если бит RXC в USR установлен, то пропустить  
;следующую команду 

             in r15, UDR   

;Cчитать регистр данных приемника UART в r15 

           ret 

В  первом  случае  бесконечный  цикл  опроса  флага RXC приведет  к  “зависанию” 

процессора, если ожидаемые данные так и не поступят на вход UART. Поэтому во второй 
подпрограмме  предлагается  не  ждать  бесконечно  долго  готовности  приемника,  а  лишь 
один  раз  опросить  флаг RXC. В  случае,  если  он  установлен,  считать  байт  из  регистра 
данных  приемника,  если  нет – не  считывать,  но  затем  в  любом  случае  завершить 
подпрограмму. 

Описанные выше программы очень просты, но чрезвычайно неэффективны с точки 

зрения  использования  процессорного  времени.  Для  передачи  многобайтных  сообщений 
процессорное  ядро  сможет  быстро  (за 0,25 мкс  при Fck = 4МГц)  записать  в  передатчик 
только  первые  два  байта,  а  затем  в  течение  интервала  времени  передачи  байта  в 
последовательный канал (при скорости 9600 бод передача одного байта занимает ~1ms) 
необходимо, опрашивая флаг готовности передатчика, ждать освобождения UART.  

В  этом  отношении  более  рациональны  программы,  в  которых  взаимодействие 

быстрого процессорного ядра и медленного UART организуется с использованием системы 
прерываний.  Пример  такой  организации  программ  для  передачи  данных  по 
последовательному каналу можно найти на сайте www.atmel.ru. 

13.2. Интерфейс SPI 

Последовательный  периферийный  интерфейс SPI (Serial Peripheral Interface

предложен фирмой Motorola. Он обеспечивает полный дуплексный обмен данными между 
двумя  контроллерами.  При  этом  один  контроллер  считается  ведущим  (master),  второй - 
ведомым  (slave).  Ведущий контроллер является источником сигнал синхронизации (SCK) 
(рис. 13.6 ).  

 

97 

 

Рис. 13.6. Соединение устройств с интерфейсом SPI 

Ведущий и ведомый контроллеры связаны тремя сигнальными линиями: 

º MISO 

(Master In Slave Out) – вход ведущего – выход ведомого, 

º MOSI 

(Master Out Slave In) – выход ведущего – вход ведомого, 

º SCK 

(Serial Clock) – синхронизация, 

Контакт #SS (Slave Select) – предназначен  для  выбора  ведомого  контроллера. 

Контроллер является ведомым при #SS = 0. 

Регистры сдвига (Shift Register) ведущего и ведомого контроллеров по линиям MOSI 

и MOSO соединяются в кольцо. Запись в регистр данных ведущего контроллера запускает 
генератор  синхронизации  (SPI clock generator)  и  данные  сдвигаются  в  регистрах  сдвига 
соединенных в кольцо ведущего и ведомого контроллеров 

При  восьмибитных  регистрах  обмен  длится 8 тактов.  По  окончании  обмена 

генератор  синхронизации  останавливается  и  устанавливается  флаг  окончания  передачи. 
Если  в  контроллере  разрешены  прерывания  (бит SPIE в  регистре SPCR установлен) 
прерывание регистрируется. 

Управление SPI осуществляется  через  регистры  ввода/вывода.  В  контроллере 

ATmega 163 такими регистрами являются:  

º 

Регистр SPCR (SPI Control Register) – регистр управления SPI, 

º 

Регистр SPSR (SPI Status Register) – регистр статуса SPI, 

º 

Регистр SPDR (SPI Data Register) – регистр данных SPI 

 

  

1 0 

SPCR $0D 

($2D) SPIE  SPE  DORD MSTR CPOL CPHA SPR1 SPR0 

SPSR $0E 

($2E) SPIF WCOL  - 

- SPI2X 

SPDR 

$0F 

($2F) 

MSB 

        

LSB 

Рис. 13.7. Регистры SPI 

Регистр  данных SPDR доступен  для  записи  и  чтения.  Запись  в  регистр 

инициализирует передачу данных. Чтение регистра позволяет получить результат обмена. 

Регистр управления SPI содержит биты управления передачей данных. 

 

98 

º 

Бит 7 – SPIE (SPI Interrupt Enable) - бит  маски  прерывания SPI. Если  бит 
SPIE  установлен  и  установлен  также  бит I глобального  разрешения 
прерывания в регистре статуса SREG, то прерывание разрешается. 

º 

Бит 6 – SPE (SPI Enable) - бит  разрешения  работы SPI. Если  бит SPE 
установлен, то SPI включен. 

º 

Бит 5 – DORD (Data Order) - порядок  передачи  данных.  Если  бит DORD 
установлен,  то  младший  бит  данных (LSB) передается  первым.  Если  бит 
DORD сброшен – первым передается старший бит данных (MSB). 

º 

Бит 4 – MSTR (Master/Slave Select) - выбор  ведущего/ведомого.  При 
установке  этого  бита  выбирается  режим  ведущий/ведомый.  Бит 
устанавливается, если контроллер является ведущим и сбрасывается, если 
–  ведомым.  Если  на  контакт #SS подан 0, в  то  время  как  бит MSTR 
установлен,  то  бит MSTR будет  очищен,  и  установится  флаг  прерывания 
(бит SPIF в SPSR). Пользователь в этом случае может вновь установить бит 
MSTR и сделать контроллер ведущим. 

º 

Бит 3 – CPOL (Clock Polarity) - полярность сигнала синхронизации. Если бит 
CPOL установлен, то в SCK = 1 при отсутствии передачи. 

º 

Бит 2 – CPHA (Clock Phase) - фаза  синхронизации.  Синхронизация 
осуществляется по переднему фронту сигнала, если бит CPHA установлен, 
и по заднему –если бит CPHA сброшен. 

º 

Биты  1,0 - SPR1, SPR0 (SPI Clock Rate Select 1 and 0).  Выбор  частоты 
синхронизации. SPI синхронизируется 

от 

тактового 

генератора 

процессорного  ядра  ведущего  контроллера  СК.  Частота  передачи  может 
быть изменена битами SPI2X регистра SPSR и SPR1 и SPR0 регистра SPCR 
в  соответствии  с  таблицей  13.2.  Для  ведомого  контроллера  эти  биты  не 
существенны. 

Таблица 13.2.  

Частота синхронизации SPI 

SPI2X  SPR1  SPR0  Частота SPI2X  

SPR1  SPR0  Частота 

0  

СК/ 4 

1  

CK / 2 

0  

1 CK/ 

16 

1  

1 CK 

0  

1 0 CK/ 

64 

1  

1 0 CK/ 

32 

0  

1 CK/ 

128 

1  

1 CK/ 

64 

В регистре SPSR хранятся флаги прерываний и ошибок SPI. 

º 

Бит 7 - SPIF (SPI Interrupt Flag) - флаг прерывания SPI. Бит устанавливается 
аппаратно при завершении передачи байта в SPI. Прерывание происходит, 
если установлен бит маски SPIE в регистре SPCR и прерывания глобально 
разрешены.  Бит SPIF аппаратно  сбрасывается  при  переходе  по  вектору 
прерывания.  

º 

Бит 6 – WCOL (Write Collision Flag) - флаг  ошибки.  Бит WCOL 
устанавливается,  если  данные  в  регистр SPDR записываются  во  время 
процесса  передачи.  Бит WCOL, как  и  бит SPIF, сбрасывается  при  первом 
чтении регистра статуса SPSR после обращения к регистру данных SPDR. 

º 

Бит 0 - SPI2X (Double SPI Speed Bit) - бит удвоения скорости передачи. Этот 
бит  позволяет  удвоить  скорость  передачи  данных,  как  показано  в  таблице 
13.2. 

 

 

 

 

 

 

 

содержание   ..  22  23  24  25   ..