При необходимости использования 8-разрядного формата передаваемых слов требуется изменить всего 2 строки программы. Оба изменения касаются процедуры rw_spi. Первое – начальное значение счетчика бит необходимо изменить с 16 на 8, второе – строку “rol spi_hi” необходимо отделить в комментарий. Следует отметить, что в этом случае регистр spi_hi не нужен и в дальнейшем этой программой не используется и может быть задействован для других нужд.
Для повышения читабельности в код программы включены макросы. Принято, что линии порта В используются в качестве интерфейса SPI. Если используется другой порт, то в макросе в наименовании служебных регистров необходимо указать используемый порт. Используемые линии для 4 сигналов SPI-порта перечислены в разделе “PORT DEFINITIONS” как значения EQU и могут быть легко изменены.
Макрокоманда функции задержки требует дополнительного разъяснения. Для исключения необходимости применения дополнительных регистров данная процедура определяет второе назначение регистра TEMP, хранящего значение 5-разрядного счетчика, - измерение длительности SCK с высоким и низким уровнями. Последние данные хранятся в старших разрядах. За счет простого увеличения старших трех разрядов и определения переполнения можно задавать временные интервалы, не влияя на младшие 5 разрядов. Обратите внимание, что фактически выполняется операция вычитания вместо сложения. Конечный результат тот же, за исключением того, что флаг переноса C сброшен (чаще всего он установлен), когда значение старших трех бит изменяется из 7 в 0.
Рис. 16. Временная диаграмма установки и удержания данных
Период задержки от обновления MOSI до нарастающего фронта SCK – критичный параметр, т.к. фактически это время установления данных (tSETUP) для подключенного периферийного устройства. В данной процедуре длительность времени установки – 2 цикла при изменении MOSI к низкому уровню и 3 цикла при изменении к высокому уровню. При тактовой частоте 10 МГц это время составляет 200-300 нс. Если требуются более длительные временные интервалы необходимо добавить NOPы непосредственно перед макрокомандой sck_hi.
Коэффициент заполнения импульса SCK
Выход SCK большинство времени цикла генерации сообщения находится в низком состоянии за счет пауз на установление уровней, при которых этот выход имеет низкий уровень. Для связи с периферийным устройством, способного работать на более высокой скорости, длительность верхнего уровня (tHILO) может быть уменьшена в соответствии с требованиями по минимальной длительности высокого уровня SCK.
При установке единичного значения на выполнение процедуры затрачивается приблизительно 22.5 цикла на каждый бит данных, а на генерацию высокого уровня SCK – ровно 4 цикла. При тактовой частоте микроконтроллера 10 МГц этим значениям соответствуют длительность высокого уровня SCK 400 нс и общая скорость связи до 444 кбайт/сек.
Длительность нахождения в низком состоянии определяется требованием периферийного устройства к параметру “Длительность подготовки данных на MISO после падающего фронта SCK“ (задержка на вывод данных подчиненным устройством) (tVALID). Если значение этой задержки установить равное 1, то в процедуре перед защелкиванием данных на MISO будет выполнено три такта задержки. По аналогии тактовой частоте 10 МГц соответствует период 300 нс, который может быть изменен для увеличения длительности задержки.