- Что такое протокол связи I2C?
- Как работает связь I2C?
- Где использовать связь I2C?
- I2C на Nuvoton N76E003 - Требования к оборудованию
- Взаимодействие AT24LC64 с Nuvoton N76E003 - принципиальная схема
- Контакты I2C на Nuvoton N76E003
- Связь I2C в N76E003
- Программирование N76E003 для связи I2C
- Прошивка кода и вывода
В огромной системе встроенных приложений ни один микроконтроллер не может выполнять все действия самостоятельно. На определенном этапе он должен связаться с другими устройствами для обмена информацией, существует множество различных типов протоколов связи для обмена этой информацией, но наиболее часто используемые из них - это USART, IIC, SPI и CAN. У каждого протокола связи есть свои преимущества и недостатки. Давайте сосредоточимся на части IIC, так как это то, что мы собираемся изучить в этом руководстве. Если вы здесь новичок, ознакомьтесь с учебными пособиями Nuvoton, в которых мы обсудили все периферийные устройства микроконтроллера N76E003 из самого базового учебного пособия по началу работы. Если вы хотите узнать, как использовать I2C с другими микроконтроллерами, вы можете проверить ссылки ниже.
- Как использовать I2C в Arduino: связь между двумя платами Arduino
- Связь I2C с PIC микроконтроллером PIC16F877
- Сопряжение ЖК-дисплея 16X2 с ESP32 с использованием I2C
- Связь I2C с MSP430 Launchpad
- Взаимодействие ЖК-дисплея с NodeMCU без использования I2C
- Как управлять несколькими коммуникациями (I2C SPI UART) в одной программе Arduino
I2C - важный протокол связи, разработанный Philips (ныне NXP). Используя этот протокол I2C, MCU можно подключить к нескольким устройствам и начать обмен данными. I2C работает только с двумя проводами, а именно SDA и SCL. Где SDA означает последовательные данные, а SCL означает последовательные часы. Однако для этих двух выводов требуются подтягивающие резисторы до уровня напряжения VCC, и с соответствующим подтягивающим резистором шина может поддерживать 127 устройств с уникальным адресом.
Что такое протокол связи I2C?
Термин IIC расшифровывается как « Inter Integrated Circuits ». Обычно он обозначается как I2C, или я в квадрате C, или даже как протокол 2-проводного интерфейса (TWI) в некоторых местах, но все это означает то же самое. I2C - это протокол синхронной связи, означающий, что оба устройства, которые обмениваются информацией, должны использовать общий тактовый сигнал. Он имеет только два провода для обмена информацией, один из которых используется для тактового сигнала, а другой - для отправки и приема данных.
Как работает связь I2C?
Связь I2C была впервые представлена Филлипсом. Как было сказано ранее, у него два провода, эти два провода будут подключены к двум устройствам. Здесь одно устройство называется ведущим, а другое - ведомым. Связь должна и всегда будет происходить между двумя, Мастером и Рабом. Преимущество связи I2C в том, что к ведущему можно подключить более одного ведомого устройства.
Полная связь осуществляется через эти два провода, а именно последовательные часы (SCL) и последовательные данные (SDA).
Последовательные часы (SCL): разделяет тактовый сигнал, генерируемый ведущим устройством, с ведомым устройством
Последовательные данные (SDA): отправляет данные между ведущим и ведомым.
В любой момент времени только мастер сможет инициировать обмен данными. Поскольку на шине более одного ведомого устройства, ведущее устройство должно обращаться к каждому ведомому устройству, используя другой адрес. При обращении только мазь с этим конкретным адресом ответит с информацией, в то время как остальные будут молчать. Таким образом, мы можем использовать одну и ту же шину для связи с несколькими устройствами.
Где использовать связь I2C?
Связь I2C используется только для связи на короткие расстояния. Он определенно надежен до некоторой степени, так как он имеет синхронизированный тактовый импульс, что делает его умным. Этот протокол в основном используется для связи с датчиком или другими устройствами, которые должны отправлять информацию мастеру. Это очень удобно, когда микроконтроллер должен взаимодействовать со многими другими подчиненными модулями, используя как минимум только провода. Если вы ищете связь на большие расстояния, вам следует попробовать RS232, а если вы ищете более надежную связь, вам следует попробовать протокол SPI.
I2C на Nuvoton N76E003 - Требования к оборудованию
Поскольку требование этого проекта - изучить связь I2C с помощью N76E003, мы будем использовать EEPROM, который будет подключен к линии данных I2C. Мы сохраним некоторые данные в EEPROM, а также прочитаем их и отобразим на экране UART.
Поскольку сохраненное значение будет напечатано в UART, потребуется преобразователь USB в UART любого типа. Вы также можете ознакомиться с руководством по UART с Nuvoton, если вы новичок в коммуникации UART на N76E003. Для нашего приложения мы будем использовать преобразователь UART в USB CP2102. Помимо вышеперечисленного, нам также требуются следующие компоненты:
- EEPROM 24C02
- 2шт резисторы 4.7k
Не говоря уже о том, что помимо перечисленных выше компонентов, нам нужна отладочная плата на базе микроконтроллера N76E003, а также программатор Nu-Link. Кроме того, для соединения всех компонентов требуются макетная плата и соединительные провода.
Взаимодействие AT24LC64 с Nuvoton N76E003 - принципиальная схема
Как видно на схеме ниже, EEPROM подключен к линии I2C вместе с двумя подтягивающими резисторами. В крайнем левом углу показано подключение интерфейса программирования.
Я использовал макетную плату для микросхемы AT24LC64 и подключил ее к моей плате программатора Nuvoton с помощью перемычек. Установка моего оборудования вместе с программатором nu-ink показана ниже.
Контакты I2C на Nuvoton N76E003
Схему выводов N76E003 можно увидеть на изображении ниже.
Как мы видим, каждый вывод имеет разные характеристики, и каждый вывод может использоваться для разных целей. Однако вывод 1.4 используется как вывод I2C SDA, он теряет ШИМ и другие функции. Но это не проблема, поскольку для этого проекта не требуется других функций. То же самое произойдет и с P1.3 - это контакт SCL I2C.
Поскольку контакты I2C действуют как GPIO, его необходимо настроить. Все контакты GPIO можно настроить в описанном ниже режиме.
Согласно таблице данных, PxM1.n и PxM2. n - два регистра, которые используются для определения операции управления портом ввода-вывода. В таблице данных указано, что для использования функций I2C режимы ввода-вывода должны использоваться как открытый сток для связи, связанной с I2C.
Связь I2C в N76E003
Периферийное устройство I2C - важная вещь для любого микроконтроллера, поддерживающего функции I2C. Многие типы различных микроконтроллеров поставляются со встроенным периферийным устройством I2C. Однако в некоторых случаях I2C можно настроить вручную с помощью программного управления, если аппаратная поддержка I2C недоступна (например, многие микроконтроллеры 8051). Однако nuvoton N76E003 поставляется с периферийной поддержкой I2C.
M76E003 поддерживает четыре типа операций в режимах I2C - главный передатчик, главный приемник, подчиненный передатчик и подчиненный приемник. Он также поддерживает стандартные (100 кбит / с) и высокие (до 400 кбит / с) скорости для линии I2C. I2C работает с несколькими общими правилами в сигнальных линиях SCL и SDA.
Условия запуска и остановки:
Это важная вещь в коммуникации I2C. Когда данные передаются в линию I2C, они начинаются с условия начала и заканчиваются условием остановки.
Условием запуска является переход от высокого уровня к низкому на SDA, когда линия SCL имеет высокий уровень, а условием остановки является переход от низкого к высокому уровню на SDA, когда линия SCL находится на высоком уровне. Эти два условия генерируются мастером (MCU или чем-либо, что управляет другими подчиненными устройствами). Линия шины остается занятой в этом состоянии, когда инициируется условие запуска, и снова остается свободной, когда инициируется условие остановки.
Состояние пуска и останова отлично показано в перспективе сигналов в таблице данных N76E003.
7-битный адрес с форматом данных:
N76E003 поддерживает 7-битный адрес и формат данных. После того, как условие запуска инициировано, ведущее устройство должно отправить данные на линию I2C. Первые данные очень важны. Если эти данные не созданы или не переданы должным образом, подключенное устройство не будет идентифицировано и дальнейшая связь невозможна.
Данные состоят из 7-битного адреса подчиненного устройства, обозначенного как SLA. Этот 7-битный адрес должен быть уникальным для каждого устройства, если к шине подключено несколько устройств. После 7-битного адреса 8-й бит является битом направления данных. Это означает, что в зависимости от 8-го бита, ведущее устройство отправляет информацию ведомому устройству о том, будут ли данные записываться на ведомое устройство или данные будут считаны с ведомого устройства. 8-й бит - это бит чтения / записи, называемый уведомителем чтения или записи. Как мы все знаем, 8-битная информация может быть 128 типов, таким образом поддерживая 128 устройств, но I2C поддерживает 127 типов устройств на одной шине, но не 128. Поскольку адрес 0x00 является зарезервированным адресом, который называется общим адресом вызова. Если мастер хочет отправить информацию на все устройства,он будет адресован 0x00, и каждое устройство будет воспроизводиться таким же образом, как и в индивидуальных конфигурациях программного обеспечения.
Таким образом, передача данных выглядит так:
Подтверждаю:
В приведенном выше изображении адреса данных 9-й бит, за которым следует бит чтения / записи, называется битом подтверждения. Это важно, потому что с помощью этого бита ведущее или ведомое устройство отвечает на передатчик данных, подтягивая линию SDA к низкому уровню. Чтобы получить бит подтверждения, передатчик должен освободить линию SDA.
Программирование N76E003 для связи I2C
Полную программу, используемую в этом руководстве, можно найти внизу этой страницы. Объяснение важных сегментов в коде следующее:
Установите контакты как открытый сток и настройте их для I2C:
Начнем сначала с секции выводов I2C. Как описано ранее, порты I2C SCL и SDA должны быть настроены и установлены как конфигурация с открытым стоком. Для этого мы используем файл заголовка I2C.h вместе с исходным файлом I2C.c . Фрагмент кода выглядит так:
сделать {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} пока (0)
Приведенный выше код устанавливает P13 и P14 как вывод с открытым стоком, а clr_I2CPX используется для выбора P13 и P14 как вывод SCL на P1.3 и вывод SDA на P1.4.
Этот I2CPX является 0-м битом регистра управления I2C I2CON. Если этот I2C_PX установлен как 1, контакты меняются на P0.2 как SCL и P1.6 как на SDA. Однако мы будем использовать P13 и P14. Альтернативные контакты здесь не используются.
Регистр управления I2C I2CON:
Регистр управления I2C I2CON используется для управления операциями I2C. Первый бит - это бит выбора вывода I2C. Установка 0 конфигурирует вывод I2C как P13 и P14.
Бит AA является флагом подтверждения подтверждения, если установлен флаг AA, ACK будет возвращен во время тактового импульса подтверждения линии SCL. Если он очищен, во время подтвержденного тактового импульса линии SCL будет возвращено NACK (высокий уровень на SDA).
Следующий бит - SI, который является прерыванием состояния I2C. Если прерывание состояния I2C включено, пользователь должен проверить регистр I2STAT, чтобы определить, какой шаг был пройден, и должен предпринять действия.
STO - это флаг STOP, установленный в ведущем режиме. STO автоматически сбрасывается оборудованием после обнаружения состояния STOP .
Следующий бит - это бит STA. Если этот флаг установлен, то I2C генерирует условие START, если шина свободна. Если шина занята, I2C ожидает состояния STOP и генерирует следующее условие START. Если STA устанавливается, когда I2C уже находится в ведущем режиме и один или несколько байтов были переданы или приняты, I2C генерирует повторяющееся условие START. Программа должна вручную очистить STA.
Последний, I2CEN - это бит включения или отключения шины I2C.
EEPROM 24C02:
Теперь перейдем к 24C02. Пакет поддержки платы N76E003 имеет код I2C для 24LC64 и может быть легко изменен. Однако мы воспользуемся простым методом, чтобы понять функцию I2C.
Если кто-то хочет использовать подробный интерфейс с EEPROM 24C02, то можно использовать программу EEPROM в BSP.
Мы будем подключать только 24C02 в I2C, где N76E003 будет ведущим, а EEPROM будет ведомым. Таким образом, мы будем записывать любые данные в адрес EEPROM и читать их.
Распиновка 24C02 EEPROM показана ниже.
A0, A1 и A2 - три контакта выбора адреса. Контакты WP являются контактами защиты от записи и должны быть подключены к VSS для обеспечения возможности записи в EEPROM.
Функциональность записи байта показана на изображении ниже.
Полный цикл записи происходит с помощью стартового бита. После этого необходимо отправить байт управления. В контрольном байте требуется следующее:
После стартового бита состоит из адреса подчиненного устройства. 1010 - статический, а A0, A1 и A2 - адрес на основе аппаратного соединения. Если три контакта подключены к источнику GND или VSS, он будет прочитан как 0. В противном случае, если он подключен к VCC, он будет считан как 1. В нашем случае все A0, A1 и A2 подключены к VSS. Таким образом, все это будет 0.
Расходы на условие чтения или записи. Значение адреса с битом чтения или записи будет - 0xA0 для записи и 0xA1 для чтения. Далее идет бит подтверждения, и после этого будет передан 8-битный адрес, где данные должны быть сохранены, и, наконец, данные, которые будут сохранены в соответствующем месте. Эти действия выполняются в пошаговом формате в основной функции.
Основная функция и цикл while:
недействительный основной (недействительный) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Важно, при использовании функции prinft необходимо установить TI = 1; I2C_init (); в то время как (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Прочитанное значение% x", c & 0xff); }; }
Основная функция проста: непрерывная запись значений в EEPROM по адресу 1 и чтение данных. Затем данные печатаются с использованием функции printf. Printf печатает значение в шестнадцатеричном формате.
Функция записи EEPROM состоит из следующих вещей, которые были описаны в разделе EEPROM:
void EEPROM_write (адрес символа без знака, значение символа без знака) {I2C_start (); I2C_write (0xA0); I2C_write (адрес); I2C_write (значение); I2C_stop (); }
Функция запуска I2C состоит из следующих вещей:
void I2C_start (void) {подписано int time = timeout; set_STA; clr_SI; while ((SI == 0) && (время> 0)) {время--; }; }
В этой функции проверяется статус SI вместе с предопределенным периодом тайм-аута (определенным в I2C.h, где предопределенное время установлено как 1000). Функция запуска начинается с установки STA и очистки SI.
void I2C_stop (void) {подписано int time = timeout; clr_SI; set_STO; while ((STO == 1) && (время> 0)) {время--; }; }
Так же, как и в режиме «Старт», используется функция остановки. Функция остановки инициируется установкой STO с последующей очисткой SI. Ниже представлена функция чтения I2C.
беззнаковый символ I2C_read (неподписанный char ack_mode) {подписанный int время = тайм-аут; значение беззнакового символа = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {время--; }; значение = I2DAT; если (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {время--; }; } возвращаемое значение; }
Ack_mode и I2C_NACK , как определены в файле заголовка I2C как 0 и 1 соответственно.
Аналогично создается функция записи -
void I2C_write (беззнаковое значение символа) {подписанное целое время = тайм-аут; I2DAT = значение; clr_STA; clr_SI; while ((SI == 0) && (время> 0)) {время--; }; }
Прошивка кода и вывода
Код вернул 0 предупреждений и 0 ошибок и был прошит с использованием метода прошивки по умолчанию Keil. Если вы новичок, ознакомьтесь с руководством по началу работы с nuvoton, чтобы понять, как загружать код. Информацию о компиляции кода можно найти ниже.
Цель сборки 'I2C_EEPROM', компиляция I2C_EEPROM.c… компиляция I2C.c… связывание… Размер программы: data = 59.2 xdata = 0 code = 2409 создание шестнадцатеричного файла из ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 ошибок, 0 предупреждений. Истекшее время сборки: 00:00:04 Сводка пакетной сборки: 1 успешно, 0 неудачно, 0 пропущено - Истекшее время: 00:00:04
Аппаратное обеспечение устанавливается на макетной плате и работает должным образом. Как вы можете видеть на изображении ниже, мы смогли записать значение в EEPROM, прочитать его из памяти и отобразить на последовательном мониторе.
Посмотрите видео, приведенное ниже, для полной демонстрации того, как плата работает для этого кода. Надеюсь, вам понравился урок и вы узнали что-то полезное, если у вас есть какие-либо вопросы, оставьте их в разделе комментариев ниже. Вы также можете использовать наши форумы, чтобы задать другие технические вопросы.