aro Napisano Maj 20, 2019 Udostępnij Napisano Maj 20, 2019 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 More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »