====== 11. Přístrojové sběrnice SPI, paralelní, ... ====== ===== Cíle cvičení ===== - Seznámit se konfigurací přístrojových sběrnic MCU - Procvičit ovládání shieldu klávenice s displejem 1602 LCD Shield - Procvičit práci s ADC klávesnicí ===== Podklady pro cvičení ===== {{ :courses:b2m37mam:labs:mam_2025-cviceni_12.pdf | Podklady pro cvičení Bodový displej - Skalický}} [[https://www.hackster.io/electropeak/using-1602-lcd-keypad-shield-w-arduino-w-examples-e02d95|1602 Keyboard Shield]] [[https://www.laskakit.cz/user/related_files/hd44780_datasheet.pdf|HD44780U datasheet]] {{ :courses:b2m37mam:labs:stm32f401re.pdf | Datasheet STM32F401 }} {{ :courses:b2m37mam:stm32f401_refmanual.pdf | Referenční manuál STM32F401 }} {{ :courses:b2m37mam:nucleo_64_pins.pdf | Datasheet Nucleo F401RE}} {{ :courses:b2m37mam:labs:lcd1602.zip | Zdrojový kódy pro LCD display}} {{ :courses:b2m37mam:labs:max7219-max7221.pdf | MAX7219}} ===== Kódy pro cvičení ===== {{ :courses:b2m37mam:labs:arm11_main_template.zip | Šablona main.c (Krška)}} ===== Schéma a zapojení displeje ===== Displej je zapojený k paralelní 4-bitové sběrnicí k MCU a pro řízení je potřeba ještě dalších dvou řídících vodičů RS a EN. Zapojení displeje k MCU: ^ Pin MCU ^ Display ^ | PB5 | D4 | | PB4 | D5 | | PB10 | D6 | | PA8 | D7 | | PA9 | RS | | PC7 | EN | Připojení tlačítek k MCU je uděláno pomocí odporového děliče, kde jednotlivé rozhodovací úrovně je potřeba zjistit nejprve. {{:courses:b2m37mam:labs:lcdkeypad_shield_sch.png?600|}} ===== Kódy pro cvičení ===== Pro zapojení maticového displeje, které je možné ovládat přes SPI rozhraní, je potřeba vybrat piny, které lze využít pro tento typ komunikace. Jelikož nám stačí jednosměrná komunikace, není potřeba využít signálu MISO. STM32F401 disponuje 4 SPI rozhraními, vybereme jedno, např. na pinech PB3 (SCK) a PB5 (MOSI) a k tomu pin pro chip select (CS), např. PA15. Vše podle {{ :courses:b2m37mam:labs:stm32f401re.pdf#page=45 | Datasheetu STM32F401 }}. Základní nastaveni SPI rozhraní na pinech PB3 a PB5 s tím, že pin PA15 bude fungovat jako softwarový CS. Výběr alternativní funkce určíte pomocí {{ :courses:b2m37mam:labs:stm32f401re.pdf#page=45 | Datasheetu STM32F401 }} Propojení s Nucleo - postupujte podle {{ :courses:b2m37mam:nucleo_64_pins.pdf#page=32 | Datasheet Nucleo F401RE}} na str. 32. void SPI1_init(void){ // povoleni hodin pro GPIOA a GPIOB RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN; // nastaveni modu pinu PB3, PB5 a PA15 GPIOB->MODER &= ~GPIO_MODER_MODE3_Msk; // nastaveni obou bitu MODER3 do 0 GPIOB->MODER &= ~GPIO_MODER_MODE5_Msk; // nastaveni obou bitu MODER5 do 0 GPIOB->MODER |= ??; // alternate mode pro PB3 GPIOB->MODER |= ??; // alternate mode pro PB5 GPIOA->MODER &= ~GPIO_MODER_MODE15_Msk; // nastaveni obou bitu MODER15 do 0 GPIOA->MODER |= ??; // output pro PA15 // nastaveni AF pro piny PB3 a PB5 GPIOB->AFR[0] |= ??; // nastaveni AF5 pro PB3 GPIOB->AFR[0] |= ??; // nastaveni AF5 pro PB5 // nastaveni SPI rozhrani RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // povoleni hodin pro SPI1 SPI1->CR1 |= SPI_CR1_DFF; // nastaveni 16-bit komunikace SPI1->CR1 |= SPI_CR1_MSTR; // nastaveni jako master SPI1->CR1 |= SPI_CR1_SSM; // NSS bude ovladany SW SPI1->CR2 |= SPI_CR2_SSOE; // NSS bude jako vystup SPI1->CR1 |= SPI_CR1_SPE; // povoleni SPI rozhrani } void SPI1_sendWord(uint16_t data){ GPIOA->ODR &= ~GPIO_ODR_OD15; // nastaveni DISP_CS=0 SPI1->DR = data; //while(SPI1->SR & SPI_SR_BSY); // zpozdeni pro odeslani dat for(int i=0; i<50; i++); // zpozdeni pro odeslani dat GPIOA->ODR |= GPIO_ODR_OD15; // nastaveni load=1 } Sekvence zápisu do displeje je poté následující (16-bit komunikace) podle {{ :courses:b2m37mam:labs:max7219-max7221.pdf | datasheetu MAX7219}} ''0x0F01'' - Test displeje ON\\ ''0x0F00'' - Test displeje OFF - Normal Operation\\ ''0x0C01'' - Shutdown mode OFF - Normal Operation\\ ''0x0B07'' - Scan limit to 7 digits\\ ''0x0900'' - No Decode function ''0x01XX'' - ''0x08XX'' - výběr digitu a zápisu segmentů XX