Каталог товаров
Клиенту
Тема сайта:
+38 (066) 305-77-25
Наш адрес
Харьков, времено - только доставка Новой Почтой, УкрПочтой, МистЕкспрес, ROZETKA Delivery
Телефоны:
Время работы
  • Пн-Пт: с 9 до 18
  • Сб.: с 10 до 17
  • Вс: с 11 до 16
E-mail
Мы в соцсетях
Перейти в контакты
0 0
Каталог
Главная
Закладки
0
Сравнить
0
Контакты

Портативний міні-дебаггер I2C/SPI на Arduino Nano

Чи була корисною ця стаття?
Портативний міні-дебаггер I2C/SPI на Arduino Nano

Создаем мини-дебаггер I2C/SPI на Arduino Nano

Когда твой I2C-датчик молчит как партизан на допросе, а SPI-устройство посылает какие-то странные сигналы - время браться за серьезные инструменты!

Введение

Привет, электронные детективы! 🕵️‍♂️ Сегодня мы создадим что-то особенное - компактный дебаггер для шин I2C и SPI на базе Arduino Nano с крохотным OLED-дисплеем. Да-да, именно на том 0.42-дюймовом дисплее, который настолько мал, что его можно спутать с пикселем из Minecraft! Но не волнуйтесь, мы заставим этого малыша работать на полную.

Fun fact: Знаете, почему I2C называют "I squared C"? Потому что инженеры, которые его создавали, были слишком ленивы, чтобы постоянно говорить "Inter-Integrated Circuit". А мы, разработчики, ценим лаконичность!

Arduino Nano с OLED

Практическое применение дебаггера

1. Тестирование I2C устройств
  • Поиск адресов устройств: Быстрое определение I2C адресов всех подключенных сенсоров, дисплеев или других модулей
  • Обнаружение конфликтов адресов: Если два устройства используют одинаковый адрес, наш дебаггер это покажет
  • Проверка исправности: Мгновенное определение проблем с устройством или подключением
2. Диагностика SPI коммуникации
  • Анализ данных: Перехват и анализ обмена данными между микроконтроллером и SPI устройствами
3. Отладка новых устройств
  • Тестирование прототипов: Быстрая проверка работы новых модулей
  • Настройка адресов: Проверка правильности настройки программируемых адресов
4. Образовательные цели
  • Изучение протоколов: Наглядная демонстрация работы I2C и SPI протоколов
  • Практические эксперименты: Возможность экспериментировать с различными настройками

Что нам понадобится

  • Arduino Nano с OLED 0.42" (наш мини-детектив)
  • Набор проводов (цветных, чтобы было веселее)
  • Резисторы подтяжки для I2C (4.7kΩ x 2)
  • Терпение (много!)
  • Чашка кофе (без нее никак)

Схема подключения

схема подключения
SDA -> A4
SCL -> A5
MOSI -> D11
MISO -> D12
SCK -> D13
SS -> D10

Лайфхак: Если перепутаете SDA и SCL - ничего страшного. Arduino просто будет смотреть на вас с легким разочарованием через OLED-дисплей. 😅

Разработка интерфейса

Да, у нас всего 72x40 пикселей. Это как пытаться написать "Войну и мир" на почтовой марке! Но мы справимся:

скриншот интерфейса

Организация экрана:

  • Верхняя строка: статус шины и протокол
  • Средняя часть: данные/адреса

Fun fact: Если вам кажется, что 72x40 пикселей - это мало, вспомните, что первая игра Pong работала всего с несколькими пикселями. И ничего, люди даже в очередь стояли, чтобы поиграть!

Программный код

Вот сердце нашего дебаггера:


#include 
#include 
#include 

#define OLED_ADDRESS 0x3C
#define CS_PIN 10    // SS
#define MOSI_PIN 11  // MOSI
#define MISO_PIN 12  // MISO
#define SCK_PIN 13   // SCK

// Инициализация дисплея
U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0);
bool showSPI = false;

