Прийдется дожидаться не просто полного вывода последнего бита, а еще и плюс длительность 1го такта SCK - прощупано лично: если произвести запись в Data Register не дождавшись этого момента, то будет устанвлен Write COLlision Flag и передача нового байта не начнется. Вот цитата из datasheet на ATmega32:
У других контроллеров, и не только ATmega, ситуация в режиме SPI таже. Также все вышеизложенное действительно и для всех вариантов фазы и полярности.The system is single buffered in the transmit direction and double buffered in the receive direction.
This means that bytes to be transmitted cannot be written to the SPI Data Register before
the entire shift cycle is completed.
Здесь можно разве что поизголяться с двумя каналами SPI, естественно на тех контроллерах где они есть, объединив их выходы MOSI и попеременно: выводим через первый, когда MOSI второго в Z-состоянии, затем выводим через второй, переведя ногу первого в Z-состояние. Но на экране будет все же заметен момент переключния в Z, когда MOSI одного уже перевели в Z, а MOSI другого будет переведен на OUT только следующей командой + до момента реального начала вывода первого бита. Здесь можно поэксперементировать с очередностью действий, например сначала записать байт для вывода, а затем уже переводить ноги в Z / из Z, но все равно на экране этот переход между байтами будет слегка отличаться от переходов между битами.
В ситуации с внешним регистром сдвига тоже не все так гладко: очень сложно (=практически не возможно) произвести в него запись нового байта стробом от МК так, что бы не исказился последний, выводимый на экран, бит предыдущего байта. Получим примерно ту же ситуацию, что и с SPI за исключением 1го дополнительного такта SCK. Но здесь уже можно поискать решение:
Вариант1: МК выдает только "разрешение" на параллельную загрузку в сдвиговый регистр в момент окончания вывода предыдущего байта, а непосредственно самим стробом записи служит сигнал сдвига битов. Грубо говоря объединяем по AND строб сдвига битов и "разрешение" загрузки нового байта и результирующий сигнал подаем на вход "параллельная загрузка" регистра.
Вариант2: на выходе сдвигового регистра ставим еще один "буфер" (регистр / D-триггер), строб записи в который будет слегка задержан по времени относительно строба сдвига бит в сдвиговом регистре. Т.о. запись в последний, выходной, регистр будет производиться только тогда, когда на выходе сдвигового регистра установится заведомо правильное значение и не будет разницы между выводом битов в пределах одного байта и битами двух соседних байтов.





Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
