[AVR] Работа с SPI модулем.

Hardware issues, electronic components, schemas, Arduino, STM32, Robots, Sensors
Post Reply
Administrator
Site Admin
Posts: 81
Joined: 26-Feb-2014, 17:54

[AVR] Работа с SPI модулем.

Post by Administrator » 11-Apr-2014, 20:49

Учебный курс AVR. Работа с SPI модулем. Чтение и запись данных.

Вы имеете общее представление о последовательном периферийном интерфейсе и можно перейти к рассмотрению SPI модуля. SPI модуль микроконтроллера AVR atmega16 использует для своей работы 4 вывода - MOSI, MISO, SCK и SS. Когда модуль не задействован, эти выводы являются линиями портов ввода/вывода общего назначения. Когда модуль включен, режим работы этих выводов переопределяются согласно следующей таблице.
spi-pin-regime.png
spi-pin-regime.png (4.95 KiB) Viewed 25400 times
Если к микроконтроллеру подключено больше одного периферийного устройства, в качестве дополнительных выводов выбора (SS), можно использовать любые выводы общего назначения. При этом штатный вывод SS должен быть всегда правильно сконфигурирован, даже если он не используется.

Регистры SPI модуля
В микроконтроллере atmega16 для работы с модулем SPI используются три регистра:
- управляющий регистр SPCR,
- статусный регистр SPSR,
- регистр данных SPDR.
Все три регистра восьмиразрядные.

Кофигурация модуля SPI устанавливается с помощью регистра SPCR (SPI Control Register).
SPCR.png
SPCR.png (5.01 KiB) Viewed 25400 times
SPIE – разрешает /запрещает прерывания от модуля SPI. Если бит установлен в 1, прерывания от SPI разрешены.

SPE – включает/выключает модуль SPI. Если бит установлен в 1, модуль SPI включен.

DORD – определяет порядок передачи данных. Когда бит установлен в 1, содержимое регистра данных передается младшим битом вперед. Когда бит сброшен, то старшим битом вперед.

MSTR – определяет режим работы микроконтроллера. Если бит установлен в 1, микроконтроллер работает в режиме Master (ведущий). Если бит сброшен – в режиме Slave (ведомый). Обычно микроконтроллер работает в режиме master.

CPOL и CPHA – определяют в каком режиме работает SPI модуль. Требуемый режим работы зависит от используемого периферийного устройства.
spi-mode-table.png
spi-mode-table.png (2.81 KiB) Viewed 25400 times
SPR1 и SPR0 – определяют частоту тактового сигнала SPI модуля, то есть скорость обмена. Максимально возможная скорость обмена всегда указывается в спецификации периферийного устройства.

Статусный регистр SPSR (SPI Status Register) предназначен для контроля состояния SPI модуля, кроме того он содержит дополнительный бит управления скоростью обмена.
SPSR.png
SPSR.png (4.29 KiB) Viewed 25400 times
SPIF – флаг прерывания от SPI. Он устанавливается в 1 по окончании передачи байта данных. Если разрешены прерывания модуля, одновременно с установкой этого флага генерируется прерывание от SPI. Также этот флаг устанавливается в 1 при переводе микроконтроллера из режима master в режим slave с помощью вывода SS.
Сброс флага происходит аппаратно, при вызове подпрограммы обработки прерывания или после чтения регистра SPSR с последующим обращением к регистру данных SPDR.

WCOL- флаг конфликта записи. Флаг устанавливается в 1, если во время передачи данных выполняется попытка записи в регистр данных SPDR. Флаг сбрасывается аппаратно после чтения регистра SPSR с последующим обращением к регистру данных SPDR.

SPI2X — бит удвоения скорости обмена. Установка этого разряда в 1 удваивает частоту тактового сигнала SCK. Микроконтроллер при этом должен работать в режиме master.

Взаимосвязь между битами SPR0, SPR1, SPI2X и частотой тактового сигнала SCK показана в таблице.
spi-SCK.png
spi-SCK.png (5.89 KiB) Viewed 25400 times
Где Fosc — тактовая частота микроконтроллера AVR.

Для передачи и приема данных предназначен регистр SPDR (SPI Data Register). Запись данных в этот регистр инициирует передачу данных SPI модулем. При чтении этого регистра, считывается содержимое буфера сдвигового регистра SPI модуля.

Administrator
Site Admin
Posts: 81
Joined: 26-Feb-2014, 17:54

Re: [AVR] Работа с SPI модулем.

Post by Administrator » 11-Apr-2014, 20:59

Программный код
Минимальный программный код для работы с SPI модулем состоит из двух функций:
- функции инициализации.
- функции передачи/приема байта данных

Инициализация SPI модуля
Инициализация включает в себя конфигурирование выводов SPI модуля и управляющего регистра SPCR.

Code: Select all

#define SPI_MISO 6
#define SPI_MOSI 5
#define SPI_SCK 7
#define SPI_SS 4
/*инициализация SPI модуля в режиме master*/
void SPI_Init(void)
{
    /* настройка портов ввода-вывода PORT_B (все выводы, кроме MISO выходы) */
   DDRB |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO);
   PORTB |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(1<<SPI_MISO);
 
  /* разрешение spi,старший бит вперед,мастер, режим 0 */
   SPCR = (1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(0<<SPR0);
   SPSR = (0<<SPI2X);
} 
Передача/прием данных
Процесс передачи/приема данных с помощью SPI модуля, работающего в режиме Master, состоит из следующей последовательности действий:
1. установка низкого логического уровня на линии SS
2. загрузка данных в регистр SPDR
3. ожидание окончания передачи (проверка флага SPIF)
4. сохранение принятых данных (чтение SPDR), если требуется
5. возврат на 2-ой шаг, если переданы не все данные
6. установка высокого логического уровня на линии SS

Ниже приведен вариант функции передачи/приема данных по SPI.

Code: Select all

uint8_t SPI_ReadByte(uint8_t data)
{
    uint8_t report;
    PORTB &= ~(1<<SPI_SS);       // ChipSelect = 0
    SPDR = data;                        // данные для передачи
    while(!(SPSR & (1<<SPIF)));  // ждём пока передается
    report = SPDR;                     // принятые данные
    PORTB |= (1<<SPI_SS);        // ChipSelect = 1
    return report; 
} 

Post Reply