1-проводной SPI
Традиционный интерфейс SPI для передачи данных требует наличия 4 линий: MOSI, MISO, SCK, SS. Если передача данных осуществляется только в одном направлении, линия MISO не требуется и остаётся 3 используемых линии. При необходимости можно применить трюк, чтобы управлять всеми 3 линиями с помощью всего одного провода.
Подключение сдвигового регистра
Сдвиговый регистр 74HC595 — отличный пример SPI-устройства, где передача ведётся только в одну сторону: мы можем только писать в регистр и не можем из него читать. Для передачи данных в сдвиговый регистр нужно задействовать 3 его пина:
- DS (данные) — линия MOSI в терминах SPI, она определяет значение записываемого бита: 0 или 1;
- SH_CP (такт) — линия SCK, она определяет момент, когда происходит запись очередного бита;
- ST_CP (защёлка) — линия SS, обозначает моменты начала и конца работы с регистром
Основная идея заключается в том, чтобы подключить линию такта к входному сигналу напрямую, а линии данных и защёлки через RC-цепи задержки, в которых медленно разряжающийся конденсатор «сохраняет» значение сигнала в течение некоторого времени после его изменения.
Номиналы в RC-цепях должны быть различны многократно. При таком подключении влиять на нужную линию можно длительностью сигнала. Возможны следующие сценарии:
- короткий импульс, чтобы повлиять только на линию такта;
- средний импульс, чтобы повлиять и на линию такта, и на линию данных;
- длинный импульс, чтобы повлиять и на линию такта, и на линию данных, и на линию защёлки.
Расчёт значений
Запись единицы
Сдвиг одного бита в регистр происходит по восходящему фронту тактового импульса — в нашем случае при переключении из низкого состояния (0 В) в высокое (5 В). То есть, чтобы задвинуть очередной бит в регистр нам нужно сначала подать ноль на линию такта, а затем, через произвольное время снова подать единицу.
Чтобы сдвинуть в регистр единицу, в момент восходящего фронта такта уровень напряжения на линии данных должен быть не ниже 20% от уровня питания. Так устроены микросхемы серии 74HC. 20%-й порог обозначен горизонтальным серым штрихом на графиках. Чтобы добиться сдвига единицы, нужно подобрать длину импульса так, чтобы конденсатор в цепи R1–C1 не успел разрядиться более чем на 80%.
В этом нам поможет постоянная времени RC-цепи. В нашем случае она равна <latex>$\tau_{R1C1}=R1\times C1 = 2,2\times10^{-9}\times3,3\times10^{3}=7,26$</latex> мкс. За это время конденсатор разряжается на 63%.
Для подачи единицы, нужно выбрать длительность тактового импульса, которая меньше или равна полученной постоянной времени.
При этом сигнал защёлки не будет изменён, т.к. на её линии напряжение почти не изменится. Оно будет близко к 5 В, что эквивалентно логической единице, поскольку для цепи R2–C2 постоянная времени равна <latex>$\tau_{R2C2}=R2\times C2 = 2,2\times10^{-9}\times33\times10^{3}=72,6$</latex> мкс, т.е. в 10 раз больше, чем для R1–C1.
Запись нуля
Для сдвига нуля на вход регистра нужно выдать более длинный тактовый импульс. Его длительность можно взять равной <latex>$5\times\tau_{R1C1}$</latex>, поскольку за это время конденсатор C1 разрядится на 99%.
Однако, длительность импульса нужно брать такой, чтобы она не превысила <latex>$\tau_{R2C2}$</latex> и защёлка не сработала.
Окончание записи
Наконец, чтобы подать сигнал защёлки, нужно выдать самый длинный импульс. Это нужно, чтобы конденсатор C2 успел полностью разрядиться. Его длительность может быть равна <latex>$5\times\tau_{R2C2}$</latex>.
Когда C2 начнёт заряжаться снова и напряжение на линии защёлки станет больше 20% от напряжения питания, сформируется передний фронт и защёлка сработает. Тем самым переданные данные сохранятся в регистре.