سلام. من میخوام یه ال سی دی گرافیکی به اسم EA-DOGS 102 با میکرو stm32f09 راه اندازی کنم. یه برنامه برا همین ال سی دی منتها با سری f1 پیدا کردم و تغییر دادم برا f0 ولی جواب نمیگیرم. حتی پس زمینه ال سی دی هم روشن نمیشه. که احتمالا تو کانفیگ spi مشکل دارم. کسی میتونه کمکم کنه؟
CS=PA4
CLK=PA5
MOSI=PA7
RST=PA8
CMD=PA9
CS=PA4
CLK=PA5
MOSI=PA7
RST=PA8
CMD=PA9
#include "lcd.h"
#include "font_lcd.h"
#include "stm32f0xx.h"
#include "stm32f0xx_conf.h"
void write_lcd (byte lcd_byte, byte lcd_mode)
{
Delay(200);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
if (lcd_mode) GPIO_ResetBits(GPIOA, GPIO_Pin_8);
else GPIO_SetBits(GPIOA, GPIO_Pin_8);
sendbyte_spi_lcd(lcd_byte);
Delay(10);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
void clear_lcd (void)
{
write_lcd(0x01,1);
Delay(50);
}
void write_byte_lcd (byte lcd_x, byte lcd_y, byte lcd_ascii, byte invertiert)
{
byte lcd_offset = 0;
if (lcd_x > (101)) lcd_x = 0;
if (lcd_y > (31)) lcd_y = 0;
switch (lcd_y) {
case 0: lcd_offset = 0x80; break;
case 1: lcd_offset = 0xC0; break;
default: lcd_offset = 0x80;
};
write_lcd(lcd_x+lcd_offset,1);
write_lcd(lcd_ascii,0);
}
void printf_lcd(byte lcd_x, byte lcd_y, byte *lcd_zeichen, byte invertiert)
{
byte lcd_i;
byte lcd_offset = 0;
if (lcd_x > (101)) lcd_x = 0;//spalten
if (lcd_y > (31)) lcd_y = 0;//zeilen
switch (lcd_y) {
case 0: lcd_offset = 0x80; break; // Zeile 1
case 1: lcd_offset = 0xC0; break; // Zeile 2
default: lcd_offset = 0x80;
}
write_lcd(lcd_x+lcd_offset,1); // Kursorposition setzen
lcd_offset = strlen(lcd_zeichen); // Länge der Zeichenkette
if (lcd_offset > 102) lcd_offset = 102;
for(lcd_i = lcd_offset ; lcd_i ; lcd_i--) {
write_lcd(*lcd_zeichen,0);
lcd_zeichen++;
}
if (invertiert) {
// Löschen bis Zeilenende
for(lcd_i = 102 - lcd_offset - lcd_x ; lcd_i ; lcd_i--) write_lcd(' ',0);
}
}
void init_lcd(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_4);
Delay(500);
write_lcd(0x39,1);
write_lcd(0x39,1);
write_lcd(0x14,1);
write_lcd(0x55,1);
write_lcd(0x6D,1);
write_lcd(0x78,1);
write_lcd(0x0C,1);
write_lcd(0x06,1);
clear_lcd();
}
void sendbyte_spi_lcd (byte Data) {
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_SendData8(SPI1, Data);
}
void Delay(__IO uint32_t nCount) {
while(nCount--) {
}
}
int main(int argc, char* argv[])
{
config_pin ();
init_lcd();
while (1)
{
printf_lcd(1,1,0x41,1);
}
// Infinite loop, never return.
}
void config_pin()
{
config_SPI();
config_ADC();
config_push_button();
config_LEDs();
config_interrupt();
}
//------------------------------------------------------------------------------
void config_SPI()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // SPI1 Takt freigeben
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_MOSI_CLK;
GPIO_MOSI_CLK.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_MOSI_CLK.GPIO_Mode = GPIO_Mode_AF;
GPIO_MOSI_CLK.GPIO_OType = GPIO_OType_PP;
GPIO_MOSI_CLK.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_MOSI_CLK.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_MOSI_CLK);
//connect pins to AF
GPIO_InitTypeDef GPIO_CS_RST_CMD;
GPIO_CS_RST_CMD.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_8| GPIO_Pin_9;
GPIO_CS_RST_CMD.GPIO_Mode = GPIO_Mode_OUT;
GPIO_CS_RST_CMD.GPIO_OType = GPIO_OType_PP;
GPIO_CS_RST_CMD.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_CS_RST_CMD.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_CS_RST_CMD);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);
SPI_InitTypeDef SPI_InitStructure; // SPI Struktur
SPI_I2S_DeInit(SPI1);
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; // Nur senden
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // SPI Master-Mode
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 8 Datenbits
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // CPOL High=Ruhezustand
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // CPHA 2. Flanke (L/H) gibt Daten aus
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // CS Chipselect per Software
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; // Taktfrequenz 72MHz/32 = 2,2 MHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // MSB (höherwertiges Bit) zuerst senden
SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC (?)
SPI_Init(SPI1, &SPI_InitStructure); // SPI initialisieren
SPI_Cmd(SPI1, ENABLE); // SPI freigeben
//--------------------------------------------------------------------
//-------------------------------------------------------------------------
}
//------------------------------------------------------------------------------
void config_push_button()
{
}
//------------------------------------------------------------------------------
void config_LEDs()
{
}
//------------------------------------------------------------------------------
void config_interrupt()
{
}
//------------------------------------------------------------------------------