AVR: SPI

spi avrSPI — (Serial Peripheral Interface) последовательный периферийный интерфейс. В основном служит для передачи данных внутри устройства (на плате или между платами ). Скорость обмена по SPI может достигать нескольких  MГц. При обмене по SPI устройства делятся на  ведущего (Master) или ведомого(Slave). В самом простом случае есть один мастер и один слэйв.  Но может быть и несколько ведомых,  для выбора с каким ведомым работать используются сигнал SS (Slave Select). Ведущее устройство выбирает с каким ведомым устройством оно будет обмениваться данными и генерирует тактовый сигнал.

Шина SPI состоит из 3+n сигнальных линий, (n — количество ведомых устройств):

  • MOSI  (Master Output Slave Input) — Данные от ведущего к ведомому
  • MISO  (Master Input Slave Output) — Данные от ведомого к ведущему
  • CLK ( Clock) —  тактовый сигнал
  • SSn  (Slave Select) — Выбор ведомого для n-го устройства

SPI может работать в 4-х режимах:

  • режим 0: данные защелкиваются по переднему фронту CLK
  • режим 1: данные защелкиваются по заднему фронту CLK
  • режим 2: данные защелкиваются по переднему фронту CLK,  сигнал CLK инвертирован
  • режим 3: данные защелкиваются по заднему фронту CLK, сигнал CLK инвертирован

 режимы работы spi

Так же можно выбрать какой бит будет передан в первую очередь MSB (Most Significant Bit ) или LSB (Least Significant Bit). Если выбран MSB то при обмене  данными сначала будет передан 7-й бит, затем 6-ой и т.д.  При работе в режиме LSB первым передается 0-ой бит, затем 1-ый и т.д.

Данные обычно передаются  посылками с размером кратным 8 бит: 8, 16, 24, 32 и т.д. На время посылки сигнал SS соответствующего устройства выставляется в 0.

Настройка SPI в avr atmega

В avr atmega можно настроить следующие параметры SPI:

  • Тип устройства ( Master/Slave)
  • Частоту обмена
  • Режим ( 0 — 3 )
  • Порядок бит (MSB/LSB )

Выбор типа устройства на шине SPI

Для перевода в режим Master надо выставить бит MSTR  в регистре SPCR , если этот бит сброшен микроконтроллер будет ведомым.

Настройка режима работы SPI avr atmega

Для настройки режима работы  SPI в avr atmega используются  биты СPHA и CPOL  регистра SPCR

CPOL CPHA режим
0 0 0
0 1 1
1 0 2
1 1 3

Настройка скорости обмена SPI avr atmega

Для выбора скорости обмена SPI в avr atmega используются биты SPR0 и SPR1 регистра SPCR

SPR1 SPR0 частота
0 0 fosc/4
0 1 fosc/16
1 0 fosc/64
1 1 fosc/128

Так же есть возможность удвоить частоту обмена, для этого надо выставить в 1 бит SPI2X регистра SPSR.

Выбор порядка бит SPI avr atmega

Для выбор порядка бит в avr atmega используется бит DORD  регистра SPCR.

Если бит DORD выставлен в 1, то первым передается 7-ой бит(MSB). Иначе первым передается 0-ой бит (LSB).

 

Пример настройки SPI avr atmega

Для разрешения работы SPI надо выставить бит SPE  регистра SPCR.  Так же надо настроить выводы MOSI, SCK, SS на выход.

#define SPI_DDR  DDRB
#define SPI_PORT PORTB
#define SPI_SS   PB4
#define SPI_MOSI PB5
#define SPI_MISO PB6
#define SPI_SCK  PB7
 
void spi_init( void )
{
  //настраиваем выводы MOSI, SCL, SS на выход
  SPI_DDR = ( 1 << SPI_MOSI) | ( 1 << SPI_SCK) | ( 1 << SPI_SS );
  //выставляем SS в 1 
  SPI_PORT |= ( 1 << SPI_SS );
  // разрешаем SPI, Master, режим 0, частота 1/4 от F_CPU, LSB first
  SPCR = ( 1 << SPE ) | ( 1 << MSTR );
  SPSR = ( 1 << SPI2X ); //удвоение частоты SPI
}

 

Передача данных по SPI в avr atmega

Для запуска передачи надо записать данные в регистр SPDR. По окончанию передачи будет выставлен бит SPIF в регистре SPSR и возникнет прерывание если оно разрешено (выставлен бит SPIE в регистре SPСR ). Принятые данные буду лежать в регистре SPDR. После считывания принятых данных из регистра SPDR бит SPIF сбрасывается.

Пример передачи одного байта по SPI для avr atmega.

unsigned char spi_transaction( unsigned char b )
{
  unsigned char ret;
  SPI_PORT &= ~(1 << SPI_SS );        //сбрасываем SS в 0
  SPDR = b;                           //передаваемые данные
  while( !( SPSR & ( 1 << SPIF ) ) ); //ждем окончания передачи
  ret = SPDR;                         //считываем принятые данные 
  SPI_PORT |= ( 1 << SPI_SS );        //выставляем SS в 1
  return ret;
}
Запись опубликована в рубрике Микроконтроллеры avr с метками , , . Добавьте в закладки постоянную ссылку.

3 комментария: AVR: SPI

  1. а говорит:

    А есть полный код?

  2. Артём Двинин говорит:

    Где-то был, но я сейчас вряд-ли найду. А Вам чего не хватает?

  3. hn говорит:

    есть ли исходники?

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>