Skocz do zawartości

STM32F7 - SPI - uruchomienie wyświetlacza OLED


aro

Pomocna odpowiedź

Cześć,

posiadam płytkę Nucleo STM32F767ZI. Chciałem podłączyć do niej wyświetlacz OLED 1,3'' (A) ze sterownikiem SH1106

Korzystałem z kursu STM32 F1 HAL – #10 – wyświetlacz graficzny na SPI i starałem się modyfikować program pod moją płytkę i sterownik wyświetlacza. Program kompiluje się bez błędów, ale na wyświetlaczu nie zaświeci się nawet piksel. Proszę o jakieś wskazówki czy w ogóle idę w dobrą stronę z tym programem.

Wyprowadzenia podpięte są raczej prawidłowo:

  • VCC - 3.3V
  • GND - GND
  • DIN - PA_7
  • CLK - PA_5
  • CS (CE) - PC_8
  • D/C (DC) - PC_9
  • RES (RST) - PC_10
#include "stm32f7xx.h"

#define LCD_DC			GPIO_PIN_9
#define LCD_CE			GPIO_PIN_8
#define LCD_RST			GPIO_PIN_10

SPI_HandleTypeDef spi;

const unsigned char logo_mini_mono [] = {
		 0xFE,0x02,0x92,0x0A,0x54,0x2A,0x38,0xAA,0x12,0xAA,0x12,0xAA,0x12,0xAA,0x12,0xAA};

void lcd_reset()
{
	HAL_GPIO_WritePin(GPIOC, LCD_RST, GPIO_PIN_RESET);	// 0V Reset układu, aktywowany stanem niskim.
	HAL_Delay(200);
	HAL_GPIO_WritePin(GPIOC, LCD_RST, GPIO_PIN_SET); //3,3
}
void lcd_cmd(uint8_t cmd)
{
	HAL_GPIO_WritePin(GPIOC, LCD_CE|LCD_DC, GPIO_PIN_RESET);
	HAL_SPI_Transmit(&spi, &cmd, 1, HAL_MAX_DELAY);
	HAL_GPIO_WritePin(GPIOC, LCD_CE|LCD_DC, GPIO_PIN_SET);
	// CS Wybór urządzenia magistrali SPI, aktywowany stanem niskim.
	// D/C Wybór trybu pracy - stan niski oznacza przesył komend, wysoki - danych.

}

void lcd_data(const uint8_t* data, int size)
{
	HAL_GPIO_WritePin(GPIOC, LCD_DC, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, LCD_CE, GPIO_PIN_RESET);
	HAL_SPI_Transmit(&spi, (uint8_t*)data, size, HAL_MAX_DELAY);
	HAL_GPIO_WritePin(GPIOC, LCD_CE, GPIO_PIN_SET);
}

int main(void)
{
	 SystemCoreClock = 8000000; // taktowanie 8Mhz
	 HAL_Init();

	 __HAL_RCC_GPIOA_CLK_ENABLE();
	 __HAL_RCC_GPIOC_CLK_ENABLE();
	 __HAL_RCC_SPI1_CLK_ENABLE();

	 GPIO_InitTypeDef gpio;
	 gpio.Mode = GPIO_MODE_AF_PP;
	 gpio.Pin = GPIO_PIN_5 | GPIO_PIN_7;		// SCK, MOSI
	 gpio.Pull = GPIO_NOPULL;
	 gpio.Speed = GPIO_SPEED_FREQ_HIGH;
	 HAL_GPIO_Init(GPIOA, &gpio);

	 /*gpio.Mode = GPIO_MODE_AF_INPUT;
	 gpio.Pin = GPIO_PIN_6;						// MISO
	 gpio.Pull = GPIO_PULLDOWN;
	 HAL_GPIO_Init(GPIOA, &gpio);*/

	 gpio.Mode = GPIO_MODE_OUTPUT_PP;
	 gpio.Pin = LCD_DC|LCD_CE|LCD_RST;
	 HAL_GPIO_Init(GPIOC, &gpio);
	 HAL_GPIO_WritePin(GPIOC, LCD_CE|LCD_RST, GPIO_PIN_SET);

	 spi.Instance = SPI1;
	 spi.Init.Mode = SPI_MODE_MASTER;
	 spi.Init.NSS = SPI_NSS_SOFT;
	 spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;	// 4MHz
	 spi.Init.Direction = SPI_DIRECTION_2LINES;
	 spi.Init.CLKPhase = SPI_PHASE_1EDGE;
	 spi.Init.CLKPolarity = SPI_POLARITY_LOW;
	 spi.Init.DataSize = SPI_DATASIZE_8BIT;
	 spi.Init.FirstBit = SPI_FIRSTBIT_MSB;
	 spi.Init.TIMode = SPI_TIMODE_DISABLE;
	 spi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
	 spi.Init.CRCPolynomial = 7;
	 HAL_SPI_Init(&spi);

	 __HAL_SPI_ENABLE(&spi);

	 lcd_reset();

	 lcd_cmd(0xAE);//-- 11. turn off oled panel
	 lcd_cmd(0x02);//-- 1. set low column address
	 lcd_cmd(0x10);//-- 2. set high column address
	 lcd_cmd(0x40);//-- 4. set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
	 lcd_cmd(0x81);//-- 5. set contrast control register
	 lcd_cmd(0xCF);// Set SEG Output Current Brightness
	 lcd_cmd(0xA1);//-- 6. Set SEG/Column Mapping
	 lcd_cmd(0xC0);// 13. Set COM/Row Scan Direction
	 lcd_cmd(0xA6);//-- 8. set normal display
	 lcd_cmd(0xA8);//-- 9. set multiplex ratio(1 to 64)
	 lcd_cmd(0x3f);//--1/64 duty
	 lcd_cmd(0xD3);//- 14. set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	 lcd_cmd(0x00);//-not offset
	 lcd_cmd(0xd5);//-- 15. set display clock divide ratio/oscillator frequency
	 lcd_cmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
	 lcd_cmd(0xD9);//-- 16. set pre-charge period
	 lcd_cmd(0xF1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	 lcd_cmd(0xDA);//-- 17. set com pins hardware configuration
	 lcd_cmd(0x12);
	 lcd_cmd(0xDB);//-- 18. set vcomh
	 lcd_cmd(0x40);//Set VCOM Deselect Level
	 lcd_cmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
	 lcd_cmd(0x02);//
	 lcd_cmd(0x8D);//--set Charge Pump enable/disable
	 lcd_cmd(0x14);//--set(0x10) disable
	 lcd_cmd(0xA4);// Disable Entire Display On (0xa4/0xa5)
	 lcd_cmd(0xA6);// Disable Inverse Display On (0xa6/a7)
	 lcd_cmd(0xAF);//-- 11. turn on oled panel

	 lcd_data(logo_mini_mono, sizeof(logo_mini_mono));

	 while (1) {
	}
}

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.