Задумка такова - есть мастер SPI и много слейвов. Количество слейвов заранее неизвестно, максимальное - 32. Слейвы подключаются через плату расширения, на одной плате - 8 слейвов. Платы расширения могут включаться каскадом друг в друга.
Вход платы расширения: MOSI, MISO, SCK, SEL
Выход платы расширения: MOSI_OUT, MISO, SCK, SEL
Вход MOSI второй платы расширения подключается на выход MOSI_OUT первой платы раширения.
SCK, MISO – напрямую на слейвы, MOSI – через коммутатор 74HC157. При активном SEL (0) коммутатор пропускает на выход MOSI с выхода переполнения сдвигового регистра 74HC595 (пин 9), при неактивном (1) – пропускает MOSI как есть.
Выходы SELx отключенны пока активируется нужный SELx (благодаря инвертору U2).
Сценарий работы.Активируем SELx нужного слейва - подаем на SEL 0 и выводим в SPI 32-х битное число с 0-м битом в нужной позиции..
Отпускаем SEL (подаем 1), на одном из SELx оказывается активный (0) уровень. Если адрес больше 7 – он уйдет на следующую плату расширения через MOSI_QH / MOSI_OUT.
Передаем данные выбранному слейву, на текущей плате уйдет на MOSI, на следующих – на MOSI_OUT.