- Функции для работы с аппаратной реализацией SPI-интерфейса
Функции для работы с аппаратной реализацией SPI-интерфейса
Аппаратный модуль SPI имеется в ряде МК семейства PIC. Среда разработки mikroC предоставляет библиотеку для инициализации модуля SPI и удобства работы с ним.
С помощью SPI-интерфейса можно легко связать микроконтроллер с внешними микросхемами АЦП, ЦАП, памяти и т.д. Для этого потребуется только МК с аппаратно реализованным модулем SPI (например, PIC16F877). Некоторые микроконтроллеры, имеющие два модуля SPI, например P18F8722, требуют предварительно определить модуль, который будет использован. Для этого достаточно добавить номер 1 или 2 к имени функции Spi. Например, Spi2_Write().
Также, с целью обратной совместимости с предыдущими версиями компилятора и облегчения управления кодами, микроконтроллеры с несколькими модулями SPI имеют Spi-библиотеку, которая идентична Spi1 (т.е. можно использовать Spi_Init() вместо Spi1_Init() для операций с SPI).
Библиотека SPI включает в свой состав следующие функции: Spi_Init, Spi_Init_Advanced, Spi_Read и Spi_Write. Описание этих функций приведено в таблицах 44 - 47 соответственно.
Таблица 44. Описание функции Spi_Init
Прототип | void Spi_Init(void) |
Возвращаемое значение | Нет |
Описание | Конфигурирование и инициализация SPI установками по умолчанию. Spi_Init_Advanced или Spi_Init должны вызываться перед использованием любых других функций библиотеки SPI. Установки по умолчанию: режим ведущего, частота синхронизации Fosc/4, низкий уровень при отсутствии синхросигнала на соответствующем выводе, передача по фронту, стробирование входных данных в середине интервала синхронизации. Для установки собственных настроек необходимо использовать функцию Spi_Init_Advanced |
Требования | Требуется PICмикроконтроллер с аппаратным модулем SPI |
Пример | Spi_Init() |
Таблица 45. Описание функции Spi_Init_Advanced
Прототип | void Spi_Init_Advanced(unsigned short master, unsigned short data_sample, unsigned short clock_idle, unsigned short transmit_edge) |
Возвращаемое значение | Нет |
Описание | Конфигурирование и инициализация SPI. Spi_Init_Advanced или Spi_Init должны вызываться перед использованием любых других функций библиотеки SPI. Аргумент mast_slav определяет режим работы SPI и может принимать следующие значения: MASTER_OSC_DIV4 // Ведущий, частота синхр.=Fosc/4 MASTER_OSC_DIV16 // Ведущий, частота синхр.=Fosc/16 MASTER_OSC_DIV64 // Ведущий, частота синхр.=Fosc/64 MASTER_TMR2 // Ведущий, частоту синхр. задает TMR2 SLAVE_SS_ENABLE // Ведомый, разрешен Slave select SLAVE_SS_DIS // Ведомый, запрещён Slave select Аргумент data_sample определяет, когда стробируются входные данные, и может принимать следующие значения: DATA_SAMPLE_MIDDLE // Входные данные стробируются // в середине интервала синхронизации DATA_SAMPLE_END // Входные данные стробируются // в конце интервала синхронизации Аргумент clock_idle определяет состояние вывода синхронизации при отсутствии обмена и может принимать следующие значения: CLK_IDLE_HIGH // Высокий уровень на выводе // синхронизации при отсутствии обмена CLK_IDLE_LOW // Низкий уровень на выводе // синхронизации при отсутствии обмена Аргумент transmit_edge может принимать следующие значения: LOW_2_HIGH // Данные передаются по фронту HIGH_2_LOW // Данные передаются по спаду |
Требования | Требуется PICмикроконтроллер с аппаратным модулем SPI |
Пример | SPI устанавливается в режим ведущего с частотой синхронизации = Fosc/4, входные данные стробируются в середине интервала синхронизации, вывод синхронизации в состоянии низкого уровня при отсутствии обмена и данные передаются по фронту: Spi_Init_Advanced(MASTER_OSC_DIV4, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH) |
Таблица 46. Описание функции Spi_Read
Прототип | unsigned short Spi_Read(unsigned short buffer) |
Возвращаемое значение | Возвращает принятый байт |
Описание | Запускает обмен посылкой байта buffer, принимает данные и возвращает принятый байт по окончанию приёма |
Требования | Требуется PIC-микроконтроллер с аппаратным модулем SPI. SPI должен быть предварительно проинициализирован функциями Spi_Init_Advanced или Spi_Init |
Пример | short take, buffer; ... take = Spi_Read(buffer); |
Таблица 47. Описание функции Spi_Write
Прототип | void Spi_Write(unsigned short data) |
Возвращаемое значение | Нет |
Описание | Записывает передаваемый байт data в регистр данных SSPBUF, что немедленно вызывает передачу |
Требования | Требуется PIC-микроконтроллер с аппаратным модулем SPI. SPI должен быть предварительно проинициализирован функциями Spi_Init_Advanced или Spi_Init |
Пример | Spi_Write(1) |
Следующий пример демонстрирует, как использовать функции библиотеки SPI. Предлагаемая аппаратная конфигурация: вывод выборки ведомого max7219 (драйвер 8-сегментного светодиодного дисплея на 8 позиций) соединён с RC1 PIC, выводы SDO и SCK PIC - с соответствующими выводами max7219, вывод SDI PIC не используется.
void max7219_init1();
//----------------------- конец
unsigned short i;
void main() {
Spi_Init(); // Стандартное конфигурирование SPI
//Вместо Spi_init можно использовать Spi_Init_Advanced,
// как показано в следующей строке:
//Spi_Init_Advanced(MASTER_OSC_DIV64, DATA_SAMPLE_MIDDLE,
// CLK_IDLE_HIGH, HIGH_2_LOW);
TRISC &= 0xFD;
max7219_init1(); // Инициализация max7219
for (i = 1; i <= 8u; i++) {
PORTC &= 0xFD; // Выбор max7219
Spi_Write(i); // Посылка i в max7219 (номер позиции)
Spi_Write(8 – i); // Посылка 8-i в max7219 (цифра в этой позиции)
PORTC |= 2; // Отмена выбора max7219
}
TRISB = 0;
PORTB = i;
}//end