МИКРОСХЕМА ИНТЕГРАЛЬНАЯ К1921ВК01Т. Руководство пользователя (от 10.09.2019) - часть 10

 

  Главная      Книги - Разные     МИКРОСХЕМА ИНТЕГРАЛЬНАЯ К1921ВК01Т. Руководство пользователя (от 10.09.2019)

 

поиск по сайту            правообладателям  

 

   

 

   

 

содержание      ..     8      9      10      11     ..

 

 

 

МИКРОСХЕМА ИНТЕГРАЛЬНАЯ К1921ВК01Т. Руководство пользователя (от 10.09.2019) - часть 10

 

 

 

 

145 

Передача информации по шине состоит из последовательности различных действий 

(начало  передачи,  прием  данных  и  др.).  Каждое  действие  называется  состоянием 
(состояние  старта,  состояние  останова  и  др.).  После  того,  как  то  или  иное  состояние 
сформировано,  его  код  аппаратно  записывается  в  регистр  ST  в  битовое  поле  MODE  и 
может  быть  прочитано  программно.  В  таблицах  17.2  и  17.3  приводятся  все  возможные 
состояния, их мнемонические обозначения и коды. На квитирование или неквитирование 
приема  указывает  запись  «ACK»  или  «NACK»,  соответственно.  Так,  например,  если 
мастер  отправил  байт  адреса  ведомому,  который  после  получения  квитировал  прием,  то 
на  это  будет  указывать  «ACK»,  а  в  поле  MODE  регистра  ST  будет  записан  код  04h, 
соответствующий  состоянию  с  мнемоническим  обозначением  «MTADPA».  Более 
подробно каждый режим работы модуля I2C будет рассмотрен далее. На рисунках 17.16 – 
17.23,  поясняющих  работу  модуля  в  том  или  ином  режиме,  приняты  обозначения, 
расшифровка  которых  приводится  в  таблице  17.1.  Для  получения  дополнительной 
информации и понимания работы модуля I2C можно воспользоваться приложением В. 

 

Т а б л и ц а   1 7 . 2  – Коды функционирования модуля I2C в режиме FS 

Режим 

Код  Мнемоника 

Описание состояния на момент записи 

кода в поле MODE регистра ST 

ACK/ 

NACK 

Общий 

00h 

IDLE 

IDLE, нет доступной валидной 
информации о статусе 

– 

Мастер 

 в  

режиме  

FS 

– 

01h  STDONE  Сформировано состояние старта 

– 

02h  RSDONE 

Сформировано состояние повторного 
старта 

– 

03h  IDLARL 

Потеря арбитража, переход в режим 
безадресного ведомого  

– 

Передача  

04h  MTADPA  Отправлен адрес ведомого 

ACK 

05h  MTADNA  Отправлен адрес ведомого 

NACK 

06h  MTDAPA  Отправлен байт данных 

ACK 

07h  MTDANA  Отправлен байт данных 

NACK 

Прием 

08h  MRADPA  Отправлен адрес ведомого  

ACK 

09h  MRADNA  Отправлен адрес ведомого 

NACK 

0Ah  MRDAPA  Принят байт данных 

ACK 

0Bh  MRDANA  Принят байт данных 

NACK 

– 

0Сh  MTMCER  Отправлен код мастера, обнаружена ошибка 

ACK 

– 

0Dh – 0Fh 

Зарезервировано. Не использовать! 

– 

Ведомый 

 в  

режиме  

FS 

Прием 

10h  SRADPA  Принят адрес 

ACK 

11h  SRAAPA  Принят адрес после потери арбитража 

ACK 

12h  SRDAPA  Принят байт данных 

ACK 

13h  SRDANA  Принят байт данных 

NACK 

Передача 

14h  STADPA  Принят адрес 

ACK 

15h  STAAPA  Принят адрес после потери арбитража 

ACK 

16h  STDAPA  Отправлен байт данных 

ACK 

17h  STDANA  Отправлен байт данных 

NACK 

Передача 

адреса 

отклика  

18h  SATADP  Принят адрес отклика на предупреждение 

ACK 

19h  SATAAP 

Принят адрес отклика на 
предупреждение после потери арбитража 

ACK 

1Ah  SATDAP 

Отправлены данные в ответ на получение 
адреса отклика  

ACK 

1Bh  SATDAN 

Отправлены данные в ответ на получение 
адреса отклика 

NACK 

 

 

 

146 

Окончание таблицы 17.2 

Режим 

Код  Мнемоника 

Описание состояния на момент записи 

кода в поле MODE регистра ST 

ACK/ 

NACK 

Ведомый 

 в  

режиме  

FS 

– 

1Сh 

SSTOP 

Обнаружено состояние останова 
ведомого 

– 

1Dh  SGADPA  Принят адрес общего вызова 

ACK 

1Eh  SDAAPA 

Принят адрес общего вызова после 
потери арбитража 

ACK 

Общий 

1Fh  BERROR 

Обнаружена ошибка на шине 
(некорректное состояние старта или 
останова) 

– 

П р и м е ч а н и е  – Диапазон значений кодов 0Dh–0Fh зарезервирован и не доступен 

для использования. Дополнительная информация находится в приложении В. 

 
Т а б л и ц а   1 7 . 3  – Коды функционирования модуля I2C в режиме HS 

