Skocz do zawartości

[STM32F4Disco] Stm+uart+nokia5110


Piwo85

Pomocna odpowiedź

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

}
Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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...

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.