Современная электроника №1/2022
ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 37 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 1 2022 // подсоединение линий порта РА к шине APB2 RCC->APB2ENR |= RCC_APB2ENR_ IOPAEN; // настройка линий РА5 (SCK), PA6 (MISO), PA7 (MOSI), РА0-РА4 // порта РА ведущего микрокон- троллера // биты CNF5, CNF7 = 10 (цифро- вой выход c альтернативной функ- цией), // биты MODE5, MODE7 = 11 (вывод данных с частотой переключения 50 МГц), // биты CNF6 = 10 (вход с подтя- гивающим резистором), // биты MODE6 = 00 (приём данных), // биты CNF0-CNF4 = 00 (цифро- вой выход), // биты MODE0-MODE4 = 11 (вывод данных с частотой переключения 50 МГц) 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 // выбираем для передачи данных по SPI // первый ведомый микроконтрол- лер (лог. 1 на линии РА0) GPIOA->ODR=(1<<0)|(0<<1); while(!(SPI1->SR & SPI_SR_TXE)) { } // после установки в 1 флага TXE регистра SPI1_SR // отсылаем кодовую комбинацию для первого ведомого микроконтрол- лера SPI1->DR = 0b11111110; delay(10); // выбираем для передачи данных по SPI // второй ведомый микроконтрол- лер (лог.1. на линии РА1) GPIOA->ODR=(0<<0)|(1<<1); while(!(SPI1->SR & SPI_SR_TXE)) { } // после установки в 1 флага TXE регистра SPI1_SR // отсылаем кодовую комбинацию для второго ведомого микроконтрол- лера SPI1->DR = 0b11111110; delay(10); } Для ведомого микроконтроллера DD2 был написан следующий код програм- мы инициализации: #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; // настройка линий PA4 (NSS), РА5 (SCK), PA6 (MISO), PA7 (MOSI), РА0- РА3 // порта РА первого ведомого микроконтроллера // биты CNF4, CNF5, CNF7 = 10 (вход с подтягивающим резистором), // биты MODE4, MODE5, MODE7 = 11 (приём данных), // биты CNF6 = 10 (цифровой выход c альтернативной функцией), // биты MODE6 = 00 (вывод данных с частотой переключения 50 МГц), // биты CNF0-CNF3 = 00 (цифро- вой выход), // биты MODE0-MODE3 = 11 (вывод данных с частотой переключения 50 МГц) GPIOA->CRL =0x8b883333; // настройка линий РВ0-РВ7 пор- та РВ первого ведомого микрокон- троллера // биты CNF0-CNF7 = 00 (цифро- вой выход), // биты MODE0-MODE7 = 11 (вывод данных с частотой переключения 50 МГц) GPIOB->CRL =0x33333333; // конфигурация SPI1 SPI1->CR1 = (1<<6) | (0<<2); // включаем SPI, режим работы Slave (ведомый) while (1) // бесконечный цикл { while(!(SPI1->SR & SPI_SR_ RXNE)) { } // ждём данные в буфере приёмника SPI if (SPI1->DR !=0b11111110) // если кодовая комбинация не получена GPIOB->ODR= (0<<0) ; // посылаем на линию РВ0 порта PB лог.0 else if (SPI1->DR==0b11111110) // если кодовая комбинация полу- чена { while (1) // бесконечный цикл {GPIOB->ODR=(1<<0); // включить светодиод D1 delay(10); // задержка GPIOB->ODR=(0<<0); // погасить светодиод D1 delay(10); }}}} Код программы инициализации для ведомого микроконтроллера DD3: #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; // настройка линий РА0-РА7 пор- та РА второго ведомого микрокон- троллера GPIOA->CRL =0x8b883333; // настройка линий РВ0-РВ7 пор- та РВ второго ведомого микрокон- троллера GPIOB->CRL =0x33333333; // конфигурация SPI1 SPI1->CR1 = (1<<6) | (0<<2); // включаем SPI, режим работы Slave (ведомый) while (1) // бесконечный цикл
RkJQdWJsaXNoZXIy MTQ4NjUy