Режим 

Код  Мнемоника 

Описание состояния на момент записи 

кода в поле MODE регистра ST 

ACK/ 

NACK 

Мастер 

в 

режиме 

HS 

– 

21h  HMTMCOK 

Код мастера передан успешно,  
переход в режим HS 

– 

22h 

HRSDONE 

Сформировано состояние повторного 
старта 

– 

23h 

HIDLARL 

Потеря арбитража, переход в режим HS 
безадресного ведомого 

– 

Передача 

24h  HMTADPA  Отправлен адрес ведомого 

ACK 

25h  HMTADNA  Отправлен адрес ведомого 

NACK 

26h  HMTDAPA  Отправлен байт данных 

ACK 

27h  HMTDANA  Отправлен байт данных 

NACK 

Прием 

28h  HMRADPA  Отправлен адрес ведомого 

ACK 

29h

 

  HMRADNA  Отправлен адрес ведомого 

NACK 

2Ah  HMRDAPA  Принят байт данных 

ACK 

2Bh  HMRDANA  Принят байт данных 

NACK 

Ведомый 

в  

режиме 

HS 

Прием 

30h  HSRADPA  Принят адрес 

ACK 

32h  HSRDAPA  Принят байт данных 

ACK 

33h  HSRDANA  Принят байт данных 

NACK 

Передача 

34h  HSTADPA  Принят адрес 

ACK 

36h  HSTDAPA  Отправлен байт данных 

ACK 

37h  HSTDANA  Отправлен байт данных 

NACK 

П р и м е ч а н и е  – Диапазоны значений кодов 2Ch–2Fh и 38h–3Fh, а также коды 20h,  

31h, 35h зарезервированы и не доступны для использования. Дополнительная информация 
находится в приложении В. 

 

Режим безадресного ведомого 

Режим работы по умолчанию (MODE = 00h). После включения модуль I2C начинает 

функционировать  в  режиме  безадресного  ведомого  и  непрерывно  мониторит  шину.  При 
обнаружении  состояния  старта  или  повторного  старта  переходит  в  режим  ведомого 
приемника. Для перехода в режим мастера передатчика нужно сформировать корректное 
состояние старта. 

Переключение в режим безадресного ведомого происходит в случаях: 
-  стартовое  состояние  не  было  успешно  сформировано,  так  как  другое  устройство 

удерживало на линии SCL низкий уровень сигнала; 

 

 

147 

-  произошла  потеря  арбитража  во  время  передачи  байта  данных  в  режиме  мастера 

передатчика или во время передачи бита R/W# в режиме мастера приемника; 

- произошла потеря арбитража во время ответа на полученный адрес отклика; 
- неквитирование принятого адреса в режиме ведомого приемника (адрес не совпал 

со «своим» или запрещен); 

- неквитирование в конце переданного байта в режиме ведомого передатчика; 
- обнаружено состояние останова; 
- обнаружена ошибка на шине; 
- модуль I2C был сброшен; 
- модуль I2C был выключен. 

 
Режим FS мастера передатчика 

Включение режима: 
1 Переход в режим мастера передатчика происходит после успешного формирования 

состояния  старта.  Первый  байт,  передаваемый  мастером  сразу  после  старта,  состоит  из 
адреса ведомого и бита направления. 

