STM32F030 + дисплей от Nokia 1202

В предыдущей статье был рассмотрен сам дисплей, его подключение к МК и печатная плата лицевой панели, но работа с этим дисплеем требует от микроконтроллера определенных команд и алгоритмов. Дисплей подключим к ранее разработанной отладочной плате на микроконтроллере STM32F030K6T6, в качестве среды разработки будет использоваться CooCox.

Следует начать с физической стороны решения, подключение лицевой панели к отладочной плате приведено на рисунке 1. Очень удобно для просмотра назначаемых ног и их функционала, а также генерации кода использовать утилиту STM CubeMX (рисунок 2), для подключения дисплея понадобится: 3 lines SPI (здесь небольшое отступление — нога CS будет подключаться и управляться отдельно) в режиме Transmit Only Master и три дополнительных ноги для сигналов !Reset, !CS, LED_ON.

SCH_LCD_connectРисунок 1 — Схема подключения панели к отладочной плате

STM32pinsРисунок 2 — Конфигурация портов

Контроллер дисплея работает по следующим интерфейсам:
– 3-lines Serial Interface (read and write);
– I2C (read and write);
– 4-Line Serial (read and write).

Но в этом дисплее на шлейф выведены только «3-lines Serial Interface».  Прелестью и ужасом этого интерфейса является девятый бит, он несет информацию о типе передаваемого байта и позволяет определять передается команда или данные. Положительная сторона 9-бит SPI — экономия одной ноги в контроллере, для подключения дисплея не надо ноги D/C, негативная — не каждый микроконтроллер может аппаратно работать в режиме передачи 9-бит. На отладочной плате установлен микроконтроллер STM32F030K6T6, в его даташите указанно что модуль SPI может работать с размером данных от 4 до 16 бит: «4-bit to 16-bit data size selection». На рисунке 3 приведена временная диаграмма передачи из даташита на контроллер дисплея.

SPI_9bit

Рисунок 3 — Временная диаграмма передачи

Расшифровка диаграммы: сигнал выбора !CS, перед передачей, с высокого уровня переводится в низкий, после чего выставляется значение сигнала данных (первого бита) и запускается тактирующий сигнал. Первым передается бит обозначающий команду или данные, следующие 8 бит (начиная со старшего) передается байт информации.

Рассмотрим код инициализации микроконтроллера и инициализации дисплея. Первое что нужно сделать, это правильно настроить в портах ввода вывода нужные ноги микроконтроллера:

void GPIO_Config(void)
{
    GPIO_InitTypeDef        LCD_PIN_SETUP;//Объявления структуры с настройками
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//Включение тактирования порта А
    /* Настройка пинов управления
     * в main.h приняты следующие переназначения
     * #define LCD_PORT GPIOA
     * #define LCD_LED_PIN GPIO_Pin_3
     * #define LCD_RESET_PIN GPIO_Pin_4
     * #define LCD_CS_PIN GPIO_Pin_6
     * #define LCD_PINS_CTRL (LCD_LED_PIN | LCD_RESET_PIN | LCD_CS_PIN)
     */
    LCD_PIN_SETUP.GPIO_Pin    = LCD_PINS_CTRL;
    LCD_PIN_SETUP.GPIO_Mode   = GPIO_Mode_OUT;
    LCD_PIN_SETUP.GPIO_OType  = GPIO_OType_PP;
    LCD_PIN_SETUP.GPIO_Speed  = GPIO_Speed_50MHz;
    LCD_PIN_SETUP.GPIO_PuPd    = GPIO_PuPd_NOPULL;
    GPIO_Init(LCD_PORT, &LCD_PIN_SETUP);//Инициализация настроек
    /* Настройка пинов интерфейса SPI
     * в main.h приняты следующие переназначения
     * #define LCD_MOSI_PIN GPIO_Pin_7
     * #define LCD_CLK_PIN GPIO_Pin_5
     * #define LCD_PINS_SPI (LCD_CLK_PIN | LCD_MOSI_PIN)
     */
    GPIO_PinAFConfig(LCD_PORT, LCD_PINS_SPI, GPIO_AF_0);//Выбор альтернативной функции пина
    LCD_PIN_SETUP.GPIO_Pin = LCD_PINS_SPI;
    LCD_PIN_SETUP.GPIO_Mode = GPIO_Mode_AF;
    LCD_PIN_SETUP.GPIO_Speed = GPIO_Speed_50MHz;
    LCD_PIN_SETUP.GPIO_OType = GPIO_OType_PP;
    LCD_PIN_SETUP.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(LCD_PORT, &LCD_PIN_SETUP);//Инициализация настроек
}

Далее идут настройки SPI интерфейса:

