Если ведомое устройство ожидает пакет от удаленного ведущего, то данные побитно вдвигаются через вывод SDA и после приема всех восьми битов полученный байт пересылается в регистр SSPBUF. Если ошибки переполнения не было, то модуль MSSP автоматически формирует подтверждение (АСК) во время 9-го тактовою импульса. Эта ошибка возникает в том случае, если ранее принятый байт не был в свое время считан из регистра SSPBUF.
После обнаружения состояния СТАРТ все ведомые устройства на шине принимают первый пакет от ведущего и сравнивают его содержимое со значением, записанным в регистре адреса SSPADD. При совпадении старших семи битов (0-й бит — бит направления передачи) соответствующее устройство формирует подтверждение (АСК) и готовится к обмену данными с ведущим. При этом устанавливаются оба флага — BF и SSPIF, сигнализирующие о событии на шине. Как мы уже видели на Рис. 12.15, 8-й бит первого пакета адреса указывает ведомому устройству, принимать или передавать данные до появления на шине следующего состояния СТАРТ или СТОП.
Как и в SPI-режиме, для конфигурирования модуля MSSP нам необходимо записать определенные значения в регистры управления и состояния. Формат регистров, приведенный на Рис. 12.19, соответствует четырем возможным режимам работы модуля SSP в качестве ведомого устройства I2С. В этом режиме используются те же регистры SSPSTAT и SSPCON. К сожалению, названия некоторых битов, используемых в этом режиме, например СКЕ, остаются прежними, хотя их назначение кардинальным образом меняется. По сравнению с более старыми модулями SSP модуль MSSP имеет второй регистр управления SSPCON2. За исключением 0-го и 7-го битов, этот регистр используется исключительно при работе модуля в качестве ведущего I2С.
Рис. 12.19.
∙ SSPEN
Установка бита SSPCON[5] разрешает работу синхронного последовательного порта. После любого сброса модуль MSSP отключен, а выводы RC3 и RC4 могут использоваться в качестве линий порта С.
∙ SSPM[3:0]
К нашему обсуждению относятся четыре комбинации этих битов выбора режима работы модуля SSP. Для простоты мы будем считать, что используется режим 7-битной адресации. При использовании 10-битной адресации сначала необходимо загружать в регистр SSPADD старший байт адреса b’1110А9А8’, а после его совпадения с принятым значением заменять на младший байт адреса Ь’А7А6А5А4А3А2А1’. Режимы Ь’0110’ и Ь’1110’ отличаются только тем, что в последнем при обнаружении состояний СТАРТ и СТОП устанавливается флаг прерывания SSP1F.
∙ BF, SSPIF
Установленный флаг BF свидетельствует о том, что с данными в регистре SSPBUF что-то произошло. Флаг SSPIF является флагом прерывания от модуля MSSP и устанавливается при любом событии на шине I2С.
Ведомый-приемник
При приеме кадра от ведущего и записи его содержимого в регистр SSPBUF устанавливается флаг BF, показывая тем самым, что новые данные доступны для обработки, а во время 9-го тактового импульса передается подтверждение (АСК). Также при этом устанавливается флаг SSPIF (PIR[3]), который может использоваться для генерации прерывания. При считывании полученного байта из буфера бит BF автоматически сбрасывается (этот флаг доступен только для чтения), однако флаг SSPIF необходимо сбрасывать вручную, как и остальные флаги прерываний.
В случае приема нового байта до считывания предыдущего значения, т. е. при установленном бите BF, он не пересылается в буфер SSPBUF. Вместо этого устанавливается флаг SSPOV, извещающий о возникновении переполнения. В этом случае подтверждение не посылается (NACK).
Ведомый-передатчик
В течение всего времени пересылки байта ведущему флаг BF остается установленным, показывая, что идет передача. Если в этот момент попытаться записать в регистр SSBUF новый байт, то вместо его пересылки в сдвиговый регистр SSPSR будет установлен флаг WCOL, извещающий о возникновении конфликта записи.
∙ SSPOV
При работе в режиме ведомый-приемник попытка считывания регистра SSPBUF до приема нового байта индицируется установкой данного флага. При этом ведущему передается NACK. Ведомый может намеренно передавать NACK, чтобы информировать ведущего о том, что тот может повторить попытку передачи позже. Это состояние сбрасывается при считывании регистра SSPBUF (при этом сбрасывается флаг BF) и ручном сбросе флага SSPOV.
∙ WCOL
Этот флаг устанавливается при попытке записи в регистр SSPBUF во время передачи, извещая о возникновении конфликта записи. Данный флаг должен быть сброшен вручную.
∙ S,P
Эти флаги индицируют обнаружение на шине состояний СТАРТ и СТОП соответственно. Обычно они имеют противоположные значения. Исключением из данного правила является их состояние после любого сброса микроконтроллера или при разрешении модуля (SSPEN — > 1) — в эти моменты оба флага сброшены.