2  В  зависимости  от  состояния  бита  направления  (R/W#),  модуль  I2C  далее 

функционирует как мастер передатчик (если R/W# = «0») или как мастер приемник (если 
R/W# = «1»). Для перехода в режим HS мастер может передать код мастера (0000_1xxxb) 
вместо первого байта адреса. 

3  Переход  в  режим  мастера  произойдет  после  установки  бита  START  в  регистре 

CTL0.  Если  бит  BB  в  регистре  CST  сброшен,  т. е.  шина  свободна,  будет  сгенерировано 
состояние старта. Если бит BB = 1b, то бит START останется установленным, а состояние 
старта  будет  сгенерировано  по  истечении  времени,  равного  одному  такту  сигнала 
тактирования на линии SCL, после освобождения шины. 

4  Как  только  стартовое  состояние  будет  сгенерировано  успешно,  бит  START 

сбросится,  модуль  I2C  перейдет  в  состояние  STDONE  (в  поле  MODE  запишется 
значение 01h), установится флаг INT, и линия SCL будет удерживаться в «0» до тех пор, 
пока  флаг  INT  не  будет  сброшен.  Если  разрешено  битом  INTEN  (регистр  CTL0), 
сгенерируется прерывание. 

Передача адреса и данных: 
1  Пока  удерживается  флаг  INT,  программа  записывает  адрес  ведомого  и  бит 

направления передачи в регистр  данных  SDA (адрес записывается в биты  с седьмого по 
первый). 

2 После записи в регистр SDA флаг INT сбрасывается программно установкой бита 

CLRST в регистре CTL0.  

3  После  сброса  флага  INT  и  по  истечении  времени,  требуемого  для  установки 

данных, на линии SCL появляется тактовый сигнал и данные, хранящиеся в регистре SDA, 
начинают передаваться по линии SDA. 

4  После  завершения  передачи  байта  и  получения  ответа  на  запрос  подтверждения 

передачи  (ACK),  т. е.  после  девятого  такта  сигнала  тактирования  на  линии  SCL, 
аппаратная  часть  анализирует  квитирование/неквитирование  передачи  и  устанавливает 
соответствующий код в поле MODE. 

5 Во время передачи линии SCL и SDA постоянно мониторятся с целью выявления 

возможных  конфликтов  с  другими  устройствами,  подключенными  к  шине.  В  случае 
обнаружения  конфликта  передача  прерывается,  и  в  поле  MODE  записывается  код  11b 
(состояние SRAAPA – переход в режим ведомого приемника после потери арбитража) или 
код  03h  (состояние  IDLARL  –  переход  в  режим  безадресного  ведомого  после  потери 
арбитража). 

6  Если  бит  направления  равен  единице  и  не  обнаружено  ошибок  на  шине,  модуль 

I2C переходит в режим мастера приемника.   

 

 

148 

7 Если бит направления равен нулю и передача адреса ведомого завершена успешно 

(значение кода в поле  MODE не равно 05h/1Fh),  устанавливается флаг  INT,  указывая на 
то, что ожидается запись первого байта данных в регистр SDA для дальнейшей передачи, 
и,  если  разрешено,  генерируется  прерывание.  Пока  флаг  INT  будет  оставаться 
установленным, линия SCL будет удерживаться в «0».  

8 Байт данных записывается программно в регистр SDA и передача продолжается.  
9  Если  ведомый  приемник  не  квитирует  отправленный  ему  байт  данных,  в  поле 

MODE  записывается  код  0Bh  (состояние  MRDANA).  На  линии  SCL  будет  установлен 
низкий уровень сигнала и, если разрешено, сгенерировано прерывание. 

Для  отслеживания  ошибок  в  пакетах  данных  применяется  механизм  вычисления 

контрольной  суммы  (CRC)  для  нескольких байт  данных.  В  режиме  мастера  передатчика 
установка бита PECNEXT в регистре CST вызовет перенос содержимого регистра ошибок 
(не  доступен  программно)  в  регистр  SDA  и  инициирует  передачу  байта  CRC  (байт 
контрольной суммы) ведомому. Передача байта CRC должна выполняться после передачи 
последнего  байта  данных  и  перед  формированием  состояния  останова  или  повторного 
старта. 

Мастер  передатчика  контролирует  шину  и  может  адресовать  любое  ведомое 

устройство и изменять направление передачи без потери контроля над шиной, используя 
возможность  формирования  состояния  повторного  старта.  Для  формирования  состояния 
следует: 

1 Установить бит START. 
2 В режиме мастера приемника прочитать последний полученный байт из регистра 

SDA. 

3 Сбросить флаг прерывания INT. 
После  этих  действий  будет  освобождена  линия  SCL,  сгенерировано  состояние 

повторного  старта  и  сгенерировано  прерывание.  В  поле  MODE  будет  записан  код  02h 
(состояние RSDONE). 

Модуль  I2C  может  быть  выведен  из  режима  мастера  передатчика  генерированием 

состояния останова. Для этого необходимо: 

1 Установить бит STOP в регистре CTL0. 
2 В режиме мастера приемника прочитать последний полученный байт из регистра 

SDA. 

3 Сбросить флаг INT.  
Вышеуказанные действия приведут к незамедлительному формированию состояния 

останова и очистке бита STOP. 

Состояние  останова  может  быть  сформировано  только,  если  модуль  I2C 

функционирует  как  мастер  и  контролирует  шину  (в  поле  MODE  находится  любое 
значение кода из диапазона 01h – 0Bh). 

Дополнительно можно обратиться к приложению В.  
На рисунке 17.16 представлено графическое пояснение к описанию режима. 

 

 

 

149 

 

 

Рисунок  17.16 – Режим FS мастера передатчика 

 

 

 

 

Рисунок  17.17 – Режим HS мастера передатчика 

 

 

 

150 

Режим HS мастера передатчика 

Переход  в  режим  HS  мастера  передатчика  происходит  в  том  случае,  если  после 

состояния старта мастер передает код мастера (0000_1хххb) вместо  адреса  ведомого. По 
окончании  передачи  кода  мастера  устанавливается  флаг  INT  и,  если  разрешено, 
генерируется  прерывание.  Вслед  за  успешной  передачей  кода  мастера  в  поле  MODE 
записывается код 21h (состояние HMTMCOK), и мастер переходит в режим HS. 

Далее  необходимо  сформировать  состояние  повторного  старта,  записав  единицу  в 

бит START и сбросить флаг INT, записью единицей в бит CLRST.  

После сгенерированного состояния повторного старта устанавливается флаг INT и в 

поле MODE записывается код 22h (состояние HRSDONE). Дальнейший порядок действий 
по передаче адреса и данных аналогичен описанному режиму FS мастера передатчика.

  

Дополнительно можно обратиться к приложению В.  
На рисунке 17.17 представлено графическое пояснение к описанию режима. 
 

Режим FS мастера приемника 

Переход  в  режим  мастера  приемника  происходит  после  успешной  передачи  адреса 

ведомого  с  единичным  битом  направления  (R/W#  =  «1»).  В  режиме  мастера  приемника 
модуль I2C получает данные от ведомого устройства, поэтому теряет контроль над шиной 
SDA.  В  тоже  время  мастер  продолжает  тактировать  передачу  и  должен  отвечать  на  бит 
ACK каждого принятого байта.  

После  каждого  принятого  байта  устанавливается  флаг  INT,  и  пользовательская 

программа читает полученные данные из регистра SDA. Линия SCL удерживается в «0», 
пока установлен флаг INT. После сброса флага INT может стартовать прием следующего 
байта. После этого (согласно протоколу SMBus) состояния повторного старта или стопа не 
должны  генерироваться  мастером,  поскольку  мастер  теперь  не  является  единственным 
контролером  линии  SDA.  В  конце  приема  каждого  байта  мастер  не  квитирует  прием, 
сообщая, таким образом, ведомому об успешном приеме. 

После приема предпоследнего байта перед сбросом флага INT следует записать ноль 

в  бит  ACK  регистра  CTL0.  В  тоже  время,  если  требуется  отправка  байта  CRC,  следует 
установить  бит  PECNEXT  в  регистре  CST.  После  сброса  флага  INT  будет  принят 
последний  байт  данных  и  не  квитирован.  По  окончании  приема  мастер  возвращается  в 
режим  передатчика  и  теперь  может  сгенерировать  состояние  повторного  старта  или 
останова. 

Если  механизм  отслеживания  ошибок  включен,  то  последний  переданный  от 

ведомого  байт  будет  байтом  CRC.  В  случае  если  результат  вычисления  контрольной 
суммы не нулевой, то установится флаг ошибки PECFAULT в регистре CST.  

Дополнительно можно обратиться к приложению В.  
На рисунке 17.18 представлено графическое пояснение к описанию режима. 
 

Режим HS мастера приемника 

Переход в режим  HS мастера приемника происходит, если после переданного кода 

мастера и последовавшего за ним состоянием повторного старта, производится передача 
адреса  ведомого  с  битом  направления  R/W#  =  «1».  Модуль  I2C  переходит  в  режим  HS 
мастера  приемника,  устанавливается  флаг  INT,  а  в  поле  MODE  записывается 
соответствующий код из диапазона 28h – 2Bh. 

Дополнительно можно обратиться к приложению В.  
На рисунке 17.19 представлено графическое пояснение к описанию режима. 
 

 

 

151 

 

 

Рисунок  17.18 – Режим FS мастера приемника 

 

 

 

Рисунок  17.19 – Режим HS мастера приемника 

 
 

 

 

152 

Режим FS ведомого приемника 

В  этом  режиме  данные  принимаются  от  мастера  передатчика.  Ведомый  квитирует 

или не квитирует прием каждого байта. 

После включения модуль I2C мониторит шину. При обнаружении состояния старта, 

модуль I2C переключается в режим ведомого приемника и начинает принимать семь бит 
адреса и бит направления передачи от мастера. Мастер передатчика может переключиться 
в режим ведомого приемника вследствие потери арбитража при передаче адреса. 

После получения байта адреса ведомый сравнивает полученный адрес: 
- полем ADDR регистра ADDR, если установлен бит SAEN; 
- со значением 0000_000b (адрес общего вызова), если установлен бит GCMEN; 
- со значением 0001_100b (адрес отклика), если установлен бит SMBARE. 
 
Квитирование  приема производится,  если  принятый  адрес  совпал  с  «собственным» 

(запрограммированным  пользователем),  адресом  общего  вызова  или  адресом  отклика. 
После  обнаружения  совпадения  адреса  и  квитирования  в  поле  MODE  записывается 
соответствующий код и устанавливается флаг INT. Также, если разрешено битом INTEN, 
генерируется  прерывание.  Принятый  байт  (адрес  и  бит  направления)  переписывается  в 
регистр SDA. 

В  зависимости  от  состояния  бита  направления,  модуль  I2C  переходит  в  режим 

ведомого  передатчика  (если  R/W#  =  «1»)  или  остается  в  режиме  ведомого  приемника 
(R/W# = «0»). 

После каждого принятого байта устанавливается флаг INT, указывающий на то, что 

необходимо прочитать данные из регистра SDA, а линия SCL удерживается в «0». После 
программного  чтения  регистра  SDA  флаг  INT  сбрасывается  (записью  единицы  в  бит 
CLRST), и линия SCL освобождается.  

Установка  битов  SAEN  и  S10EN  включает  режим  10-битной  адресации  ведомого 

приемника.  После  обнаружения  состояния  старта  ведомый  последовательно  принимает 
два байта, в которых содержится адрес. 

Последовательность  передачи  бит  в  посылке  при  10-битной  адресации  была 

рассмотрена ранее в подразделе 17.1 настоящего ТО. 

Механизм  распознавания  адреса  изложен  в  подразделе  17.2  настоящего  ТО  и 

показан на рисунке 17.13. 

После  корректного  приема  ведомым  двух  байтов  и  совпадении  принятого  адреса  с 

собственным  байты  сохраняются  в  регистре  SDA  и  сдвиговом  регистре,  прием 
квитируется,  устанавливается  флаг  INT,  а  в  поле  MODE  записывается  соответствующий 
код состояния – 10h или 17h.  

Если включен механизм обнаружения ошибок, последний байт, принятый от мастера 

передатчика,  будет  байтом  CRC.  Если  результат  вычисления  контрольной  суммы  не 
нулевой,  устанавливается  флаг  ошибки  PECFAULT  и  передача  не  квитируется. 
Программа  пользователя  должна  «знать»  о  количестве  передаваемых  мастером  байт  и 
устанавливать  бит  PECNEXT  перед  чтением  предпоследнего  байта  из  регистра  SDA  и 
потом сбрасывать флаг INT. В результате будет аппаратно рассчитана контрольная сумма, 
и  результат  отправлен  мастеру  в  момент  передачи  бита  ACK.  Если  ошибок  нет,  будет 
выполнено  квитирование  (отправлен  «0»  в  ответ  на  запрос  ACK),  если  ошибки  есть  – 
неквитирование (отправлена «1» в ответ на запрос ACK). 

Если  ведомому  приемнику  нужно  сообщить  мастеру,  что  он  не  может  более 

принимать данные, следует сначала установить бит ACK, а затем – бит CLRST (для сброса 
флага  INT).  Далее  будет  принят  последний  байт  данных,  который  не  будет  квитирован 
(бит  ACK = 1b)  и  установится  флаг  INT.  После  этого  программа  может  прочитать 
последний полученный байт из регистра SDA и сбросить флаг INT, после чего модуль I2C 
освободит шину.  

Дополнительно можно обратиться к приложению В.  

 

 

153 

На рисунке 17.20 представлено графическое пояснение к описанию режима. 

 

 

Рисунок  17.20 – Режим FS ведомого приемника 

 

 

 

Рисунок17.21 – Режим HS ведомого приемника 

 

Режим HS ведомого приемника   

Включение  режима  происходит  после  получения  валидного  кода  мастера 

(0000_1хххb). После передачи кода мастера формируется  состояние повторного старта, а 
затем  передается  адрес  ведомого  с  нулевым  битом  направления  (R/W#  =  «0»).  После 
получения  байта  адреса  ведомый  проверяет  его  на  совпадение  (см.  ранее  «Режим  FS 
ведомого приемника»). 

Дополнительно можно обратиться к приложению В.  
На рисунке 17.21 представлено графическое пояснение к описанию режима. 

 
Режим FS ведомого передатчика  

В этом режиме данные передаются от  ведомого передатчика к мастеру приемнику. 

Ведомый проверяет ответ мастера на бит ACK. 

Переход  в  режим  передатчика  происходит  из  режима  ведомого  приемника.  После 

получения  собственного  адреса  и  бита  направления,  равного  единице  (R/W#  =  «1»), 
ведомый  становится  передатчиком.  Флаг  INT  устанавливается,  указывая  на  то,  что  в 
регистр SDA следует записать данные.  

 

 

154 

Пока установлен флаг INT, линия SCL удерживается в «0». После записи данных в 

регистр  SDA  следует  сбросить  флаг  INT.  После  этого,  по  истечении  времени, 
необходимого для установки данных на линии SDA, линия SCL освобождается, и данные 
начинают передаваться. 

Передача  данных  аналогична  передаче  в  режиме  мастера  передатчика.  После 

каждого успешного приема байта устанавливается флаг INT, а в поле MODE записывается 
соответствующий  код.  Линия  SCL  удерживается  в  состоянии  «0»  до  тех  пор,  пока  флаг 
INT остается установленным. Флаг INT должен сбрасываться только после записи данных 
в  регистр  SDA.  Каждый  последующий  байт  должен  записываться  в  регистр  SDA  до  тех 
пор, пока в поле MODE не появится код 17h (состояние STDANA), указывающий на то, 
что мастер «не желает» далее принимать данные.  

Вывод  ведомого  из  режима  передатчика  осуществляется  только  мастером 

приемника.  Мастер  приемника  должен  не  квитировать  последний  (согласно 
запланированному  количеству)  полученный  байт  данных.  При  обнаружении 
неквитирования  переданных  данных,  модуль  I2C  переходит  в  режим  безадресного 
ведомого  и  в  поле  MODE  записывается  код  00h  (состояние  IDLE).  Далее  ведомый 
мониторит шину в ожидании состояния старта или повторного старта. 

Для  работы  в  режиме  с  10-битной  адресацией  следует  осуществить  действия, 

аналогичные описанным для режима FS ведомого приемника. 

Сначала модуль I2C переходит в режим ведомого приемника и получает 10-битный 

адрес. Если программно не требуется никаких действий, то флаг INT не устанавливается, 
линия SCL не удерживается в «0» и поле MODE содержит соответствующую информацию 
о состоянии. Далее (см. ранее «Формат передачи данных с 10-битной адресацией»), вслед 
за  вторым  байтом  адреса  может  последовать  состояние  повторного  старта  и  затем 
повторная  передача  первого  байта  адреса  с  той  лишь  разницей,  что  бит  направления 
содержит единицу (R/W# = «1»). Таким образом, после приема трех байт, если принятый 
10-битный  адрес  окажется  «своим»,  установится  флаг  INT  и  ведомый  переключится  в 
режим передатчика. В поле MODE запишется один из двух кодов – 14h или 15h. 

Если  включен  механизм  распознавания  ошибок,  то  последний  отправленный 

ведомым  передатчиком  байт  будет  байтом  CRC.  Программа  должна  «знать»  количество 
байт,  посылаемых  в  пакете  данных,  и  после  отправки  всех  байт  устанавливать  бит 
PECNEXT  (вместо  записи  очередных  данных  в  регистр  SDA)  для  того,  чтобы  в  регистр 
SDA записался байт контрольной суммы.  

В  модуле  I2C  поддерживается  функция  распознавания  адреса  отклика,  который 

передается  мастером  шины  ко  всем  ведомым.  Ведомое  устройство,  получившее  адрес 
отклика  (0001_100b),  переключается  в  режим  передатчика  и  начинает  передавать  свой 
собственный адрес (подробнее – см. подраздел 17.1 «Формат передачи данных с 7-битной 
адресацией»).  

Для  включения  функции  распознавания  адреса  отклика  следует  установить  бит 

SMBARE в регистре CTL0. 

Модуль  I2C  реагирует  на  адрес  отклика  только  при  работе  в  режиме  ведомого.  В 

ответ  на  получение  адреса  отклика  начать  передачу  адресов  могут  несколько  ведомых. 
Ведомый, выигравший арбитраж, продолжает передачу, остальные – освобождают шину. 

Дополнительно можно обратиться к приложению В.  
На рисунке 17.22 представлено графическое пояснение к описанию режима. 
 

 

 

155 

 

 

Рисунок 17.22 – Режим FS ведомого передатчика 

 

Режим HS ведомого передатчика 

Модуль  I2C  переходит  в  режим  HS  ведомого  после  получения  валидного  кода 

мастера  (0000_1xxxb).  Далее  следует  состояние  повторного  старта  и  передача  адреса 
ведомого  с  единичным  битом  направления  (R/W# = «1»).  После  этого  ведомый 
переключается  в  режим  HS  ведомого  передатчика.  Функционирование  в  этом  режиме  в 
целом  идентично  режиму  FS  ведомого  передатчика,  с  теми  отличиями,  что 
поддерживается  более  высокая  скорость  передачи,  а  значения  кодов  состояний  (поле 
MODE) находятся в диапазоне 34h – 37h.    

Дополнительно можно обратиться к приложению В.  
На рисунке 17.23 представлено графическое пояснение к описанию режима. 
 

 

 

Рисунок 17.23 – Режим HS ведомого передатчика 

 

Дополнительная информация о работе модуля 

1 Когда модуль I2C выключен, бит BB регистра CST очищен. Включения модуля в 

системе с более чем одним мастером, может произойти в момент времени, когда по шине 
идет передача. Бит BB не сможет это показать. Во избежание создания ошибок на шине 
модуль  I2C  должен  синхронизироваться  с  сигналами  на  шине  прежде,  чем  сделать 
попытку стать мастером. Для этого следует  дождаться момента, когда на шине не будет 

 

 

156 

выявлена  активность,  т. е.  периодически  проверять  бит  BB  через  периоды  времени, 
равные периоду ожидания на шине. 

2  Бит  BB  позволяет  мониторить  шину  и  не  допускать  формирования  ошибочных 

состояний старта в процессе передачи между другими устройствами на шине. 

3 В некоторых случаях шина может  «зависать» при активных (с нулевым  уровнем) 

сигналах  на  линиях  SDA  и/или  SCL.  Источниками  таких  состояний  могут  быть 
необнаруженные  ошибочные  стартовые  или  стоповые  состояния,  сформировавшиеся  в 
течение  приема  ведомых  данных.  Если  считать,  что  причиной  зависания  явился  модуль 
I2C, то возможны следующие два варианта развития событий: 

а)  если  зависла  линия  SCL,  ничего  не  будет  происходить,  а  мастер,  захвативший 

шину, должен освободить ее; 

б) если зависла линия SDA, мастер должен освободить шину. Следует помнить, что 

в  нормальном  состоянии  удерживать  линию  SCL  может  только  текущий  мастер  шины. 
Последовательность  действий  для  выхода  из зависания  следующая  (при  условии,  что  на 
шине только один мастер): 

-  выключить  и  включить  модуль  I2C  для  перевода  его  в  режим  безадресного 

ведомого; 

- установить бит START для создания состояния старта; 
-  проверить,  удерживается  ли  линия  SDA  в  «0»  (активное  состояние)  чтением  бита 

TSDA  регистра  CST.  Если  линия  активна,  отправить  одиночный  импульс  по  линии  SCL, 
установив бит TGSCL в регистре CST; 

-  проверить,  что  в  поле  MODE  записан  код  01b  (состояние  STDONE),  который 

укажет на то, что состояние старта сформировано. Если нет, то повторять предыдущий и 
этот шаги до тех пор, пока линия SDA не освободится. 

 
 

 

 

157 

18

 

Контроллер интерфейса CAN 

18.1

 

Протокол CAN 

Последовательный  интерфейс  CAN  (Controller  Area  Network) –  интерфейс  связи, 

эффективно поддерживающий распределенное управление в масштабе реального времени 
с высокой помехозащищенностью. Протокол связи определен в спецификации CAN 2.0B. 

Протокол  CAN  оптимизирован  для  систем,  в  которых  должно  передаваться 

относительно  небольшое  количество  информации  (по  сравнению  с  Ethernet  или  USB)  к 
любому  или  всем  узлам  сети.  Множественный  доступ  с  опросом  состояния  шины 
позволяет  каждому  узлу  получить  доступ  к  шине  с  учетом  приоритетов.  Неадресная 
структура  сообщений  позволяет  организовать  многоабонентскую  доставку  данных  с 
сокращением  трафика  шины.  Быстрая  устойчивая  передача  информации  с  системой 
контроля  ошибок  позволяет  отключать  неисправные  узлы  от  шины,  что  гарантирует 
доставку критических по времени сообщений. 

Область  применения  протокола  CAN:  от  высокоскоростных  сетей  связи  до 

электропроводов  в  автомобиле.  Высокая  скорость  передачи  данных  (до  1 Мбит/с), 
хорошая помехозащищенность протокола, защита от неисправности узлов – делают шину 
CAN подходящей для индустриальных приложений управления типа Device Net. 

CAN  имеет  асинхронную  последовательную  структуру  шины  с  одним  логическим 

сегментом  сети.  CAN  сеть  может  состоять  из  двух  или  более  узлов  с  возможностью 
подключения/отключения  узлов  от  шины  без  перенастройки  других  устройств  (см. 
рисунок 18.1). 

 

 

 

Рисунок 18.1 – Общая структура CAN сети 

 
Логика  шины  работает  по  механизму  монтажного  И,  в  котором  рецессивный  бит 

соответствует  логической  единице,  а  доминантный  –  логическому  нулю.  Пока  ни  один 
узел  не  формирует  доминантный  бит,  шина  находится  в  рецессивном  состоянии. 
Появление на шине доминантного бита (выставленного одним или несколькими  узлами) 
создает  доминантное  состояние  шины.  Отсюда  следует,  что  при  выборе  среды  передачи 
данных  необходимо  точно  определить,  какое  состояние  будет  доминантным,  а  какое  – 
рецессивным.  Одним  из  наиболее  распространенных  и  дешевых  вариантов  линии  связи 
является  пара  скрученных  проводов.  Линии  шины  тогда  называются  CANH  и  CANL  и 

 

 

158 

могут  быть  подключены  непосредственно  к  устройствам.  Не  существует  никакого 
дополнительного стандарта на среду передачи данных. 

При  использовании  в  качестве  линии  связи  пары  скрученных  проводов  с 

нагрузочными резисторами на концах можно получить максимальную скорость передачи 
данных 1 Мбит/с при длине линии до 40 м. Для линий связи протяженностью более 40 м 
необходимо снизить скорость передачи данных (для линии 1 000 м скорость шины должна 
быть  не  более  40  Кбит/с).  Из-за  дифференциального  характера  линии  связи  шина  CAN 
малочувствительна  к  электромагнитным  помехам.  Экранирование  шины  значительно 
снизит  воздействие  внешнего  электромагнитного  поля,  что  особенно  важно  для 
высокоскоростных режимов работы. 

Двоичная  информация  кодируется.  Доминантным  является  низкий  уровень, 

рецессивным  –  высокий.  Для  гарантированной  синхронизации  данных  всеми  узлами 
шины  используется  принцип  «бит-стаффинга».  Это  означает,  что  при  последовательной 
передаче  пяти  бит  одинаковой  полярности  передатчик  вставляет  один  дополнительный 
бит  противоположной  полярности  перед  передачей  остальных  битов.  Приемник  также 
проверяет полярность и удаляет дополнительные биты. 

В  CAN  протоколе  при  передаче  данных  приемные  узлы  не  адресуются,  а 

указывается  идентификатор  передатчика.  С  помощью  идентификатора  указывается 
содержание  сообщения  (например,  применительно  автомобиля  –  обороты,  температура 
двигателя  и  т. д.)  и  степень  приоритета  сообщения.  Более  высокий  приоритет  у 
идентификатора, имеющего меньшее бинарное значение. 

При  коллективном  доступе  к  шине  используется  неразрушающий  арбитраж  с 

опросом  состояния  шины.  Перед  началом  передачи  данных  узел  проверяет  состояние 
шины (отсутствие активности на шине). При начале передачи сообщения узел становится 
управляющим  шины,  все  остальные  узлы  переходят  в  режим  приема.  После  приема 
сообщения  (подтвержденного  каждым  узлом)  каждый  узел  проверяет  идентификатор  в 
сообщении  и  сохраняет  сообщение,  если  это требуется.  В  противном  случае,  сообщение 
сбрасывается.  Если  два  или  более  узлов  начинают  передачу  данных  одновременно, 
поразрядный  арбитраж  позволяет  избежать  конфликта  на  шине.  Каждый  узел  выдает  на 
шину  свой  идентификатор  (старший  бит  формируется  первым)  и  контролирует  ее 
состояние.  Если  узел  посылает  «1»,  а  читает  «0»,  значит,  арбитраж  потерян,  и  узел 
переключается  в  режим  приема.  Это  происходит  тогда,  когда  идентификатор 
конкурирующего узла имеет меньшее бинарное значение. Таким образом, узел с высоким 
приоритетом  выигрывает  арбитраж  без  необходимости  повторять  сообщение.  Все 
остальные узлы будут пытаться передать сообщение после освобождения шины. Данный 
механизм не позволяет  передавать сообщения одновременно  разными  узлами. Для этого 
программно  должно  быть  обеспечено,  чтобы  узлы,  передающие  данные,  не  имели 
одинаковых  идентификаторов.  Оригинальная  спецификация  в  версии  CAN  2.0b  (так 
называемая  расширенная  версия  CAN)  определяет  возможность  идентификатора  иметь 
длину 11 или 29 бит.  

Протокол CAN предусматривает следующие типы сообщений: 
- сообщение данных (стандартное и расширенное);  
- удаленный запрос данных; 
- сообщение об ошибке; 
- сообщение о перезагрузке. 
 
 
 
 
 
 

 

 

 

159 

Стандартное сообщение данных 

Формируется,  когда  узел  желает  передать  данные.  Формат  сообщения  показан  на 

рисунке 18.2. 

 

 

 

Рисунок 18.2 – Стандартное сообщение данных 

 
Стандартное сообщение имеет в своем составе: 
-  бит  SOF  –  доминантный  («0»)  бит  начала  сообщения  для  жесткой синхронизации 

всех узлов; 

- поле арбитража (12 бит), включающее поле ID идентификатора (11 бит) и бит RTR 

передачи  по  удаленному  запросу  (RTR  =  «0»  соответствует  сообщению  данных, 
RTR = «1» соответствует удаленному запросу); 

- поле  управления  (6 бит),  включающее  бит  IDE  –  указатель  расширенного 

идентификатора  (IDE  =  «0»  соответствует  стандартному  идентификатору,  IDE  =  «1» 
соответствует расширенному идентификатору), бит RB0 – резервный доминантный бит и 
поле  DLC  –  числа  байт  данных  (4  бита),  которое  указывает,  сколько  байт  данных 
содержится  в  сообщении  (допустимые  значения – от  0  до  8,  другие  значения 
использоваться не могут); 

- поле данных (от 0 до 64 бит), содержащее целое число байт данных; 
- поле  контрольной  суммы  CRC  (16 бит),  включающее  поле  CRC  (15 бит), 

используемое  для  обнаружения  возможных  ошибок  передачи  данных  и  бит  CRCDel 
рецессивный разделитель CRC; 

- поле подтверждения (2 бита), включающее бит АСК Slot подтверждения передачи 

(передающий узел выдает рецессивный бит, а любой узел, который принял сообщение без 
ошибок, заменяет его сформированным доминантным битом) и бит ACKDel рецессивный 
разделитель подтверждения; 

- поле EOF конца сообщения (7 бит). 
 
Между передачами двух любых сообщений шина должна оставаться в рецессивном 

состоянии  как  минимум  в  течение  времени  появления  3  бит  (поле  INT  простоя).  Если 
после  появления  трех  рецессивных  битов  (поле  INT)  ни  один  узел  не  начал  передачу, 
шина переходит в состояние бездействия IDLE и находится в рецессивном состоянии до 
появления доминантного бита сообщения. 

 

 

 

160 

Расширенное сообщение данных 

Формируется,  когда  узел  желает  передать  данные.  Формат  сообщения  показан  на 

рисунке 18.3. 

 

 

 

Рисунок 18.3 – Расширенное сообщение данных 

 
Расширенное сообщение имеет в своем составе: 
-  бит  SOF  –  доминантный  («0»)  бит  начала  сообщения  для  жесткой синхронизации 

всех узлов; 

- поле арбитража (38 бит), включающее поле стандартного идентификатора (11 бит), 

бит  SRR  заменитель  удаленного  запроса,  бит  IDE  указатель  расширенного 
идентификатора (рецессивный, что соответствует расширенному идентификатору) и поле 
расширенного идентификатора (18 бит);  

-  бит  RTR  передачи  по  удаленному  запросу  (RTR  =  «0»  соответствует  сообщению 

данных, RTR = «1» соответствует удаленному запросу); 

- поле управления (6 бит), включающее бит RB0 – резервный доминантный бит, бит 

RB1    резервный  доминантный  бит  и  поле  DLC  числа  байт  данных  (4  бита),  которое 
указывает, сколько байт данных содержится в сообщении (допустимые значения –  
от 0 до 8, другие значения использоваться не могут); 

- поле данных (от 0 до 64 бит), содержащее целое число байт данных; 
- поле  контрольной  суммы  CRC  (16 бит),  включающее  поле  CRC  (15 бит) 

используемое  для  обнаружения  возможных  ошибок  передачи  данных  и  бит  CRCDel 
рецессивный разделитель CRC; 

- поле подтверждения (2 бита), включающее бит АСК Slot подтверждения передачи 

(передающий узел выдает рецессивный бит, а любой узел, который принял сообщение без 
ошибок, заменяет его сформированным доминантным битом) и бит ACKDel рецессивный 
разделитель подтверждения; 

- поле EOF конца сообщения (7 бит). 
 

Удаленный запрос данных 

Формируется, когда узлу требуются данные другого узла. Узел назначения посылает 

удаленный  запрос  с  идентификатором  источника.  Соответствующий  узел  источника 
(распознавший свой идентификатор) посылает стандартное или расширенное сообщение в 
ответ на запрос.  

Удаленный запрос данных существует в стандартном и расширенном вариантах (на 

рисунке 18.4 представлен вариант удаленного запроса со стандартным идентификатором). 

 

 

 

 

 

 

 

содержание      ..     8      9      10      11     ..