shiftIn()
shiftIn() считывает один байт побитово с цифрового вывода, тактируя каждый бит вручную — порядок битов задаётся параметром bitOrder (MSBFIRST или LSBFIRST).
Полная статья
Описание
shiftIn() принимает ровно 8 бит данных с вывода данных, тактируя каждый бит вручную через отдельный тактовый вывод. Порядок чтения задаётся параметром bitOrder: можно начинать со старшего бита (MSBFIRST) или с младшего (LSBFIRST). Алгоритм работы прост — для каждого из восьми бит функция поднимает тактовый вывод в высокий уровень, считывает текущее состояние линии данных, затем возвращает тактовый вывод в низкий уровень.
Это чисто программная реализация последовательного протокола. Она удобна, когда нужно подключить сдвиговый регистр или другой чип с последовательным интерфейсом к любым цифровым выводам платы. Если скорость критична, обратите внимание на аппаратный SPI: библиотека SPI работает значительно быстрее, но требует использования строго определённых выводов платы.
Важно: shiftIn() тактирует данные по нарастающему фронту. Если подключённое устройство ожидает именно такой фронт, перед первым вызовом функции убедитесь, что тактовый вывод находится в низком уровне — иначе первый импульс окажется некорректным. Сделать это можно вызовом digitalWrite(clockPin, LOW) сразу после настройки выводов.
Синтаксис
byte incoming = shiftIn(dataPin, clockPin, bitOrder)
Параметры
dataPin— цифровой вывод, с которого считываются данные. Тип:int.clockPin— цифровой вывод тактового сигнала. Тип:int.bitOrder— порядок битов при чтении:- MSBFIRST — первым читается старший (левый) бит;
- LSBFIRST — первым читается младший (правый) бит.
Правильный выбор bitOrder критически важен: если он не совпадает с тем, что ожидает ваше устройство, принятый байт окажется «зеркальным» — биты будут переставлены в обратном порядке.
Возвращает
Значение типа byte — целое число от 0 до 255, собранное из 8 последовательно считанных бит.
Пример кода
#define DATA_PIN 4 // Пин подключён к выходу последовательных данных
#define CLOCK_PIN 5 // Пин подключён к входу тактового сигнала (CLK)
void setup() {
pinMode(DATA_PIN, INPUT);
pinMode(CLOCK_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
// Считываем 8 бит с линии данных с помощью shiftIn()
byte dataByte = shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST);
// Выводим байт в двоичном формате
Serial.print("Received Byte: ");
Serial.println(dataByte, BIN);
delay(1000); // Пауза перед следующим считыванием
}
Практические замечания
- Инициализация тактового вывода. Перед первым вызовом
shiftIn()всегда явно устанавливайте низкий уровень на тактовом выводе черезdigitalWrite(clockPin, LOW). Без этого шага начальное состояние вывода непредсказуемо, и первый принятый бит может оказаться ошибочным. - Скорость работы. Программная реализация заметно медленнее аппаратного SPI. Если вы опрашиваете устройство в быстром цикле или работаете с несколькими микросхемами, рассмотрите переход на библиотеку SPI.
- Совместное использование с
shiftOut(). В типичной схеме со сдвиговым регистромshiftIn()работает в паре сshiftOut()— одна функция отправляет данные, другая принимает. Оба вывода данных при этом могут быть разными, а тактовый вывод — общим. - Отладка. Если принятые значения выглядят неправильно, проверьте в первую очередь
bitOrderи начальный уровень тактового вывода — это две наиболее частые причины ошибок при работе сshiftIn().