Код, приведенный в Программе 12.6, в точности соответствует вышеприведенному списку операций. Байт данных, который необходимо передать, копируется из указанного регистра в регистр SSPBUF, после чего проверяется бит состояния WCOL, чтобы удостовериться, что новое значение действительно было загружено в буфер. Если в этот момент осуществлялась передача предыдущего байта, то новый байт не будет загружен в регистр SSPBUF, а бит WCOL будет установлен в 1. Если обращение к модулю SSP осуществляется только из указанной подпрограммы, то возникновение такой ситуации маловероятно, и в большинстве случаев эта проверка может быть исключена. Тем не менее наличие такой проверки увеличивает надежность системы.
;************************
; * ФУНКЦИЯ: Передает и одновременно принимает один байт *
; * ФУНКЦИЯ: данных по шине SPI с использованием модуля SSP *
; * ВХОД: Передаваемый байт — в DATA_OUT *
; * ВЫХОД: Принятый байт — в DATA_IN *
;************************
SPI_IN_OUT
movf DATA_OUT,w; Берем байт для передачи
movwf SSPBUF; Загружаем его в SSPBUF
SSP_IN_OUT_LOOP
btfss SSPCON,WCOL; Он загрузился?
goto SPI_IN_OUT_CON7; ЕСЛИ да, TO продолжим
bcf SSPCON,WCOL; ИНАЧЕ сбросим WCOL и
goto SSP_IN_OUT_LOOP; попытаемся снова
SPI_IN_OUT_CONT
bsf STATUS,RPO; Переключаемся в 1-й банк
btfss SSPSTAT,BF ; Проверяем состояние буфера
goto SPl_IN_OUT_CONT; ЕСЛИ не полон, проверяем снова
bcf STATUS,RPO; Возвращаемся в 0-й банк
movf SSPBUF,w; ИНАЧЕ считываем принятый байт
movwf DATA_IN; и помещаем его в требуемый POН
return
После загрузки передаваемого байта в буфер сразу же начинается процесс передачи, изображенный на Рис. 12.11. По окончании передачи устанавливается флаг BF, и принятый байт может быть скопирован из регистра SSPBUF в требуемый РОН. Флаг BF при этом сбросится автоматически.
Рис. 12.11.
Помимо небольшого уменьшения размера кода, преимуществом использования аппаратного модуля является увеличение скорости передачи. Одна транзакция приема/передачи состоит из восьми тактов SCK, которые в нашем случае становятся равными восьми машинным циклам. При
На Рис. 12.11 показаны временные диаграммы работы модуля в режиме SPI,который используется в нашей подпрограмме. Поскольку мы сбросили бит СКР и установили бит СКЕ, то в режиме ожидания на линии SCK будет присутствовать НИЗКИЙ уровень. Сразу же после загрузки байта в регистр SSPBUF на вывод SDO выдается старший бит передаваемого байта. Это значение будет занесено в сдвиговый регистр удаленного приемника по нарастающему фронту тактового сигнала в середине фазы.
Поскольку удаленный приемник также тактируется в середине фазы, у него имеется достаточно времени для выдачи очередного бита данных на вход SDI микроконтроллера. Этот бит считывается микроконтроллером в конце каждой фазы.
* * *
Одним из применений последовательной передачи данных является объединение нескольких устройств в одну
Рис. 12.12.