Когда модуль MSSP работает в качестве ведомого, тактовый сигнал на него поступает от внешнего устройства. Как и прежде, любые данные, предварительно загруженные в регистр SSPBUF, будут в начале каждой фазы тактового сигнала выставляться на вывод SDO. При этом биты СКЕ и СКР все равно необходимо устанавливать в зависимости от того, по какому фронту тактового сигнала удаленный передатчик выставляет свои данные и какой фронт для удаленного приемника является активным. Установки указанных битов зависят также от того, когда ведущий выставляет первый бит своих данных Dn — до первого тактового импульса или после. В любом случае модуль MSSP, сконфигурированный как ведомый, должен считывать значения этих битов со своего вывода SDI в конце каждой фазы, т. е. бит SMP должен быть сброшен в 0. Чтобы посмотреть подробные временные диаграммы, советую вам обратиться к фирменной документации на используемый микроконтроллер.
Когда микроконтроллер PIC работает в качестве ведомого SPI-устройства, то для его выбора удаленным ведущим используется вывод выбора ведомого
∙ BF, SSPIF
После считывания микроконтроллером полного фрейма из восьми битов и пересылки его в буферный регистр SSPBUF бит BF устанавливается в 1, извещая о приеме нового байта. При этом также устанавливается флаг прерывания SSPIF в регистре PIR1 (см. Рис. 7.6 на стр. 224), и, если установлен соответствующий бит маски прерывания SSPIE в регистре PIE1, генерируется прерывание. Если модуль MSSP работает в качестве ведомого, а микроконтроллер находится в «спящем» режиме, то данное прерывание можно использовать для «пробуждения» микроконтроллера. Это возможно благодаря тому, что тактовые импульсы на выводе SCK формируются внешним ведущим устройством, и поэтому микроконтроллеру не обязательно находиться в активном режиме, т. е. системный генератор может быть выключен.
При считывании нового байта из регистра SSPBUF бит BF автоматически сбрасывается. Если же новое значение своевременно не считать, то принятый байт будет потерян и, сигнализируя об этом, будет установлен флаг SSPOV. Флаг прерывания SSPIF необходимо сбрасывать самостоятельно в процедуре обработки прерывания.
Вооружившись информацией, приведенной на Рис. 12.8 и Рис. 12.9, мы теперь легко можем перечислить операции, которые необходимо выполнить для осуществления передачи байта и/или приема нового байта:
1. Сконфигурировать модуль SSP;
• Сделать SCK, RC5/SDO выходами, a RC4/SDI и, при необходимости, RA5/
• Выбрать режим работы модуля (ведущий/ведомый) и источник тактового сигнала.
• Задать активные фронты с помощью битов СКР, СКЕ и SMP.
• Разрешить работу модуля SSP установкой бита SSPEN.
2. Загрузить байт в регистр SSPBUF для инициирования передачи.
3. Если бит WCOL = 1, то сбросить его и перейти к п. 2.
4. Ждать установки бита BF.
5. Скопировать полученный байт данных из SSPBUF, при этом бит BF будет сброшен автоматически.
Для иллюстрации описанного процесса рассмотрим подпрограмму SPI_IN_OUT, которая объединяет в себе функции SPI_READ и SPI_WRITE, т. е. передает содержимое регистра DATA_OUT и возвращает полученный байт в регистре DATA_IN. Предполагается, что сдвиговые регистры удаленного устройства «защелкиваются» по нарастающему фронту, т. е. используется режим SPI 0,0.
Реализация этой подпрограммы зависит от установок модуля MSSP, заданных во время инициализации основной программы. В следующем фрагменте кода мы переводим модуль MSSP в режим ведущего и задаем тактовую частоту шины SPI равной fOSC/4:
include "p16f877.inc’
MAIN bsf STATUS,RP0; Переключаемся в 1-й банк
movlw b’11010111’; RC5/SD0 и RC3/SCK — выходы
movwf TRISC; RC4/SDI — вход
movwf b’11000000’; Устанавливаем биты SMP и СКЕ
movwf SSPSTAT;
... ...
bcf STATUS,RP0; Возвращаемся в 0-й банк
movlw b’00100000’; Включаем SSP, пассивный уровень — НИЗКИЙ
movwf SSPCON; Режим ведущего SPI, Fosc/4