# 6.Регистры для последовательного интерфейса SPI (SPCR, SPSR, SPDR) ## TODO: - [X] регистры - [X] код [Архитектура и назначение SPI модуля](/c3KELy6fRWyH9_UnxYCX9g) ### КРАТКО **SPCR** - control register. SPIE - interrupt enabled - разрешение прерывание SPE - enabled - включает SPI DORD - передача от 0 до 7 или от 7 до 0 MSTR - 1 - master, 0 - slave CPOL, CPHA - определяют clock на SCK SPR1, SPR2 - определяют частоту **SPSR** - status register SPIF - флаг прерывания WCOL - флаг конфликта записи. Орет если в SPDR пытается что-то записать во время передачи SP2X - увеличивает частоту в 2 раза для мастер мода **SPDR** - data register. Положи туда свои 8 бит и передача начнется. Забери оттуда 8 бит по окончанию передачи ### SPi – SPCR - Кофигурация модуля SPI устанавливается с помощью регистра SPCR (SPI Control Register) ![](https://i.imgur.com/xXvAWwX.png) 7 бит SPIE – разрешает /запрещает прерывания от модуля SPI. Если бит установлен в 1, прерывания от SPI разрешены. 6 бит SPE – включает/выключает модуль SPI. Если бит установлен в 1, модуль SPI включен. 5 бит DORD – определяет порядок передачи данных. Когда бит установлен в 1, содержимое регистра данных передается младшим битом вперед. Когда бит сброшен, то старшим битом вперед. 4 бит MSTR – определяет режим работы микроконтроллера. Если бит установлен в 1, микроконтроллер работает в режиме Master (ведущий). Если бит сброшен – в режиме Slave (ведомый). Обычно микроконтроллер работает в режиме master. 3 и 2 - CPOL и CPHA – определяют как работу clock CPOL - работает по верхнему или по нижнему (0 по верхнему, 1 по окончанию) CPHA - по началу импульса или по окончанию (0 по началу, 1 по окончанию) ![](https://i.imgur.com/ZEtZYyZ.png) 1 и 2 - SPR1 и SPR0 – определяют частоту тактового сигнала SPI модуля, то есть скорость обмена. Максимально возможная скорость обмена всегда указывается в спецификации периферийного устройства. ### SPI - SPSR - Статусный регистр SPSR (SPI Status Register) предназначен для контроля состояния SPI модуля, кроме того он содержит дополнительный бит управления скоростью обмена. ![](https://i.imgur.com/KEXw2qv.png) SPIF – флаг прерывания от SPI. Он устанавливается в 1 по окончании передачи байта данных. Если разрешены прерывания модуля, одновременно с установкой этого флага генерируется прерывание от SPI. Также этот флаг устанавливается в 1 при переводе микроконтроллера из режима master в режим slave с помощью вывода SS. Сброс флага происходит аппаратно, при вызове подпрограммы обработки прерывания или после чтения регистра SPSR с последующим обращением к регистру данных SPDR. WCOL- флаг конфликта записи. Флаг устанавливается в 1, если во время передачи данных выполняется попытка записи в регистр данных SPDR. Флаг сбрасывается аппаратно после чтения регистра SPSR с последующим обращением к регистру данных SPDR. SPI2X — Должен был бы храниться в control register, но там места не хватило. Бит удвоения скорости обмена. Установка этого разряда в 1 удваивает частоту тактового сигнала SCK. Микроконтроллер при этом должен работать в режиме master. ### SPI - SPDR - Для передачи и приема данных предназначен регистр SPDR (SPI Data Register). Запись данных в этот регистр инициирует передачу данных SPI модулем. При чтении этого регистра, считывается содержимое буфера сдвигового регистра SPI модуля. ## Примеры кода В следующих примерах кода показано, как инициализировать SPI в качестве ведущего и как выполнить простую передачу. DDR_SPI в примерах должен быть заменен фактическим регистром направления данных, управляющим выводами SPI. DD_MOSI, DD_MISO и DD_SCK должны быть заменены фактическими битами направления данных для этих контактов. Например, если MOSI размещен на выводе PB5, замените DD_MOSI на DDB5 и DDR_SPI на DDRB. ```cp= SPI_MasterInit: ; Set MOSI and SCK output, all others input ldi r17,(1<<DD_MOSI)|(1<<DD_SCK) out DDR_SPI,r17 ; Enable SPI, Master, set clock rate fck/16 ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0) out SPCR,r17 ret ; Вот тут выводим данные SPI_MasterTransmit: ; Start transmission of data (r16) out SPDR,r16 Wait_Transmit: ; Wait for transmission complete sbis SPSR,SPIF rjmp Wait_Transmit ret ```