# 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)

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 по окончанию)

1 и 2 - SPR1 и SPR0 – определяют частоту тактового сигнала SPI модуля, то есть скорость обмена. Максимально возможная скорость обмена всегда указывается в спецификации периферийного устройства.
### SPI - SPSR - Статусный регистр SPSR (SPI Status Register) предназначен для контроля состояния SPI модуля, кроме того он содержит дополнительный бит управления скоростью обмена.

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
```