f3discovery: попытка использовать ЖК-экран 1602 с модулем I2C

Я пытаюсь использовать ЖК-экран на моем stm32F3discovery. Экран состоит из жк-дисплея на 16 символов в 2 строки и модуля I2C.

Вот ссылка на продукт: https://www.aliexpress.com/item/32763867041.html?spm=a2g0s.9042311.0.0.27424c4dsV7dLS

На обратной стороне экрана я вижу надпись: QAPASS 1602A На микросхеме модуля I2C я вижу надпись: PCF8574T

Вот таблица данных чипа: https://www.nxp.com/docs/en/data-sheet/PCF8574_PCF8574A.pdf

Я пытался следовать за этим наставником (наиболее близким к тому, что я пытаюсь сделать): https://www.youtube.com/watch?v=1COFk1M2tak

Я использую библиотеку HAL, основная функция для отправки данных - "HAL_I2C_Master_Transmit".

Вот описание функции в "HAL_I2C_Master_Transmit":

  • @brief Передает в режиме мастера объем данных в режиме блокировки.
  • @param hi2c Указатель на структуру I2C_HandleTypeDef, которая содержит информацию о конфигурации для указанного I2C.
  • @param DevAddress Адрес целевого устройства: 7-битное значение адреса устройства в таблице данных должно быть сдвинуто влево перед вызовом интерфейса.
  • @param pData Указатель на буфер данных
  • @param Size Количество данных для отправки
  • @param Timeout Продолжительность тайм-аута
  • @retval статус HAL

HAL_StatusTypeDef HAL_I2C_Master_Transmit (I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint8_t * pData, uint16_t Size, uint32_t Timeout)

//I initialise a buffer
//I use a for loop to find the address of my slave: 0x3D (even tho on the //datasheet it's 0x3F, looks like A1 is bridged :O )
//I use the HAL_I2C_Master_Transmit function
//I move the address one bit to the left
//I reuse the HAL_I2C_Master_Transmit
//Nothing happens on the screen

//Here is my code (I tried to remove the useless comments):

#include "main.h"

I2C_HandleTypeDef hi2c1; // Init generated bu CubeMX
SPI_HandleTypeDef hspi1; // Init generated bu CubeMX
PCD_HandleTypeDef hpcd_USB_FS; // Init generated bu CubeMX

uint16_t adresseLCD; // the variable I put the slave address on
uint8_t buffer[]="123"; // The buffer I wanna see on the screen

void SystemClock_Config(void); // Generated by CubeMX
static void MX_GPIO_Init(void); // Generated by CubeMX
static void MX_I2C1_Init(void); // Generated by CubeMX
static void MX_SPI1_Init(void); // Generated by CubeMX
static void MX_USB_PCD_Init(void); // Generated by CubeMX

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_I2C1_Init();
    MX_SPI1_Init();
    MX_USB_PCD_Init();

    adresseLCD=0x3D;
    HAL_I2C_Master_Transmit(&hi2c1, adresseLCD, buffer, 1, 1000);

    adresseLCD=adresseLCD*2; // Yes I could have used "adresseLCD<<1" but I 
    //am not used to that
    HAL_I2C_Master_Transmit(&hi2c1, adresseLCD, buffer, 1, 1000);

    while(1)
    {
    }
}

Я ожидал, что что-то покажет на экране (даже случайные значения), но ничего не появляется (хотя горит). Я не получаю ошибки (только предупреждения, потому что я использую «1» вместо «Pin_ON» при использовании WritePIn)


person Gaetan Kelabra    schedule 19.06.2019    source источник
comment
Я не думаю, что вы можете просто написать строку и ожидать, что она появится на ЖК-дисплее, вероятно, у нее есть команды, которые вам нужно отправить перед текстом.   -  person Arkku    schedule 19.06.2019
comment
(Или, может быть, вам нужно отправить 4 бита за раз, а остальные 4 октета будут командой / режимом.)   -  person Arkku    schedule 19.06.2019


Ответы (2)


Вы ожидаете этого неправильно.

Во-первых, модуль I2C, распаянный сзади, это простой преобразователь из последовательного в параллельный. Когда вы записываете данные на шину I2C, она устанавливает свои 8 выходов в соответствии с 8 полученными битами в байтах данных. Когда вы читаете байты данных, он переключается в режим ввода и считывает логические уровни на 8 выводах и передает их по последовательному кабелю. Более подробное описание вы можете прочитать в техническом описании PCF8574. предоставили.

Т.е. эта часть не выполняет никакой «магии», которая будет принимать символы на входе и выводить их на дисплей. Это означает, что вывод случайных данных бесполезен.

