Установленный флаг Р показывает, что шина свободна. Эта информация может потребоваться следящему за состоянием шины устройству, которое намеревается начать работать в качестве ведущего.
∙ D/A¯, R/W¯, UA
Эти флаги относятся к пакету (пакетам), передаваемым по шине после формирования состояния СТАРТ и содержащим информацию об адресе ведомого устройства и направлении передачи последующих пакетов.
Бит D/А¯ показывает, какой именно байт находится в регистре SSPBUF — данные (D) или адрес (А¯).
Бит R/W¯ информирует программу о том, в каком направлении будут передаваться последующие пакеты данных — к ведущему (R/W¯ = 1) или от ведущего (R/W¯= 0). Вообще говоря, значение данного бита соответствует значению 0-го бита (первого) пакета адреса.
Бит UA используется только в режимах с 10-битной адресацией. В этих режимах сначала сравниваются семь старших битов первого байта адреса b’11110A9A80’. Младший бит является битом направления передачи и информирует о том, что следующий пакет адреса будет передаваться ведущим (R/W¯ = 0). После приема 1-го байта адреса флаг UA автоматически устанавливается в 1, извещая программу о том, что в регистр SPPADD можно загружать младший байт адреса. После выполнения записи флаг UA автоматически сбрасывается.
∙ GCEN
Если бит разрешения общего вызова GCEN равен 1, то флаг прерывания SSPIF будет устанавливаться при приеме адреса общего вызова Ь’0000000’ независимо от значения, находящегося в регистре адреса модуля. Прием этого адреса свидетельствует о том, что ведущий собирается приступить к широковещательной рассылке всем ведомым устройствам. В более ранних вариантах модуля SSP данная функция отсутствует.
∙ CKP, SEN
При сброшенном бите СКР ведомое устройство удерживает линию SCL в состоянии НИЗКОГО уровня, запрещая, таким образом, ведущему генерацию тактовых импульсов. После установки бита СКР в 1, ведомый освобождает линию SCL, позволяя ведущему формировать тактовые импульсы для нового пакета. Хотя бит СКР может быть изменен программно в любой момент времени (т. е. вручную), растягивание тактового сигнала может выполняться автоматически.
SEN = 0
При сброшенном бите SEN (состояние по умолчанию), а также в модулях SSP более ранних версий бит СКР сбрасывается автоматически в конце каждого пакета, отсылаемого модулем ведущему. Ведомый должен устанавливать бит СКР каждый раз после загрузки содержимого нового пакета в регистр SSPBUF для высвобождения линии тактового сигнала и разрешения передачи следующего пакета. Растягивание тактового сигнала в таких ситуациях осуществляется всегда, независимо от состояния бита SEN. Точно так же работают модули, в которых этот бит отсутствует.
SEN = 1
В последних версиях модуля MSSP[158] автоматическое растягивание тактового сигнала при установленном бите SEN разрешается как при передаче от ведомого устройства, так и при приеме. Последнее полезно в том случае, если ведущий посылает пакеты быстрее, чем ведомый успевает их обрабатывать.
∙ СКЕ
Этот бит имеется только в модулях MSSP, и при его установке электрические параметры сигналов на линиях SDA и SCL будут соответствовать спецификации шины SMBus.
Работа модуля MSSP в качестве ведомого представляет собой многоэтапный процесс, требующий от программы реакции на всевозможные события, возникающие на шине I2С. Хотя это можно реализовать с помощью простого опроса флага SSPIF регистра PIR1, в наших примерах мы будем использовать прерывания.
Прежде чем перейти к рассмотрению этих событий и знакомству с учебными программами, необходимо разобраться с инициализацией модуля MSSP. Типичный инициализационный код для микроконтроллера PIC16F877A, который должен работать в качестве ведомого с адресом h’06’, при частоте шины 100 кГц выглядит следующим образом: