ESP8266 Урок 18. I2C. Переходник для LCD 20×4. Переопределяем контакты

 

 

 

Продолжаем тему поддержки программного I2C в контроллере ESP8266 и сегодня мы ещё закрепим знания по данной теме, продолжив работу с символьным дисплеем разрешением в 4 строки по 20 символов, подключенному по шине I2C к нашему контроллеру. И целью данного занятия будет переопределение шины I2C на другие ножки. А возможно это благодаря тому, что I2C в контроллере ESP8266 программный, поэтому неважно, какие ножки дёргать.

Но, так как мы работаем с библиотекой SDK, да ещё тем более у которой код для нас закрыт, то это становится немного посложнее. Но, тем не менее, попробуем с такой задачей справиться.

Возникла такая задача из-за того, что одна из ножек I2C является также ножкой SPI, а нам вполне может понадобиться одновременное использование данных интерфейсов. А другая ножка совпадает с ножкой управления свечением синего светодиода.

Поэтому сегодня мы попытаемся переопределить ножки I2C на такие контакты, которые используются мало где, а также написать код так, чтобы в дальнейшем мы могли назначить на SDA и SCL любые ножки GPIO.

Схему нашу мы соберём почти такую же как и в уроке 10, только провода с контактов SDA и SCL переходника мы подключим соответственно к ножкам отладочной платы D1 и D2, которые в плате подключены к ножкам контроллера GPIO5 и GPIO4

 

 

Проект урока сделан из проекта урока 10 с именем I2C_LCD2004 и назван I2C_LCD2004_REMAP.

Откроем наш проект в Eclipse и в файле main.c удалим подключение стандартной библиотеки SDK для работы с I2C

 

#include "driver/i2c_master.h"

 

У нас будет своя библиотека. Правда часть кода было взято из примера исходного кода из того же SDK.

Также на данном уроке мы автоматизируем файл сценария Makefile, чтобы впоследствии при подключении новых модулей нам не приходилось вносить в него никаких изменений.

По требованиям нашего будущего файла сценария для каждого файла с исходным кодом с расширением c должен быть одноимённый заголовочный файл с расширением h. Исключением будет только файл user_config.h.

Поэтому создадим файл main.h следующего содержания

 

 

В файле main.с теперь удалим подключение всех бибилиотек

 

#include <stdio.h>

#include "ets_sys.h"

#include "osapi.h"

#include "user_interface.h"

#include "gpio.h"

#include "lcd.h"

 

А вместо них подключим наш новый заголовочный файл

 

 

В файле i2c_user.c подключим две стандартные библиотеки SDK

 

 

Добавим пока пустотелую функцию инициализации ножек I2C

 

 

Добавим прототип на данную функцию в заголовочном файле i2c_user.h, перейдём в тело функции user_init() файла main.c и удалим вызов следующей функции

 

i2c_master_gpio_init();

 

А вместо неё вызовем только что созданную нами

 

 

В файле i2c_user.h удалим подключение стандартной библиотеки I2C

 

#include "driver/i2c_master.h"

 

Добавим свои макросы для назначения ножек GPIO, а также для установки различных комбинаций уровней на них

 

 

Перейдём в файл i2c_user.c и добавим следующие прототипы функций для функционирования работы с прерываниями

 

 

Добавим также парочку глобальных переменных

 

 

Добавим удобную функцию для управления уровнями на ножках SDA и SCL

 

 

Ниже добавим функцию, узнающую уровень на ножке SDA

 

 

В файле i2c_user.h добавим макрос задержки

 

 

Вернёмся в файл i2c_user.c и после функции i2c_mas_getDC добавим функцию, обеспечивающую условие START

 

 

Ниже добавим функцию, которая обеспечит условие STOP

 

 

Ниже добавим функцию, которая обеспечит подтверждение (Ack)

 

 

Ниже добавим функцию, которая узнает, передал ли подтверждение SLAVE

 

 

Далее добавим функцию отправки подтверждения

 

 

Добавим функцию проверки подтверждения

 

 

 

Далее добавим функцию отправки байта

 

 

Далее добавим функцию инициализации I2C, в которой произведём серию импульсов на SCL

 

 

В функции отправки байта по адресу применим в вызовах функций новые имена

 

void I2C_SendByteByADDR(uint8_t c,uint8_t addr)

{

  uint16_t i;

  uint8_t ack;

  i2c_mas_start();

  //Transmit Address SLAVE

  i2c_mas_writeByte(addr);

  ack = i2c_mas_checkAck();

  if(!ack)

  {

    os_printf("ADDR not ack\r\n");

  }

  //Send data

  i2c_mas_writeByte(c);

  i2c_mas_send_ack();

  i2c_mas_stop();

}

 

Теперь осталось написать тело функции инициализации i2c_mas_gpio_init.

Отключим прерывания GPIO

 

 

Инициализируем ножки GPIO

 

 

Установим высокий уровень на ножке SCL

 

 

Разрешим прерывания

 

 

Вызовем функцию инициализации I2C

 

 

Если мы сейчас соберём код и прошьём контроллер, то у нас всё будет работать

 

 

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

Для этого мы будем использовать функции и автоматические переменные. Про них очень подробно рассказано в уроке 34 по программированию на языке C.

Перед тем как вносить изменения в Makefile, желательно выполнить очистку проекта с помощью команды Clean.

Также необходимо удалить, если у кого остался в каталоге build, ассемблерный файл main.s.

Объявим переменную каталога с исходниками

 

 

Также объявим и проинициализируем переменные с путями к файлам с исходными текстами и к объектным файлам

 

 

Добавим функцию сборки модуля

 

 

Изменим цель сборки общего объектного архива, применим там теперь наши переменные, а также автоматические переменные

 

 

Цели с именами src/main.o, src/lcd.o и rc/i2c_user.o удалим, а вместо них добавим общую цель

 

 

В цели очистки проекта применим шаблон для объектных файлов

 

 

После этого проект у нас должен будет благополучно собраться и объектные файлы теперь у нас окажутся в каталоге build, думаю так удобнее

 

 

Попробуем очистить проект. Файлы должны будут удалиться. Файл main.s, оставшийся там с незапамятных времён, удалим самостоятельно

 

 

Теперь можно ещё раз собрать проект, прошить контроллер, после чего дисплей наш должен по-прежнему отлично работать.

Таким образом, на данном уроке мы научились переопределять ножки GPIO шины I2C, а также сконструировали универсальный файл сценария Makefile, который в будущем позволит нам без его изменения добавлять и удалять модули наших проектов.

Всем спасибо за внимание!

 

Предыдущий урок Программирование МК ESP8266 Следующий урок

 

Исходный код

 

 

Модуль ESP NodeMCU можно купить здесь: Модуль ESP NodeMCU

Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266

Дисплей LCD 20×4 можно приобрести здесь Дисплей LCD 20×4

Дисплей LCD 16×2

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

ESP8266 I2C. Переходник для LCD 20?4. Переопределяем контакты

Добавить комментарий

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

*