void SPI_Config(void)
{
    SPI_InitTypeDef  LCD_SPI_SETUP;//Объявления структуры с настройками
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);// Включение тактирования модуля SPI
    LCD_SPI_SETUP.SPI_Direction = SPI_Direction_1Line_Tx;// Выбор режима Transmit Only
    LCD_SPI_SETUP.SPI_Mode = SPI_Mode_Master;// Режим мастера
    LCD_SPI_SETUP.SPI_DataSize = SPI_DataSize_9b;// 9 бит информации
    LCD_SPI_SETUP.SPI_CPOL = SPI_CPOL_High; //Clk в режиме простоя в высоком уровне
    LCD_SPI_SETUP.SPI_CPHA = SPI_CPHA_2Edge;//Передача данных осуществляется при переходе сигнала SCK из низкого в высокий уровень
    LCD_SPI_SETUP.SPI_NSS = SPI_NSS_Soft;//отключение апаратного управления сигналом CS
    LCD_SPI_SETUP.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;// Предделитель сигнала тактирования
    LCD_SPI_SETUP.SPI_FirstBit = SPI_FirstBit_MSB;//Первым передается бит MSB
    LCD_SPI_SETUP.SPI_CRCPolynomial = 7;
    SPI_Init(SPI_NAME, &LCD_SPI_SETUP);//Инициализация настроек SPI
    SPI_CalculateCRC(SPI_NAME, DISABLE);//Отключение контроля контрольной суммы
    SPI_NSSInternalSoftwareConfig(SPI_NAME, SPI_NSSInternalSoft_Set);//Нога CS управляется софтово
    SPI_Cmd(SPI_NAME, ENABLE);//Включение SPI модуля
}

Функция передачи данных по SPI:

void lcd_write_once(uint8_t cd /*1й бит - тип информации*/, uint16_t data /*слово информации*/)
{
    uint16_t octet = data;
    if (cd) octet |= 0x100; //Проверка назначения информации (данные - 1 или команда - 0) 
    SPI_I2S_SendData16(SPI1, octet);//Передача информации
    while (SPI_GetTransmissionFIFOStatus(SPI1) == SPI_TransmissionFIFOStatus_Full); //Ожидание, пока SPI буфер не очистится
    while (SPI_GetTransmissionFIFOStatus(SPI1) != SPI_TransmissionFIFOStatus_Empty); //Ожидание, пока SPI буфер не передаст всю информацию
}

Функия main

int main(void)
{
    InitDelayTIM17();//Настройка тамера задержек
    GPIO_Config();//Настройка портов ввода-вывода
    SPI_Config();//Настройка SPI
    /* Управляющие сигналы дисплея
     * в main.h приняты следующие переназначения
     * #define LCD_LED_PIN_LOW  LCD_PORT->BRR = LCD_LED_PIN;
     * #define LCD_RESET_PIN_LOW  LCD_PORT->BRR = LCD_RESET_PIN;
     * #define LCD_CS_PIN_LOW  LCD_PORT->BRR = LCD_CS_PIN;
     * #define LCD_LED_PIN_HIGH  LCD_PORT->BSRR = LCD_LED_PIN;
     * #define LCD_RESET_PIN_HIGH  LCD_PORT->BSRR = LCD_RESET_PIN;
     * #define LCD_CS_PIN_HIGH  LCD_PORT->BSRR = LCD_CS_PIN;
     */
    LCD_LED_PIN_HIGH;// Включаем подсветку дисплея
    LCD_RESET_PIN_LOW;//низкий уровень reset
    LCD_CS_PIN_HIGH;//высокий уровень cs
    _delay_ms (50);//Временная задержка
    LCD_CS_PIN_LOW;//низкий уровень cs
    LCD_RESET_PIN_HIGH;//высокий уровень reset
    _delay_ms (200);//Временная задержка
    lcd_write_once(LCD_COMMAND, 0x2F);//Включение дисплея
    lcd_write_once(LCD_COMMAND, 0x38);//Включение термокомпенсации
    lcd_write_once(LCD_COMMAND, 0xA0);//Инверсия отображения
    lcd_write_once(LCD_COMMAND, 0xA6);//0xA7 - инверсия отображения
    lcd_write_once(LCD_COMMAND, 0x90);//Установка контраста
    lcd_write_once(LCD_COMMAND, 0xEC);//Установка частоты обновления 80 Гц
    lcd_write_once(LCD_COMMAND, 0xAF);//Разрешение работы LCD
    lcd_write_once(LCD_COMMAND, 0xA4);//Очистка экрана
    while (1)//Вечный цикл
    {
    }
}

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

White_

Рисунок 4 — Дисплей после инициализации

Пример работы с дисплеем и отображение различной графической информации будет рассмотрен в следующей статье.

Скачать:

Даташит на контроллер STE2007.

Проект печатной платы модуля дисплея в Altium Designer.

You may also like...

2 Responses

  1. Да ну, не все?! Я спокойно запускал эти стёкла на F100/103 аппаратным SPI. В этом случае используется 16 бит и отрезается лишнее дёрганием ножки CS (можно таймером). Если ещё и SPI+DMA, то скорость вывода будет заоблачной, но это неэффективно для данного стекла, оно медленное — вот цветные, другое дело.

  2. ujin:

    Владимир , автор указал работу с этой стекляшкой «прямым» способом и+ с самым бюджетным способом , а извращения наподобие вашего в сети действительно много…спс конечна и за него.

Добавить комментарий для Владимир Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>