Опубликован: 24.11.2024 | Доступ: свободный | Студентов: 2 / 0 | Длительность: 05:47:00
Лекция 7:

Последовательная связь

< Лекция 6 || Лекция 7: 1234567

Несколько слов о устройствах Qwiic и скорости

По какой-то необъяснимой причине многие устройства Qwiic от SparkFun работают со скоростью передачи данных 9 600 бод. Это совсем не стандартное значение.

9,600 бод - это стандартная скорость передачи данных для UART, и, конечно, по умолчанию, если вам нужно угадать. Однако весь смысл I2C заключается в том, чтобы воспользоваться преимуществами наличия тактовой линии и работать на той высокой скорости, которую она позволяет. Фактически, в I2C определено несколько скоростных режимов: Стандартный режим, пара быстрых режимов и пара высокоскоростных режимов. Стандартный режим - самый медленный, он работает со скоростью 100 кбит/с.

В последующих приложениях вы увидите, что модуль I2C настроен на работу со скоростью 9 600 бод. Это будет сделано только для соответствия используемым нами модулям Qwiic.

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

Применение ЖК-экрана

Далее мы создадим приложение hello world с ЖК-экраном.

Оборудование для этого демонстрационного приложения очень простое, поскольку в нем используется система Qwiic Connect System. Просто подключите один конец кабеля Qwiic к разъему Qwiic устройства Red-V Thing Plus, а другой конец - к модулю ЖК-экрана.

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

В этот раз мы не будем рассматривать схему, потому что все, что вам нужно - это Red-V Thing Plus, ЖК-экран и кабель Qwiic. Здесь представлена фотография аппаратного обеспечения приложения:

Аппаратные соединения для демонстрационного приложения ЖК-экрана

Рис. 6.14. Аппаратные соединения для демонстрационного приложения ЖК-экрана

Функции I2C в библиотеке Freedom Metal

Если вы просмотрите библиотеку и перейдете в ./freedom-metal/src/, вы найдете функции, которые мы будем использовать для настройки и использования модуля I2C в файлах i2c.h и i2c.c.

Получение экземпляра I2C

Как обычно, мы получим единственный экземпляр устройства I2C. То есть экземпляр 0:

     struct metal_i2c *i2c;
     i2c = metal_i2c_get_device(0);
Инициализация устройства I2C

Далее мы инициализируем это устройство I2C, указав устройство i2c, скорость передачи данных и режим работы (ведущий или ведомый).

     metal_i2c_init(i2c, I2C_BAUDRATE, I2C_MASTER);

В качестве напоминания, для скорости передачи данных мы будем использовать 9 600, но не привыкайте к этому. Для обычных устройств I2C этот аргумент гораздо более вероятен - 100,000, чем 9,600.

Операции записи

Для отправки символов и команд на экран мы будем использовать следующую функцию для выполнения операций записи. В качестве аргументов нам нужно указать устройство I2C, адрес I2C периферийного устройства, количество символов для отправки, буфер, в котором находятся эти символы, и нужно ли завершить передачу (послать условие остановки). Следующий фрагмент кода посылает символ 'H' на ЖК-экран:

     unsigned char buf[1];
     buf[0] = 'H';
     metal_i2c_write(i2c, LCD_ADDR, 1, buf, 1);

Бонусный модуль: Часы реального времени

Чтобы сделать нашу демонстрацию ЖК-дисплея немного более захватывающей, чем просто приветствие мира, мы получим некоторые числовые данные и выведем их на ЖК-экран. Эти данные могут поступать от датчика или из любой части нашей программы.

Чтобы упростить задачу, мы будем использовать модуль Real-Time Clock для получения значения его свободно работающего счетчика. RTC уникален тем, что на него не влияет сигнал кнопки сброса после того, как он начал работать. По этой причине наше приложение просто включит RTC, напечатает сообщение hello-world, а затем выведет относительное время из младшего байта счетчика RTC. Затем приложение застрянет в бесконечном цикле. Идея заключается в том, чтобы печатать другое значение времени каждый раз, когда мы нажимаем кнопку сброса на плате.

Чтобы запустить счетчик RTC, нам нужно просто установить бит 12 в регистре конфигурации RTC, расположенном по адресу 0x10000040. Значением, которое мы будем использовать, будет младший байт счетчика, находящийся по адресу 0x10000048. Следующие макросы помогут нам включить счетчик RTC и считать его младший байт, соответственно:

     #define  Red_V_RTC_start()       *((uint32_t *) 0x10000040) |= 1<<12
     #define  Red_V_RTC_rtccountlo   (*((uint32_t *) 0x10000048))

Как обычно, если вы хотите узнать больше о модуле RTC, ознакомьтесь с руководством FE310.

Функции утилиты ЖК-дисплея

Здесь у нас есть 3 функции полезности LCD, которые мы будем использовать:

Очистка экрана

Помните, чтобы очистить экран, вы должны отправить символ вертикальной полосы, за которым следует символ тире

void LCD_clear(struct metal_i2c *i2c){
  unsigned char buf[3] = "|-";
  metal_i2c_write(i2c, LCD_ADDR, 2, buf, 1);
}

Перемещение курсора в положение X-Y

Чтобы установить позицию курсора, нужно послать командный символ 254, за которым следует 128 + x + y*64. Здесь у нас есть функция, которая делает именно это:

void LCD_gotoxy(struct metal_i2c *i2c, uint32_t x, uint32_t y){
  unsigned char buf[2];
  x &= 0x0f; // Ограничение x от 0 до 15
  y &= 0x01; // Ограничить y от 0 до 1
  buf[0] = 254;
  buf[1] = 128 + x + y*64;
  metal_i2c_write(i2c, LCD_ADDR, 2, buf, 1);
}

Печать строки

Здесь представлена классическая функция print string, которая получает в качестве аргумента строку с нулевым окончанием. Обратите внимание, что она использует функцию записи I2C для отправки каждого символа на экран, как и было задумано.

void LCD_print_str(struct metal_i2c *i2c, unsigned char *str){
  metal_i2c_write(i2c, LCD_ADDR, strlen(str), str, 1);
}

Как вы, возможно, знаете, для использования функции strlen() нам необходимо #include<string.h>.

Печать младшего байта счетчика RTC

Поскольку мы планируем вывести некоторое числовое измерение времени из младшего байта счетчика RTC, мы будем использовать широко известную функцию sprintf() из stdio.h. Вот функциональная часть приложения:

LCD_clear(i2c);
LCD_print_str(i2c, "Hey there!");
now = Red_V_RTC_rtccountlo & 0xff;
sprintf(buff, "Time: %d\0",now);
LCD_gotoxy(i2c,3,1);
LCD_print_str(i2c,buff);
< Лекция 6 || Лекция 7: 1234567