void setup() {
    Wire.begin();
    Wire.setClock(100000); // 100kHz для стабильности
    
    // Настраиваем SPI пины
    pinMode(CS_PIN, OUTPUT);
    pinMode(MISO_PIN, INPUT_PULLUP);
    pinMode(MOSI_PIN, OUTPUT);
    pinMode(SCK_PIN, OUTPUT);
    
    digitalWrite(CS_PIN, HIGH);
    SPI.begin();
    
    u8g2.begin();
    u8g2.setContrast(255);
}

void scanI2C() {
    byte count = 0;
    byte devices[10];
    
    // Сканирование шины
    for(byte address = 1; address < 127; address++) {
        if(address == OLED_ADDRESS) continue; // Пропускаем адрес дисплея
        
        Wire.beginTransmission(address);
        byte error = Wire.endTransmission();
        
        if(error == 0 && count < 10) {
            devices[count] = address;
            count++;
        }
        delay(1);
    }
// Обновление дисплея
    u8g2.firstPage();
    do {
        u8g2.setFont(u8g2_font_7x13_tr);
        u8g2.drawStr(2, 9, "I2C:");
        
        u8g2.setFont(u8g2_font_9x15_tr);
        
        char buffer[12];
        for(byte i = 0; i < count && i < 2; i++) {
            sprintf(buffer, "0x%02X", devices[i]);
            u8g2.drawStr(5, 24 + (i * 15), buffer);
        }
        
        if(count == 0) {
            u8g2.drawStr(5, 25, "NONE");
        }
        
    } while(u8g2.nextPage());
}

void scanSPI() {
    // Делаем несколько замеров для надежности
    byte responses[5];
    for(byte i = 0; i < 5; i++) {
        digitalWrite(CS_PIN, LOW);
        delayMicroseconds(100);
        responses[i] = SPI.transfer(0xFF);
        delayMicroseconds(100);
        digitalWrite(CS_PIN, HIGH);
        delay(1);
    }
    
    // Проверяем, меняются ли значения
    bool hasResponse = false;
    for(byte i = 1; i < 5; i++) {
        if(responses[i] != responses[0]) {
            hasResponse = true;
            break;
        }
    }
    
    u8g2.firstPage();
    do {
        u8g2.setFont(u8g2_font_7x13_tr);
        u8g2.drawStr(2, 9, "SPI:");
        
        u8g2.setFont(u8g2_font_9x15_tr);
        
        if(hasResponse) {
            u8g2.drawStr(5, 24, "ACTIVE");
            char buffer[12];
            sprintf(buffer, "0x%02X", responses[0]);
            u8g2.drawStr(5, 39, buffer);
        } else {
            u8g2.drawStr(5, 24, "NONE");
        }
        
    } while(u8g2.nextPage());
}

void loop() {
    showSPI = !showSPI;
    
    if(showSPI) {
        scanSPI();
    } else {
        scanI2C();
    }
    
    delay(3000); // Переключаем режим каждые 3 секунды
}

                    

Совет: Не паникуйте, если сначала увидите только странные символы на экране. Возможно, вы просто случайно написали новый диалект китайского!

работающий дебаггер

Основные функции

  • ✓ Поиск всех устройств на шине
  • ✓ Отображение найденных адресов

Важно: Если ваш дебаггер показывает, что все работает правильно, а система все равно не работает - не расстраивайтесь. Возможно, это просто пятница, 13-е!

Тестирование

тестирование с реальными устройствами
Для тестирования используем:
  • 1. I2C датчик температуры
  • 2. SPI флеш-память
  • 3. Любое устройство, которое отказывается работать именно тогда, когда оно срочно нужно

Выводы

Наш мини-дебаггер готов! Теперь вы можете:

  • ✓ Находить непослушные I2C устройства
  • ✓ Подглядывать за SPI транзакциями
  • ✓ Впечатлять коллег своим профессионализмом
  • ✓ Делать вид, что понимаете, что происходит на шине

Последний факт: Знаете, почему опытные разработчики любят отлаживать I2C/SPI системы? Потому что это единственный законный способ подглядывать за чужим общением! 😉

© 2024 Мій Проект. Автор: Jazzzman. Использование материалов разрешено только со ссылкой на источник.

Рекомендуемые товары