Skocz do zawartości
aro

STM32F7 - SPI - uruchomienie wyświetlacza OLED

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) {
	}
}

 

Udostępnij ten post


Link to post
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!

Gość
Dołącz do dyskusji! Kliknij, aby zacząć 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...