Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Алгоритмы программного обслуживания контроллера SPI
Ранее в данном параграфе мы обсудили действия, которые необходимо совершить, чтобы инициировать пересылку одного байта с использованием интерфейса SPI. Эти действия отражены в блок-схемах алгоритмов, которые представлены на рис. 4.78. Далее мы покажем, как записать эти действия на Си.
Рис. 4.78. Блок-схемы алгоритмов программного обслуживания контроллера асинхронного обмена SPI
Микроконтроллер и периферийные интегральные схемы. Одна из основных функций интерфейса SPI в микропроцессорных системах — обмен данными между МК и установленными на той же печатной плате интерфейсными ИС. Контроллер SPI в составе МК 68HC12 может быть инициализирован для работы как в режиме ведущего (мастера), так и в режиме ведомого (подчиненного). В процессе обмена с интерфейса SPI — дополнительная функция линий PS7..PS4 порта S. Сигналы SPI распределяются между линиями PS7..PS4 в следующем порядке: • PS7 — сигнал . Когда линия установлена в 0, происходит передача данных из ведущего устройства SPI; • PS6 — сигнал SCK; • PS5 — сигнал MOSI. По этой линии передаются данные от ведущего устройства к ведомому; • PS4 — сигнал MISO. По этой линии передаются данные от ведомого устройства к ведущему.
Регистры управления, используемый в примере. Ниже перечислены биты и регистры управления, которые используются в данном примере: • DDRS — регистр направления передачи порта S. Разряды DDRS7…DDRS4 должны быть установлены соответствующим образом при работе контроллера SPI в режиме ведущего. Это необходимо для правильного формирования сигналов обмена на линиях порта S; • SP0BR — регистр скорости передачи. Разряды SPR2…SPR0 этого регистра задают скорость обмена по шине SPI; • SP0CR1 — регистр управления (первый). Задает режимы работы контроллера SPI; • SP0CR2 — регистр управления (второй). Задает режимы работы контроллера SPI; • SP0SR — регистр состояния. Отражает текущее состояние процесса передачи информации по шине SPI; • SP0DR — регистр данных. В этот регистр записываются данные, подлежащие передаче в интерфейсную ИС. Пример программирования контроллера SPI. В нашем примере мы будем использовать встроенный контроллер SPI в режиме ведущего. Контролер будет непрерывно посылать шестнадцатеричное число $F0 в «воображаемую» периферийную ИС. Работоспособность приведенного программного кода может быть проверена с помощью осциллографа. При желании Вы можете собрать простейшую периферийную ИС — последовательный регистр со светодиодами, подключенными к параллельным выходам (рис. 4.79). В примере не использованы прерывания, контроль за состоянием флага SPIF ведется методом полинга.
Рис. 4.79. Функциональная схема периферийного устройства для тестирования обмена по SPI
/*--------------------------------------------------------------------*/ /* filename: SPI.c */ /* МAIN PROGRAМ: Эта программа реализует непрерывную посылку кода */ /* символа " S" с скоростью 9600 бод в 8-разрядном формате (кадр 10 бит)*/ /* с битом паритета */ /*--------------------------------------------------------------------*/ /*подключаемые файлы*/ #include < 912b32.h> #include < stdio.h>
/*используемые функции*/ void initialize_spi(void); void send_data(unsigned int);
void main(void) { int i, j; unsigned int data; initialize_spi(); /*инициализация модуля SCI*/ data = 0xF0; while(1) /*передавать данные непрерывно*/ { send_data(data); } }
/* Функция initialize_spi производит инициализацию модуля SPI. */ void initialize_spi(void) { SP0BR = 0х04; /*установить скорость обмена*/ SP0CR1 = 0x18; /*запретить прерывания от SPI, назначить режим*/ /*ведущего, старшим битом вперед*/ SP0DR = 0x00; /*очистить регистр данных */ SP0SR = 0x00; /*очистить регистр состояния*/ SP0CR1 = 0x58; /* разрешить SPI */ }
/* Функция send_data производит инициализацию модуля SPI. */ void send_data(unsigned int data) { unsigned int status; SP0DR = data; /*задать число для пересылки*/ while ((SP0SR & 0x80) == 0x00) /*ожидать флага завершения передачи*/ { ; } status = SP0SR /*прочитать регистр состояния с целью сброса флага SPIF*/ } В приведенном примере мы показали лишь технику программирования обмена для контроллера SPI, однако мы не останавливались на особенностях подчиненного устройства, с которым происходит обмен.
|