Основы работы протокола SPI.
SPI(Serial Peripheral Bus) — последовательный периферийный протокол обмена. Этот прокол был разработан компанией Motorola, но в настоящее время используется многими производителями. Он предназначен для связи микроконтроллеров между собой, а также со всевозможной периферией: датчиками, AЦП, микросхемами памяти, часами. Но все же наиболее частое применение SPI – это запись программы в память микроконтроллера. В микроконтроллерах AVR c помощью SPI можно прошить микроконтроллер не выпаивая из платы, такой способ прошивки называется ISP(In System Programming ). Хотя названия SPI и ISP очень созвучны, это не одно и то же, в AVR SPI используется как физический уровень ISP, то есть используются линии SPI для передачи данных, но сам протокол(программный уровень) отличается.
Для передачи данных в SPI используется три линии:
MISO(Master Input Slave Output) – по этой линии Master(ведущий) принимает данные от Slave(ведомого).
MOSI(Master Output Slave Input) – по этой линии Master отправляет данные Slave.
SCK(Serial Clock ) – служит для передачи тактового сигнала ведомому устройству.
Также используется линия SS(Slave Select), которая определяет устройство с которым Master будет обмениваться данными.
По причине того, что многие производители в своих устройствах используют SPI, названия выводов могут несколько отличаться. Ниже приведена таблица с альтернативными названиями.
SPI бывает двух видов аппаратный и программный. При реализации программного SPI, мы вручную должны устанавливать сигнал на ножках соответствующих MISO, MOSI, SS при этом дёргать за SCK. При аппаратной реализации SPI мы передаём данные в специальный регистр, а микроконтроллер сам проделывает вышеописанные манипуляции, по предварительным настройкам.
Физическая реализацию SPI, представляет собой два соединённых вместе сдвиговых регистра.
В зависимости от того по какому логическому уровню сигнала SCK, происходит синхронизация Master и Slave и по какому фронту происходит захват и сдвиг данных, возможны 4 режима SPI.
На осциллограммах ниже видно как выглядит посылка 0х17 в разных режимах.
CPOL = 0 CPHA = 0
CPOL = 1 CPHA = 0
CPOL = 0 CPHA = 1
CPOL = 1 CPHA = 1
SPI — синхронный интерфейс, то есть для того чтобы получить какие-нибудь данные от Slave, Master должен что-нибудь отправить. Вроде всё понятно, но что если Master отправляет один байт, а Slave должен вернуть ему два? В таком случае Master должен отправить ему что-нибудь 2 раза, например 0х00.
На этом всё, выше пример кода взятый из рабочего проекта.
Для передачи данных в SPI используется три линии:
MISO(Master Input Slave Output) – по этой линии Master(ведущий) принимает данные от Slave(ведомого).
MOSI(Master Output Slave Input) – по этой линии Master отправляет данные Slave.
SCK(Serial Clock ) – служит для передачи тактового сигнала ведомому устройству.
Также используется линия SS(Slave Select), которая определяет устройство с которым Master будет обмениваться данными.
По причине того, что многие производители в своих устройствах используют SPI, названия выводов могут несколько отличаться. Ниже приведена таблица с альтернативными названиями.
SPI бывает двух видов аппаратный и программный. При реализации программного SPI, мы вручную должны устанавливать сигнал на ножках соответствующих MISO, MOSI, SS при этом дёргать за SCK. При аппаратной реализации SPI мы передаём данные в специальный регистр, а микроконтроллер сам проделывает вышеописанные манипуляции, по предварительным настройкам.
Физическая реализацию SPI, представляет собой два соединённых вместе сдвиговых регистра.
В зависимости от того по какому логическому уровню сигнала SCK, происходит синхронизация Master и Slave и по какому фронту происходит захват и сдвиг данных, возможны 4 режима SPI.
- CPOL = 0 — сигнал синхронизации начинается с низкого уровня;
- CPOL = 1 — сигнал синхронизации начинается с высокого уровня;
- CPHA = 0 — выборка данных производится по переднему фронту сигнала синхронизации;
- CPHA = 1 — выборка данных производится по заднему фронту сигнала синхронизации.
На осциллограммах ниже видно как выглядит посылка 0х17 в разных режимах.
CPOL = 0 CPHA = 0
CPOL = 1 CPHA = 0
CPOL = 0 CPHA = 1
CPOL = 1 CPHA = 1
SPI — синхронный интерфейс, то есть для того чтобы получить какие-нибудь данные от Slave, Master должен что-нибудь отправить. Вроде всё понятно, но что если Master отправляет один байт, а Slave должен вернуть ему два? В таком случае Master должен отправить ему что-нибудь 2 раза, например 0х00.
//отправляем команду, в ответ должно прийти два байта
Spi_Master_Transmit(chx);
//отправляем что-нибудь для того чтобы принять первый байт
Spi_Master_Transmit(0X00);
touch_x = SPDR;
touch_x <<= 8;
//отправляем что-нибудь для того чтобы принять второй байт
Spi_Master_Transmit(0X00);
touch_x |= SPDR;
touch_x >>= 3;
На этом всё, выше пример кода взятый из рабочего проекта.
Похожие статьи