stm32 и дисплей lph9135 не инициализируется

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

stm32 и дисплей lph9135 не инициализируется

Сообщение alex38779 »

Всем привет. Столкнулся с проблемой..

Нашел дисплей lph9135. Нашел пример с инициализацией дисплея для авр.

В дисплее стоит контроллер LDS183..

Вот что нашел
Philips PCF8833 compatible (LDS 183 LCD controller) RGB LCD module with 65K colors and 4-wire serial interface. The module has RAM included, that makes interfacing and programming very easy.
Код инициализации для АВР:
Спойлер

Код: Выделить всё

void LCD_init(void)
{
 LCD_CS=0;
 LCD_DATA=0;
 LCD_CLK=1;
 LCD_RESET = 1;
 LCD_RESET = 0;
 LCD_RESET = 1;
 LCD_CLK=1;
 LCD_DATA=1;
 LCD_CLK=1;
 delay_ms(10);
 Send_to_lcd(CMD, 0x01); //Программный сброс
 Send_to_lcd(CMD, 0x25); //Wtite Contrast
 Send_to_lcd(DAT, 0x40);    
 Send_to_lcd(CMD, 0x11); //Выход из спящего режима
 //sendCMD(0x03); // Booster on
 delay_ms(10);
 Send_to_lcd(CMD, 0x20); //Display Inversion Off
 Send_to_lcd(CMD, 0x38); //Idle Mod Off
 Send_to_lcd(CMD, 0x29); //Включение дисплея
 Send_to_lcd(CMD, 0x13); //Normal Mod On
 Send_to_lcd(CMD, 0x36); //Memory Access Control
 Send_to_lcd(DAT, 0x00);
 Send_to_lcd(CMD, 0x3a); //Установка цветовой палитры
 #ifdef _8_BIT_COLOR
 Send_to_lcd(DAT, 0x02); //Байт на пиксель 256 цветов
 #else
 Send_to_lcd(DAT, 0x05); //Два байта на пиксель 65536 цветов
 #endif
 Send_to_lcd(CMD, 0x2A); //X_Adress Area
 Send_to_lcd(DAT, 0x00);
 Send_to_lcd(DAT, 0x7F);
 Send_to_lcd(CMD, 0xB4); //Frame Frequency Select
 Send_to_lcd(DAT, 0x03);
 Send_to_lcd(DAT, 0x08);
 Send_to_lcd(DAT, 0x0B);
 Send_to_lcd(DAT, 0x0E);
 Send_to_lcd(CMD, 0xBA); //Display Control
 Send_to_lcd(DAT, 0x07);
 Send_to_lcd(DAT, 0x0D);
 Send_to_lcd(CMD, 0x2B); //Page Adress Set
 Send_to_lcd(DAT, 0x00);
 Send_to_lcd(DAT, 0x7F);    
}
Почитал данную тему http://radiokot.ru/forum/viewtopic.php?f=59&t=77865

Собрал такой код используя данные с вышеуказанной темы, только вбил свои команды инициализации.
Спойлер

Код: Выделить всё

#include <stm32f10x.h>
#include <stm32f10x_conf.h>

#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_spi.h>

#define RS_Hi (GPIOA->ODR |= GPIO_ODR_ODR1);        // RS = 1
#define RS_Low (GPIOA->ODR &= ~GPIO_ODR_ODR1);      // RS = 0
#define RESET_Hi (GPIOA->ODR |= GPIO_ODR_ODR2);     // RESET = 1
#define RESET_Low (GPIOA->ODR &= ~GPIO_ODR_ODR2);   // RESET = 0
#define CS_Hi (GPIOA->ODR |= GPIO_ODR_ODR3);        // CS = 1
#define CS_Low (GPIOA->ODR &= ~GPIO_ODR_ODR3);      // CS = 0


void delay_ms(uint32_t ms) {
	volatile uint32_t nCount;
	RCC_ClocksTypeDef RCC_Clocks;
	RCC_GetClocksFreq (&RCC_Clocks);
    nCount = (RCC_Clocks.HCLK_Frequency/10000)*ms;
    for (; nCount != 0; nCount--);
}

void SPI_Send (uint16_t SPI_Data) {
	//while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
	SPI_I2S_SendData(SPI1,SPI_Data);
	__NOP(); __NOP();
	while (SPI1->SR & SPI_SR_BSY);
}

void LCD_DATA(uint16_t data) {
  CS_Low;
  RS_Hi;
  SPI_Send(data);
  CS_Hi;
}

void LCD_CMD(uint16_t data) {
  CS_Low;
  RS_Low;
  SPI_Send(data);
  CS_Hi;
}

void LCD_init(void)
{
	CS_Low;
	RESET_Hi;
	RESET_Low;
	RESET_Hi;
	delay_ms(10);
	LCD_CMD(0x01);
	LCD_CMD(0x25);
	LCD_DATA(0x40);
	LCD_CMD(0x11);
	delay_ms(10);
	LCD_CMD(0x20);
	LCD_CMD(0x38);
	LCD_CMD(0x29);
	LCD_CMD(0x13);
	LCD_CMD(0x36);
	LCD_DATA(0x00);
	LCD_CMD(0x05);
	LCD_CMD(0x2a);
	LCD_DATA(0x00);
	LCD_DATA(0x7f);
	LCD_CMD(0xb4);
	LCD_DATA(0x03);
	LCD_DATA(0x08);
	LCD_DATA(0x0b);
	LCD_DATA(0x0e);
	LCD_CMD(0xba);
	LCD_DATA(0x07);
	LCD_DATA(0x0d);
	LCD_CMD(0x2b);
	LCD_DATA(0x00);
	LCD_DATA(0x7f);
}

int main(void) {
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA , &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA , &GPIO_InitStructure);

    SPI_I2S_DeInit(SPI1);
    SPI_InitTypeDef SPI_InitStructure;
    SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
    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_Init(SPI1,&SPI_InitStructure);
    SPI_I2S_ClearFlag(SPI1,SPI_I2S_FLAG_TXE);
    SPI_Cmd(SPI1, ENABLE);

    LCD_init();

    while (1)
    {
    }
    return 0;
}
При правильной инициализации должен появиться мусор на дисплее? А его нету. При прошивки меняется яркость дисплея, при выключении питания от платы с контроллером на дисплее появляются цветные полосы и исчезают через некоторое время..

Помогите пожалуйста разобраться..
Реклама
dvornik
Родился
Сообщения: 13
Зарегистрирован: Вс окт 12, 2014 11:39:19

Re: stm32 и дисплей lph9135 не инициализируется

Сообщение dvornik »

Send_to_lcd(CMD, 0xB4); //Frame Frequency Select
Send_to_lcd(DAT, 0x03);
Send_to_lcd(DAT, 0x08);
Send_to_lcd(DAT, 0x0B);
Send_to_lcd(DAT, 0x0E);

Команда 0xB4 - это Bottom Row Swap, а 0xС5 - это set devider frequency;
Реклама
Ответить

Вернуться в «ARM»