Современная электроника №9/2021
ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 40 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 9 2021 Перед выполнением передачи дан- ных необходимо, прежде всего, раз- решить работу модуля SPI. Для этого следует установить в единицу шестой бит регистра SPI_CR1. Режим работы определяется состоянием второго бита этого регистра: если бит уста- новлен в 1, микроконтроллер рабо- тает в режиме Master, если сброшен в 0 – в режиме Slave. Программно (на языке программирования С) эти дей- ствия можно реализовать следующим образом: SPI1->CR1 = (1<<6) | (1<<2) ; // включе- ние SPI1 в ведущем микроконтроллере SPI1->CR1 = (1<<6) | (0<<2) ; // включе- ние SPI1 в ведомом микроконтроллере. Передача данных осуществляется следующим образом. При записи в регистр данных SPI ведущего микро- контроллера запускается генератор тактового сигнала модуля SPI. Дан- ные начинают побитно выдаваться на вывод MOSI устройства Master и соответственно поступать на вывод MOSI устройства Slave. Порядок передачи битов данных определяет- ся состоянием седьмого бита реги- стра LSBFIRST. Если бит сброшен в 0, первым передаётся младший бит данных, если же установлен в 1 – старший бит. Частота тактового сиг- нала SCK и соответственно скорость передачи данных по интерфейсу определяются состоянием пятого, четвёртого и третьего битов реги- стра ВR ведущего микроконтролле- ра (см. табл. 1), так как именно он является источником тактового сиг- нала. Для ведомого микроконтрол- лера состояние этих битов не име- ет значения. Напишем на языке программирова- ния С следующий код программы ини- циализации для ведущего микрокон- троллера: #include <stm32f1xx.h> // подклю- чение заголовочного файла int main() { // начало программы RCC->APB2ENR |= RCC_APB2ENR_ SPI1EN; // включаем тактирование SPI1 // подсоединение линий порта РА к шине APB2 RCC->APB2ENR |= RCC_APB2ENR_ IOPAEN; // настройка линий РА5 (SCK), PA6 (MISO), PA7 (MOSI) порта РА // биты CNF5, CNF7 = 10, биты MODE5, MODE7 = 11 // биты CNF6 = 10, биты MODE6 = 00 GPIOA->CRL = 0xb8b33333; // конфигурация SPI1 SPI1->CR1 = (0<<11) // формат кадра данных 8 бит | (0<<7) // направление передачи младшим разрядом вперед | (1<<9) // включаем программное управление сигналом NSS | (1<<8) // NSS в высоком состо- янии | (1<<5)|(0<<4)|(0<<3) // ско- рость передачи данных: F_PCLK/32 | (1<<2) // режим работы Master (ведущий) | (0<<1)|(0<<0) // полярность (0) и фаза тактового сигнала (0) | (1<<6); // включаем SPI // после установки в 1 флага TXE регистра SPI1_SR while(!(SPI1->SR & SPI_SR_TXE)) { } // заполняем буфер передатчика SPI1->DR = 0b11111110; } Для ведомого микроконтроллера был написан следующий код программы инициализации: #include <stm32f1xx.h> // подклю- чение заголовочного файла void delay (int dly) // подпро- грамма формирования задержки { int i; for(; dly>0; dly--) for ( i=0; i<10000; i++); } int main() { // начало программы RCC->APB2ENR |= RCC_APB2ENR_ SPI1EN; // включаем тактирование SPI1 // подсоединение линий порта РА к шине APB2 RCC->APB2ENR |= RCC_APB2ENR_ IOPAEN; // подсоединение линий порта РB к шине APB2 RCC->APB2ENR |= RCC_APB2ENR_ IOPBEN; // настройка линий РА5 (SCK), PA6 (MISO), PA7 (MOSI) порта РА // биты CNF5, CNF7 = 10, биты MODE5, MODE7 = 00 // биты CNF6 = 10, биты MODE6 = 11 GPIOA->CRL = 0x8b833333; // настройка линий порта РВ // биты CNF = 10, биты MODE = 00 GPIOB->CRL =0x88888888; // конфигурация SPI1 SPI1->CR1 = (1<<6) | (0<<2); // включаем SPI, режим работы Slave (ведомый) Таблица 1. Задание частоты тактового сигнала SCK BR5 BR4 BR3 Частота сигнала SCK 0 0 0 fPCLK/2 0 0 1 fPCLK/4 0 1 0 fPCLK/8 0 1 1 fPCLK/16 1 0 0 fPCLK/32 1 0 1 fPCLK/64 1 1 0 fPCLK/128 1 1 1 fPCLK/256 Примечание: fPCLK – это тактовая частота микро- контроллера. Рис. 4. Подключение цепей питания к скрытым выводам микроконтроллера в окне Edit Hidden Power Pins Рис. 5. Окно New Firmware Project
RkJQdWJsaXNoZXIy MTQ4NjUy