Добавил:
МТУСИ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практическая работа 7 - I2C / ПР_7_I2C_Мягков_БАП2201

.pdf
Скачиваний:
0
Добавлен:
21.04.2026
Размер:
24.69 Mб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики» (МТУСИ)

Кафедра «Интеллектуальные системы в управлении и автоматизации» (ИСУиА)

ПРАКТИЧЕСКАЯ РАБОТА №7

По дисциплине

Технологии промышленного интернета вещей

По теме «Протокол передачи данных I2C»

Выполнили: Студенты 4-го курса Группы БАП2201 Ли Самен Мягков А.К.

Проверил: к.т.н., доцент Воронов В.И.

Москва 2026

СОДЕРЖАНИЕ

 

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ........................................................

3

ВЫПОЛНЕНИЕ......................................................................................................

4

ВЫВОДЫ ................................................................................................................

7

2

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Протокол I2C (Inter-Integrated Circuit) – это синхронная полудуплексная шина связи, разработанная компанией Philips для передачи данных между интегральными схемами. В отличие от простого цифрового ввода/вывода, позволяющего передавать лишь логический уровень (0 или 1), I2C обеспечивает последовательную передачу целых байтов данных (от 0 до 255).

Физически связь осуществляется по двум линиям (рисунок 1):

SDA (Serial Data) – линия передачи данных;

SCL (Serial Clock) – линия тактирования (синхронизации). Обязательным условием работы является наличие общей земли (GND)

между устройствами. Аппаратная реализация протокола в микроконтроллере ATmega328P (на базе которого построена Arduino Nano) выведена на аналого-

вые пины A4 (SDA) и A5 (SCL).

Рисунок 1 – Логическая схема подключения двух устройств по шине I2C

Суть синхронизации в I2C заключается в следующем: ведущее устройство (Master) генерирует тактовые импульсы на линии SCL. Приёмник (Slave) считывает состояние линии SDA строго в моменты присутствия высокого логического уровня на SCL. Это исключает ошибки десинхронизации, вызван-

3

ные разницей в тактовых частотах микроконтроллеров.

Для организации обмена данными в сети используется адресация. Каждое ведомое устройство имеет уникальный 7-битный адрес (от 0 до 127). Перед началом передачи полезной нагрузки Master транслирует в эфир адрес целевого устройства. Только Slave с совпадающим адресом подтверждает готовность к приёму, остальные узлы на шине игнорируют передачу. Благодаря этому к двум проводам можно подключить до 127 периферийных устройств.

ВЫПОЛНЕНИЕ

Для практической реализации протокола была собрана схема из двух плат Arduino Nano. Первая плата выступала в роли ведущего (Master), вторая

– ведомого (Slave с адресом 0x08). Целью работы была передача числового значения от Master к Slave и изменение физического состояния (включение/выключение встроенного светодиода) на принимающей стороне в зависимости от полученных данных.

Логика работы программы (Листинг 1, Листинг 2) включает следующие этапы:

1)Инициализация аппаратной шины TWI (I2C) с использованием встроенной библиотеки Wire. Master запускается без адреса, Slave – с параметром 0x08;

2)На стороне Master реализован цикличный счётчик (от 0 до 255). Каждые 500 мс инициируется пакетная передача: формирование старт-бита, отправка адреса Slave, отправка байта данных, формирование стоп-бита;

3)На стороне Slave реализована система прерываний. При поступлении адреса 0x08 и последующих данных аппаратно вызывается функция-обработ- чик receiveEvent. Внутри прерывания считывается байт из буфера и устанавливается флаг готовности данных;

4)В основном цикле loop() ведомой платы проверяется флаг: если полученное значение превышает порог 127, на пин LED_BUILTIN подается высокий уровень, в противном случае – низкий.

4

Листинг 1 – Программа для Arduino Nano 1 (Master) на языке C++

#include <Wire.h>

#define SLAVE_ADDRESS 0x08 byte counter = 0;

void setup() { Wire.begin(); Serial.begin(9600);

}

void loop() { Wire.beginTransmission(SLAVE_ADDRESS); Wire.write(counter);

byte error = Wire.endTransmission(); if (error == 0) {

Serial.print("Успешно отправлено: "); Serial.println(counter);

} else {

Serial.println("ОШИБКА: Устройство не найдено!");

}

counter++;

delay(500);

}

Листинг 2 – Программа для Arduino Nano 2 (Slave) на языке C++

#include <Wire.h>

#define SLAVE_ADDRESS 0x08 volatile byte receivedValue = 0; volatile bool dataReady = false; void setup() {

Serial.begin(9600);

Wire.begin(SLAVE_ADDRESS); Wire.onReceive(receiveEvent); pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {

if (dataReady) {

if (receivedValue > 127) { digitalWrite(LED_BUILTIN, HIGH);

} else {

digitalWrite(LED_BUILTIN, LOW);

}

Serial.print("Получено от Мастера: ");

Serial.println(receivedValue); dataReady = false;

}

}

void receiveEvent(int howMany) { while (Wire.available()) {

receivedValue = Wire.read();

}

5

dataReady = true;

}

На рисунке 2 представлена физическая схема соединения плат. Проводами соединены пины GND (рыжий провод), A4 (белый провод, линия SDA) и A5 (коричневый провод, линия SCL).

Рисунок 2 – Схема соединения двух Arduino Nano по интерфейсу I2C

Примечание: в условиях коротких соединений в лабораторной работе были использованы внутренние подтягивающие резисторы микроконтроллера. При проектировании промышленных систем на шину SDA и SCL обязательно устанавливаются внешние резисторы номиналом 4.7 кОм между линиями и питанием +5В.

Для верификации работоспособности системы была проведена проверка с использованием инструмента последовательного порта (Serial Monitor) в Arduino IDE. В ходе тестирования (рисунок 3) было зафиксировано, что Master успешно отправляет инкрементируемые значения, а Slave корректно их принимает.

6

Рисунок 3 – Лог монитора последовательного порта:

слева – Master (отправка), справа – Slave (приём и управление светодиодом)

Визуально было подтверждено срабатывание исполнительного механизма: встроенный светодиод на плате Slave переходил в состояние «Включено» при получении значений из диапазона 128–255, и в состояние «Выключено» при получении значений 0 – 127.

ВЫВОДЫ

Реализована передача данных между двумя микроконтроллерами Arduino Nano по протоколу I2C. В отличие от дискретного ввода-вывода, применение интерфейса I2C позволило организовать адресную передачу многобитных пакетов данных по двухпроводной шине. В программном коде ведомого устройства была применена аппаратная обработка прерываний для асинхронного приёма данных без блокировки основного цикла программы. Функциональность созданной сети проверена путём мониторинга последовательного порта и визуального наблюдения за управлением индикатором на устройствах.

7