Вам нужно знать еще две вещи:

  1. как этот модуль подключен к драйверу дисплея
  2. какой драйвер дисплея используется и как его использовать.

Ответ на первый вопрос можно найти в Интернете:  Схема ЖК-модуля I2C (взято из здесь)

Вы можете видеть, что дисплей подключен в 4-битном режиме, выходы P4-P7 (то есть то, что вы передаете в четырех старших битах байтов данных) подключены к строкам данных дисплея, а выходы < em> P0-P2 подключены к линиям управления RS, R / W, EH и P3 используется для управления подсветкой.

Зная это, мы подошли ко второму вопросу. Я могу только предположить, но, скорее всего, на вашем модуле дисплея есть Hitachi HD44780 IC. В таблице данных вы можете найти информацию о том, какие данные следует выводить на линии управления.

Вы можете найти описание пина на странице 8:

  • бит RS выбирает, будь то команда (0) или данные (1)
  • бит R / W выбирает операцию записи (0) или чтения (1)
  • а бит E на самом деле является стробоскопом. На заднем фронте, то есть при изменении от 1 до 0, драйвер дисплея считывает данные из строк данных. Это означает, что для передачи 4 бита данных вы должны выполнить 2 операции записи: первая с битом 2 установлена ​​в высокий уровень, вторая со всеми другими битами, такими же, но бит 2 равен нулю.

Теперь вы можете прочитать список инструкций на странице 25 таблицы данных. И последовательность инициализации для 4-битного режима на стр. 46 (Рисунок 24). Обратите внимание, что для каждой строки битов вы фактически отправляете 2 байта данных: с высоким битом 2, а затем с низким битом 2.

Обратите внимание, что в 4-битном режиме все команды и данные состоят из двух фаз записи: первая - верхняя половина, затем нижняя половина байта. Каждая фаза - это 2 записи данных в модуль I2C, со старшим и младшим битом E, то есть вам нужно отправить 4 байта для вывода 1 байта данных.

person AterLux    schedule 19.06.2019
comment
Теперь все гораздо яснее. Задача модуля I2C состоит только в том, чтобы уменьшить количество кабелей, мне все еще нужно кодировать ЖК-дисплей. Так что в некотором смысле использование I2C только усложняет задачу. Как бы то ни было, я попытался использовать этот наставник, который видел раньше, но не понял в то время. controllerstech.com/i2c-lcd-in-stm32 Я использовал только функции (заменил 0x4E другими значениями: 0x3C, 0x3D, 0x7F, 0x7E) У меня нет ошибки, но на экране ничего не отображается - person Gaetan Kelabra; 20.06.2019

Таким образом, в основном, чтобы передавать данные от вашего STM32 к драйверу ЖК-дисплея (HD44780), вам необходимо эмулировать сигнализацию интерфейса последнего через интерфейсную микросхему I2C (PCF8574).

Другими словами, MCU будет посылать команды I2C, которые будут переключать микросхему «рюкзака» I2C таким образом, чтобы она имитировала правильную сигнализацию для драйвера ЖК-дисплея.

Это происходит как-то легко, когда вы используете методы HAL_I2C_Master _ * (). В буферном массиве вы указываете состояние контактов на ЖК-дисплее, как вы хотите, и в порядке [0], [1], [2] ... и т. Д. Например, предположим, что у нас есть DB [7: 4] подключен к старшим 4 битам расширителя PCF I2C. Мы можем настроить следующее:

buffer[0] = 0xD0 ; // 0b11010000;
buffer[1] = 0xA0 ; // 0b10100000;
buffer[2] = 0xF0 ; // 0b11110000;

HAL_I2C_Master_Transmit(&hi2c1, adresseLCD, buffer, 3, 10); // Note 3 bytes are sent

Как только буфер подготовлен, вызов HAL_I2C_Master_Transmit () будет последовательно отправлять байты дерева, таким образом переключая контакты DB, как вы упомянули:

DB7: 1 -> 1 -> 1
DB6: 1 -> 0 -> 1
DB5: 0 -> 1 -> 1
DB4: 1 -> 0 -> 1

То же самое можно применить ко всем 8 контактам микросхемы PCF. Также стоит отметить, что это последовательное обновление ввода-вывода также создает немного меньше накладных расходов на связь I2C, поскольку оно адресует подчиненный чип I2C только один раз :).


Кстати, в настоящее время я работаю над ЖК-дисплеем поверх библиотеки I2C для STM32F1xx (вероятно, он подойдет для других серий STM32F). Вы можете проверить это на github (все еще WIP):

https://github.com/meteowrite/stm32_i2cLcd

Ваше здоровье

person meteowrite    schedule 26.04.2020