Прежде чем приступить к написанию кода, немного рассмотрим настройки самого SPI:
SS – это ножка выбора устройства. При установке на ведомом устройстве низкого уровня — устройства начнет обмен данными, при высоком уровне — обмена не будет.
MOSI – выход данных ведущего устройства и вход данных ведомого устройства.
MISO – выход данных ведомого устройства и вход данных ведущего устройства.
SCK – выход синхронизации.
Все регистра восьмиразрядные.
Этот регистр контролирует SPI: устанавливает тактовую частоту, настраивают ведущий / ведомый и т.д.
Бит 7: SPIE — Разрешение прерываний
Бит включения прерываний. При этом глобальные прерывания должны быть включены для использования функций прерывания.
Бит 6: SPE — SPI Enable
Бит включения SPI. Когда этот бит установлен в 1 -SPI включен, когда в 0 — SPI выключен.
Бит 5: DORD — Порядок передачи данных
При установке 1 — сначала передается LSB, при установке в 0 — сначала отправляет MSB.
Бит 4: MSTR — Выбор ведущего / ведомого.
Настраивает устройство в качестве ведущего или ведомого. Когда бит установлен в 1 — SPI находится в режиме Master, когда бит установлен в 0, устройство находится в режиме ведомого SPI.
Бит 3: CPOL
Выбор данных по переднему фронту — 0 или по заднему — 1
Бит 2: CPHA
Определяет когда забирать данные, по переднему фронту — 1 , или по заднему фронту -0.
Бит 1,0: SPR1, SPR0
Выбор тактовой частоты SPI. Эти биты вместе с битом SPI2X в регистре SPSR используются для выбора делителя частоты генератора.
Регистр состояния SPI — это регистр, с данного регистра можно получить статус шины SPI, а так же в нем установлен флаг прерывания.
Бит 7: SPIF — флаг прерывания.
Флаг устанавливается при завершении последовательной передачи. Прерывание также генерируется, если бит SPIE (бит 7 в SPCR) включен и глобальные прерывания включены. Сброс флага происходит аппаратно, при вызове подпрограммы обработки прерывания или после чтения регистра SPSR с последующим обращением к регистру данных SPDR.
Бит 6: WCOL- флаг конфликта записи.
Биты 5- 1 Это зарезервированные биты.
Бит 0: SPI2x — режим двойной скорости SPI
Бит режима двойной скорости SPI уменьшает делитель частоты с 4x до 2x, как следствие, удваивая скорость. При установке бита в 1, включается режим двойной скорости. Этот бит используется вместе с битами SPR1: 0 регистра SPCR.
Регистр данных SPI является 8-битным регистром чтения / записи. Это регистр, из которого мы читаем входящие данные и записываем данные.
7-й бит является старшим значащим битом (MSB), а 0-й бит — младшим значащим битом (LSB).
Теперь зная основные настройки режима SPI можно приступить к написанию кода.
Схема подключения:
Так же необходимо подать +5V на 16 ножку микросхемы, а на 8 ножку нулевой потенциал.
Программный код:
#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h> //подключаем библиотеку работы с прерываниями
#include <util/delay.h>
void zdvig (char z);
int main(void)
{
/* Replace with your application code */
DDRB = 0b00111100;//ножки SPI на выход
PORTB= 0b11000011;//низкий уровень
SPCR = ((1<<SPE)|(1<<MSTR));//Включим шину, объявим ведущим
SPDR = 0b00000000;
sei();// разрешаем работу прерываниям
while (1)
{
_delay_ms(500);
zdvig(0b00000001);
_delay_ms(500);
zdvig(0b00000010);
_delay_ms(500);
zdvig(0b00000100);
_delay_ms(500);
zdvig(0b00001000);
_delay_ms(500);
zdvig(0b00010000);
_delay_ms(500);
zdvig(0b00100000);
_delay_ms(500);
zdvig(0b01000000);
_delay_ms(500);
zdvig(0b10000000);
}
}
void zdvig(char z) {
SPDR = z;
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
//сгенерируем отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<PB2); //высокий уровень
_delay_ms(100);
PORTB &= ~(1<<PB2); //низкий уровень
}