f3discovery: попытка использовать ЖК-экран 1602 с модулем I2C - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь использовать ЖК-экран на моем обнаружении stm32F3. Экран состоит из 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":

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

HAL_StatusTypeDef HAL_I2C_Master_Transmit (I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint8_t * pData, размер uint16_t, время ожидания uint32_t)

//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», когда я пишу в InPin)

1 Ответ

1 голос
/ 19 июня 2019

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

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

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

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

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

Ответ на первый вопрос можно найти в Интернете: I2C LCD module schematic (взято из здесь )

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

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

Описание контактов можно найти на странице 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 байта данных.

...