Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра електронних обчислювальних машин
Розрахункова робота №2
з курсу: “Проектування вбудованих Комп’ютерних систем”
на тему: “Послідовний зовнішній інтерфейс Motorola DSP56F827. Програмна модель.”
Контролер переривань
Вступ
Модуль послідовного зовнішнього інтерфейсу (Serial Peripheral Interface (SPI)) надає можливість дуплексного, синхронного послідовного з’днання між DSP та пепиферійними причтроями. Мікропрограма може опитувати ознаки стану чи роботи SPI а також може керувати ним за допомогою переривань. Цей блок вміщає 4 16-бітові масковані регістри для параметрів контролю, стану та переміщення даних.
Чотири регістри керують та відображають роботу SPI. Доступ до цих регістрів може вестися тільки 16-розрядним словом. Робота зі словом іншої довжини може привести до невизначениз результатів.
Адреса регістру є сумою базової адреси та адреси зміщення. Базова адреса визначена на рівні MCU, а адреса зміщення визначена на рівні модуля
Загальна характеристика регістрів
Послідовний зовнішній інтерфейс має такі чотири регістри
• SPI Status and Control Register (SPSCR)
• SPI Data Size Register (SPDSR)
• SPI Data Receive Register (SPDRR)
• SPI Data Transmit Register (SPDTR)
Адрес
Використання
SPI0_BASE + $0 SPI
SPI Status and Control Register (SPSCR)
SPI1_BASE +$0 SPI
SPI Status and Control Register (SPSCR)
SPI_BASE + $1 SPI
SPI Data Size Register (SPDSR)
SPI_BASE + $2 SPI
SPI Data Receive Register (SPDRR)
SPI_BASE + $3 SPI
SPI Data Transmit Register (SPDTR)
Регістр стану та керування (SPI Status and Control Register (SPSCR))
SPSCR виконує таке:
• Вмикає запити переривання модуля SPI module interrupt requests
• Вибирає запити переривання кристалу
• Конфігурує модуль SPI як головний чи підлеглий
• Вибирає полярність, фазу Serial Clock та подільник частоти для головного SPI
• Реогує на ознаку переповнення регістру даних
• При невідповідності логічних рівнів на виводі SS видає помилку
• Ознаку пустого регістру передачі даних
SPI_BASE+$0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Читання
DSO
SPRF
ERRIE
OVRF
MODF
SPTE
MOD
FEN
SPR1
SPR0
SPRIE
SPMSTR
CPOL
CPHA
SPE
SPTIE
Запис
11
Зарезервований — Біт 15
Зарезервований біт не може змінюватися. Читається як нуль
Порядок зсуву даних - Data Shift Order (DSO)—Біт 14
Біт з повним доступом визначеє котрий біт відправляється ви одержується першим: MSB чи LSB.
Обидва : головний та підлеглий SPI модулі потребують відправки і одержання пакетів однакової довжини. Незважаючи, як цей біт встановлені коли читається з SPDRR чи записується до SPDTR, LSB завжди буде в положенні нуля, а MSB в правильній бітовій позиції.
Коли дані менші за 16 If the data length is less than 16 bits, дані розширюються старшими розрядами.
• 1 = LSB відправляється першим (LSB > MSB)
• 0 = MSB відправляється першим (MSB > LSB)
Переповнення одержувача - SPI Receiver Full (SPRF)— Біт 13
Ознака тільки для читання встановлюється щоразу, пакер повної довжини вілправляється з регістру зсувів до регісте приймання даних. SPRF генерує переривання якщо SPRIE біт також встановлений. Автоматично очищається після прочитання SPDRR.
• 1 = Регістр одержання даних заповнений
• 0 = Регістр одержання даних не заповнений
Ввімкнення переривань помилки - Error Interrupt Enable (ERRIE)—Біт 12
Біт з вільним доступом дозволяє бітам MODF та OVRF генерувати DSP запити на переривання
Скид очищає ERRIE біт.
• 1 = MODF і OVRF можуть генерувати DSP запити на переривання
• 0 = MODF і OVRF не можуть генерувати DSP запити на переривання
Переповнення - Overflow (OVRF)—Біт 11
Біт тільки для читання. Встановлений коли програма не прочитала даних з регістру прийому даних, покинаступні дані не заповнили регістр. За умови переповнення (OVRF) , Дані в регістрі-одержувачі застарілі а дані в регістрі зсуву втрачені. Очищується OVRF читанням регістру стану та управління SPI з встановленим OVRF а потім читанням регістра одержувача даних.
• 1 = Переповнення
• 0 = Нема переповнення
11
Помилка режиму - Mode Fault (MODF)—Біт 10
Ознака тільки для читання встановлена в підлеглому SPI якщо вивід SS в стані одиниці впродовж передачі з встановленим бітом MODFEN . В головному SPI Mode Fault (MODF) tознака встановлюється якщо вивід SS на рівні нулябудь коли, коли встановлений бітMODFEN . Очищеється MODF записом одиниці до MODF коли він встановлений.
• 1 = SS в неправильному логічному рівні
• 0 = SS в правильному логічному рівні
Пустий відправник - SPI Transmitter Empty (SPTE)—Біт 9
Ознака тільки для читання. Встановлюється щоразу, коли регістр передачі даних передає пакет повної довжини до регістру зсуву. SPI Transmitter Empty (SPTE) генерує переривання якщо SPTIE біт також встановлений.
Не записувати до регістру даних SPI доки SPTE біт в стані одиниці тому що дані можуть бути втрачені
• 1 = Регістр передачі даних пустий
• 0 = Регістр передачі даних не пустий
Включення помилки режиму - Mode Fault Enable (MODFEN)—Біт8
Біт з повним доступом дозволяє MODF ознаці бути встановленою коли сам встановлений. Коли MODF встановлений, скид Mode Fault Enable (MODFEN) не скидає MODF ознаки. Коли MODFEN на рівні нуля, рівень виводу SS не вприває на роботу ввімкненого SPI сконфігурованого як головний. Для SPI в режимі підлеглого, низикий рівень MODFEN тільки утримує MODF ознаку від встановлення. Він не впливає на роботу SPI.
11
Вибір швидкості - SPI Baud Rate Select (SPR1 і SPR0)—Біти 7- 6
В режимі головного ці біти з повним доступом вибирають одну з чотирьох швидкостей передачі даних. SPI Baud Rate Select (SPR1 і SPR0) не мають впливу на пежим підлеглого. Скиз очищує SPR1 та SPR0.
Швидкість передачі визначається за такою формулою
SPR1:SPR0
Подільник швидкості (BD)
00
2
01
8
10
16
11
32
Швидкість передачі = clk/ BD
clk= IPBus clock
BD = подільник швидкості
Переривання відправлення - SPI Receiver Interrupt Enable (SPRIE)—Біт 5
Біт з повним доступом генерує переривання через SPRF біт. SPRF встановлюється коли дані повної довжини передалися з регістру зсуву до регістра одержувача.
• 1 = SPRF DSP запити на переривання дозволяються
• 0 = SPRF DSP запити на переривання забороняються
Режим роботи - SPI Master (SPMSTR) — Біт 4
біт з повним доступом вибитає роботу в режимі головного чи підлеглого
• 1 = режим головного
• 0 = режим підлеглого
11
Полярність таймера - Clock Polarity Bit (CPOL)—Біт 3
Біт з повним доступом визначає логічний стан SCLK виводу між переміщеннями. Щоб пермістити дані між двома SPI модулями, вони повинні мати однакові значення CPOL.
• 1 = Зростаючий фронт SCLK розпочинає передачу
• 0 =Спадаючий фронт SCLK розпочинає передачу
Фаза таймера - Clock Phase Bit (CPHA)—Bit 2
Біт з повним доступом керує синхронізацією між таймером та даними SPI. Для переміщення даних між модулями SPI, вони повинні мати однакові значення CPHA. Коли CPHA = 0, SS вивід SPI модуля режиму підлеглого повинен були встановлений в одиницю між переміщенням даних повної довжини.
Ввімкненя SPI Enable (SPE)—Bit 1
Біт з повним доступом для ввімкнення SPI. Очищення SPI Enable (SPE) спричиняє часткове перевантаження SPI.
• 1 = SPI ввімкнений
• 0 = SPI вимкнений
Дозвіл переривань передачі - SPI Transmit Interrupt Enable (SPTIE)—Bit 0
Біт з повним доступом дозволяє запити переривань генеровані SPTE бітом. SPTE встановлений коли повний пакет даних переданий з регістру передачі даних до рнгістру зсуву.
• 1= SPTE дозволені переривання
• 0 = SPTE заборонені переривання
Драйвер послідовного зовнішнього порту
Код для створення та ініціалізації SPI драйвера автоматично включається проект вставкою такого рядка в файл appconfig.h :
#define INCLUDE_SPI
В файлі spi.h знаходиться така інформація
int open(const char *pName, int OFlags, &SpiParams);
ssize_t write(int FileDesc, const void * pBuffer, size_t Size);
ssize_t read(int FileDesc, void * pBuffer, size_t Size);
int close(int FileDesc);
UWord16 ioctl(int FileDesc, UWord16 Cmd, void * pParams);:
typedef struct
{
bool bSetAsMaster;
UWord16 TransmissionSize;
void (* pSlaveSelect)(void);
void (* pSlaveDeselect)(void);
} spi_sParams;
BSetAsMaster
Bool
Встаноллює SPI в режим головного коли True і в режим підлеглого коли False
TransmissionSize
UWord16
Встановлює розміри передачі від 2 до 16 біт
(* pSlaveSelect)(void)
Void
Вказівник на функцію що запускає SS. Якщо NULL, приймається SS по замовчуванню (Port B pin 5).
(* pSlaveDeselect)(void)
Void
Вказівник на функцію, що вимикає SS. Якщо NULL, використовується позамовчуванню (Port B pin 5)
int open(const char *pName, int OFlags, &SpiParams);
PName
in
Назва пристрою SPI . Використовується BSP_DEVICE_NAME_SPI_0.
Oflag
In
Ознаки режиму відкриття. Ігноруються.
SpiParams
In
Структура заних, описана вище. Повинна бути заповненна перед передачею.
FileDesc
Out
Дескриптор на пристрій SPI повертається після виклику open та використовується викликів функцій read/write/ioctl.
Опис: виклвик open відкриває SPI для роботи та поверп\тає дескриптор що може використовуватися для викликів функцій read, write, close, and ioctl function calls.
Повертає: Функція open повертає тип int. Коли виклик пройшов успішно , змінна - дескриптор на SPI ."-1" повертається коли не успішно.
ssize_t write(int FileDesc, const void * pBuffer, size_t Size);
FileDesc
in
SPI дескриатор, що повертається функцією open
pBuffer
in
Вказівник на буфер користувача
Size
in
Розмір даних запису/читанняSize of data to read/write
Опис: виклик write записує дані з буферу користувача до SPI .
Повертає: тип ssize_t. Ця змінна є числом переданих слів, котрі визначені як розміл вхідних даних.
ssize_t read(int FileDesc, void * pBuffer, size_t Size);
FileDesc
in
SPI дескриатор, що повертається функцією open
pBuffer
in
Вказівник на буфер користувача
Size
In
Розмір даних запису/читанняSize of data to read/write
Опис: виклик write читає дані з SPI до буферу користувача .
Повертає: Виклик read повертає тип ssize_t. Коли SPI є в режимі головного функція повертає тільки одне слово. Це слово є останнім словом , що прочиталося з впродовж останнього запису на пристрій SPI. Коли SPI в режимі “Slave” , функція повертає Size
слів.
int close (int FileDesc);
FileDesc
in
SPI дескриптор, що повертається функцією open
Опис: Виклик close закриває SPI звільняє маніпулятор дескриатора
Повертає: Виклик close повертає тип int; Завжди 0.
Приклад викопистання
#include "port.h"
#include "io.h"
#include "fcntl.h"
#include "bsp.h"
#include "spi.h"
void main(void)
{
spi_sParams SpiParams;
int SerialMaster;
UWord16 Data = 0x1234;
SpiParams.pSlaveSelect = NULL;
/* По замовчуванню використовується PortB GPIO Pin 5 для перемикання SS */
SpiParams.pSlaveDeselect = NULL;
/* По замовчуванню використовується PortB GPIO Pin 5 для перемикання SS */
SpiParams.bSetAsMaster = 1;
/* Встановити пристрій SPI в режим головного */
SpiParams.TransmissionSize = 0x000F;
/* Встановити розмір передачі в 16 біт */
/* відкрити SPI драйвер */
SerialMaster = open(BSP_DEVICE_NAME_SPI_0, 0, &SpiParams);
/* Записати “Data” до пристрою */
write(SerialMaster, (UWord16 *)(&Data), sizeof(UWord16));
/* Закрити драйвер */
close(SerialMaster);
}
Блок-схема