Skocz do zawartości

[STM32F4Disco] Stm+uart+nokia5110


Pomocna odpowiedź

Napisano

Witam. Posiadam płytkę STM32F411-e Discovery. Od ostatniego razu dowiedziałem się troszkę rzeczy i wiem, że płytki Discovery potrzebują zewnętrznego konwerter UART. Posiadam taki konwerter. Pierwsze pytanie. Czy wystarczy podpiąć RX, TX oraz GND? Piny podpiąłem pod uart2_rx oraz uart2_tx. Drugą sprawą jest wyświetlacz lcd od Nokii 5110. Korzystałem z poradnika zawartego na forbocie i utworzyłem wszystko zgodnie z poradnikiem. Próbowałem różnych kombinacji pinów i na żadnych nie działało. Nie wiem czy to kwestia podpięcia, czy moich błędów w pisaniu programu. DIN(mosi), CLK(sck), gnd, vcc podpiąłem bez problemu. Zostają jeszcze piny RST, CE oraz DC. Gdzie mogę je podpiąć i czemu? Czy mogą być to w dowolne piny jak? Czytając manuala z 103rb widziałem, że w poradniku piny były podpięte w piny posiadające ADC12_IN11-13. Czy to ma znaczenie czy był to raczej zbieg okoliczności? Jeśli piny nie stanowią problemu i są dobrze zdefiniowane czy może to wina kodu? Pliki źródłowe i nagłówkowe zostały przepisane z poradnika i oczywiście zmieniłem w piny od RST, CE, DC. Tutaj podaje source code. Może znajdzie ktoś z Was mój błąd i uświadomi mnie czy coś źle robie czy też nie. Z góry dziękuję za każdą pomoc i wskazówkę!

#include <stdio.h>
#include <stdint.h>
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "string.h"
#include "lcd.h"
#include "font.h"
#include "delay.h"
#include "bitmap.h"
#include "main.h"

SPI_InitTypeDef  SPI_InitStructure;

const unsigned char logo_mini_mono [] = {
0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
};

uint8_t spi_sendrecv(uint8_t byte)
{
 // poczekaj az bufor nadawczy bedzie wolny
 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
 SPI_I2S_SendData(SPI1, byte);

 // poczekaj na dane w buforze odbiorczym
 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
 return SPI_I2S_ReceiveData(SPI1);
}


//resetowanie stanu początkowego
void lcd_reset()
{
GPIO_ResetBits(GPIOE, LCD_RST);
GPIO_SetBits(GPIOE, LCD_RST);
}

//ustawianie CS'a High
void lcd_cmd(uint8_t cmd)
{
GPIO_ResetBits(GPIOB, LCD_DC);
GPIO_ResetBits(GPIOC, LCD_CE);
spi_sendrecv(cmd);
GPIO_SetBits(GPIOC, LCD_CE);
}

//przesył danych jako cały bufor
void lcd_data(const uint8_t* data, int size)
{
int i;
GPIO_SetBits(GPIOB, LCD_DC);
GPIO_ResetBits(GPIOC, LCD_CE);
for (i = 0; i < size; i++)
spi_sendrecv(data[i]);
GPIO_SetBits(GPIOC, LCD_CE);
}


void SPI_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

 /* Peripheral Clock Enable -------------------------------------------------*/
 /* Enable the SPI clock */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

 /* Enable GPIO clocks */
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

 GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_SPI1);
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_SPI1);
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_SPI1);


 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_3;
 GPIO_Init(GPIOA, &GPIO_InitStructure);

 SPI_I2S_DeInit(SPI1);

 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial = 7;
 /* Initializes the SPI communication */
 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
 SPI_Init(SPI1, &SPI_InitStructure);
}
int main(void)
{

GPIO_InitTypeDef gpio;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

gpio.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7; // SCK, MOSI
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);


gpio.GPIO_Pin = LCD_DC;
gpio.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOA, &gpio);

gpio.GPIO_Pin = LCD_CE;
gpio.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOA, &gpio);
GPIO_SetBits(GPIOA, LCD_CE);

gpio.GPIO_Pin = LCD_RST;
gpio.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOA, &gpio);

SPI_Config();



lcd_reset();

lcd_cmd(0x21);
lcd_cmd(0x14);
lcd_cmd(0x80 | 0x2f); //Ustawienie kontrastu
lcd_cmd(0x20);
lcd_cmd(0x0c);

lcd_data(logo_mini_mono, sizeof(logo_mini_mono));

 while (1) {}

}
Próbowałem różnych kombinacji pinów i na żadnych nie działało.

Zawsze jest możliwość, że pierwsza kombinacja pinów, jaką wypróbowałeś, spaliła urządzenie albo w inny sposób je permanentnie uszkodziła -- nie warto próbować takich rzeczy na ślepo, tym bardziej, że jest nota katalogowa w której wszystko jest dokładnie opisane.

A co do niedziałającego wyświetlacza, to widzę jeszcze dwa możliwe powody niedziałania: 1) zapomniałeś podłączyć podświetlenia ekranu, 2) kontrast jest ustawiony na taki, że akurat nic nie widać.

Próbowałem różnych kombinacji pinów i na żadnych nie działało.

Zawsze jest możliwość, że pierwsza kombinacja pinów, jaką wypróbowałeś, spaliła urządzenie albo w inny sposób je permanentnie uszkodziła -- nie warto próbować takich rzeczy na ślepo, tym bardziej, że jest nota katalogowa w której wszystko jest dokładnie opisane.

A co do niedziałającego wyświetlacza, to widzę jeszcze dwa możliwe powody niedziałania: 1) zapomniałeś podłączyć podświetlenia ekranu, 2) kontrast jest ustawiony na taki, że akurat nic nie widać.

Podświetlenie jest podpięte i lekkie jest (nie jest maksymalna wartość). Kontrast jest ustawiony taki jak w poradniku na stronie. Wątpię że spaliło urządzenie ponieważ jedna kombinacja była taka jak w jakimś zagranicznym poradniku, a druga była zgodna z manualem 103rb i była przełożona na mój mikrokontroler, a do tego masa cały czas była podpięta + podświetlenie cały czas jest w wyświetlaczu.

Podświetlenie jest całkowicie osobnym układem w tych wyświetlaczach, więc to zupełnie nic nie znaczy.

Ale pobaw się różnymi wartościami kontrastu -- dla różnych sztuk tego wyświetlacza, w różnych temperaturach i przy różnym oświetleniu to inaczej wychodzi.

[ Dodano: 21-01-2017, 21:06 ]

Co jeszcze możesz spróbować, to zmniejszyć częstotliwość zegara SPI -- zapewne zmieniając linijkę "SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;", ale nie znam się na STM-ach, więc ci nie powiem na co.

Niestety nic nie pomaga. Skorzystałem z pinów z tej strony i nadal nic. Próbowałem też zmieniać kontrast i nadal jest ekran wygląda tak samo. Może jakieś inne propozycje?

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ę »
×
×
  • Utwórz nowe...