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.
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 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í Datasheetu STM32F401
Propojení s Nucleo - postupujte podle 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 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