include "p16f877a.inc"
SETUP movlw b’00110110’; Включаем MSSP, такт, линия свободна
movwf SSPCON; Режим ведомого с 7-битной адресацией (0110)
bsf STATUS,RP0; переключаемся в 1-й банк
bsf SSPSTAT,SMP; Скорость нарастания соответствует частоте 100 кГц
bsf SSPCON2,SEN; SEN = 1 для автоматического удержания линии тактового сигнала после приема данных
movlw h’0C’; Адрес h’06’ сдвигаем влево на один бит,
movwf SSPADD; чтобы значение соответствовало содержимому пакета
bsf PIE1,SSPIE; Разрешаем прерывание от модуля SSP
bsf INTCON,PEIE; Разрешаем прерывания от периферийных устройств
bsf INTCON,GIE; Разрешаем прерывания
bcf STATUS,RP0; Возвращаемся в 0-й банк
В этом фрагменте:
1. В регистры управления и состояния модуля MSSP заносятся значения, соответствующие заданию.
2. Адрес ведомого (число h’06’, сдвинутое влево для соответствия семи старшим битам пакета адреса) заносится в регистр SSPAD.
3. Установкой бита маски SSPIE совместно с битами PEIE и GIE разрешается прерывание от модуля MSSP (см. Рис. 7.5 на стр. 223).
Теперь, когда у нас есть код для инициализации модуля MSSP и системы прерываний, можно приступать к написанию процедуры обработки прерывания, распознающей различные события, происходящие на шине I2С. Любое допустимое событие приведет к передаче управления из
Вот эти события:
1. Ведущий-передатчик: принятый пакет был пакетом адреса
S = 1 Последним состоянием на шине было состояние СТАРТ.
R/W¯ = 0 Ожидается передача данных от ведущего.
D/А¯ = 0 Это пакет адреса.
BF = 1 Буфер полон.
Для сброса флага BF необходимо прочитать регистр SSPBUF, даже если пакет адреса, присланный ведущим, будет проигнорирован. Если этого не сделать, следующий байт, посланный ведущим, вызовет переполнение буфера (SSPOV —> 1) и модуль отошлет NACK.
Если бит SEN установлен в 1, то бит СКР будет автоматически сброшен и на линию SCL будет выставлен НИЗКИЙ уровень. Когда это станет возможным, необходимо будет установить бит СКР в 1 для разрешения работы ведущего.
2. Ведущий-передатчик: принятый пакет был пакетом данных
После передачи адресного пакета ведущий посылает один или более пакетов данных. Чтобы избежать возникновения переполнения и гарантировать отсылку подтверждения АСК, ведомое устройство должно считывать каждый из этих пакетов. Также при установленном бите SEN необходимо манипулировать битом СКР, как и при обработке предыдущего события. Содержимое регистра STATUS для этого события отличается от предыдущего только значением бита D/A¯.
S = 1 Последним состоянием на шине было состояние СТАРТ.
R/W¯ = 0 Ожидается передача данных от ведущего.
D/A¯ = 1 Это пакет данных.
BF = 1 Буфер полон.
3. Ведущий-приемник: принятый пакет был пакетом адреса
Обмен на шине начинается с посылки ведущим пакета адреса с установленным битом R/W¯, извещающим ведомого, что от него ожидается передача пакетов данных ведущему. После распознавания ведомым своего адреса или адреса общего вызова при установленном бите GCEN, состояния битов регистра SSPSTAT будут следующими:
S = 1 Последним состоянием на шине было состояние СТАРТ.
R/W¯ = 1 Ожидается передача данных к ведущему.
D/А¯ = 0 Это пакет адреса.
BF = 0 Буфер свободен для передачи.
Заметьте, что в данной ситуации бит BF сброшен. Дело в том, что при работе модуля в режиме ведущего-приемника флаг BF используется для того, чтобы сообщать программе о готовности регистра SSPBUF к загрузке байта данных, посылаемого ведущему. Поэтому, в отличие от 1-го события, нам нет необходимости считывать содержимое регистра SSPBUF.
После распознавания адреса ведомый может послать первый байт данных ведущему, загружая его в регистр SSPBUF и устанавливая бит СКР для высвобождения вывода SCL. Расширение тактового сигнала производится автоматически при получении пакета от ведущего-приемника, независимо от состояния бита SEN.
4. ведущий-приемник: принятый пакет был пакетом данных