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

 

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

 

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

 

   

 

   

 

содержание      ..      1      2      3      ..

 

 

 

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

 

 

Режим сброса по переполнению
Рисунок 13.6 - Временная диаграмма сброса по сигналу переполнения
Максимальное значение счетчика позиции задается регистром QPOSMAX. Если
счетчик считает вверх и достигнуто максимальное значение, то со следующим тактом
синхросигнала счетчик обнулится. Если счетчик считает вниз и достигнуто значение нуля,
то со следующим тактом синхросигнала в счетчик будет загружено значение QPOSMAX.
Сброс по событию индексации не производится.
Получение значений маркера индексации происходит аналогично тому, как это
происходит в режиме сброса по сигналу индексации. Полученные значения могут
использоваться при инициализации по маркеру индексации, если в поле IEL записано
значение 11b в регистре QEPCTL. Временная диаграмма сброса показана на рисунке 13.6.
Режим сброса по первому сигналу индексации
Если было получено событие индексации при счете вверх, то счетчик обнулится со
следующим тактом синхросигнала. Если же событие индексации было зафиксировано при
счете вниз, то со следующим тактом синхросигнала в счетчик будет загружено значение
QPOSMAX. При последующем счете сброс может произойти только при достижении нуля
или значения QPOSMAX (т. е. аналогично режиму сброса по переполнению), а
дальнейшие возможные события получения сигнала на выводе индексации влиять на
сброс не будут.
Получение значений маркера индексации происходит аналогично тому, как это
67
происходит в режиме сброса по сигналу индексации. Полученные значения могут
использоваться при инициализации по маркеру индексации, если в поле IEL записано
значение 11b.
Режим сброса по таймеру временных отсчетов
В этом режиме счетчик сбрасывается в ноль или загружается значением QPOSMAX,
в зависимости от текущего режима счета (задается полем QSRC регистра QDECCTL), по
событию срабатывания таймера временных отсчетов. В остальном режим аналогичен
режиму сброса по переполнению.
Также возможно настроить сохранение значения счетчика QPOSCNT в регистр
QPOSLAT перед сбросом, для этого необходимо включить модуль захвата, установив бит
CEN в регистре QCAPCTL. Этот режим удобен для измерения частоты.
Сохранение счетчика позиции
Внешние входы индексации и стробирования можно запрограммировать на
формирование событий для сохранения значения счетчика позиции в регистры QPOSILAT
и QPOSSLAT.
Сохранение по событию индексации
В некоторых задачах не требуется сбрасывать счетчик позиции по каждому сигналу
индексации, и вместо этого может потребоваться увеличить разрядность счетчика до
32 бит (режимы, задаваемые значениями PCRM равными 01b и 10b). В этом случае бит
QDLF (направление вращения) в регистре QEPSTS будет перезаписываться по каждому
сигналу индексации, а счетчик будет сохранять значение по следующим событиям
индексации:
- по переднему фронту сигнала индексации (IEL = 01b);
- по заднему фронту сигнала индексации (при IEL = 10b);
- по маркеру индексации (при IEL = 11b).
Сохранение значения счетчика по маркеру индексации будет производиться только в
присутствии сигнала индекса и по событию, эквивалентному сохраненному при первой
индексации по маркеру. Если направление вращения изменится, то сохраненное в маркере
значение типа фронта меняется на обратное. Это сделано с целью привязки индекса к
квадратурному сигналу QA/QB, а также для более точной обработки индексации, чтобы
исключить влияние ширины импульса на выводе индексации.
При сохранении значения счетчика в регистр QPOSILAT формируется флаг IEL
прерывания индексации в регистре QFLG. В режиме сброса по сигналу индексации
(PCRM = 00h) значение поля IEL в регистре QEPCTL игнорируется.
Сохранение по событию стробирования
Значение счетчика сохраняется в регистр QPOSSLAT по каждому переднему фронту
сигнала на входе QEP_S, если сброшен бит SEL в регистре QEPCTL. Если же бит SEL
установлен, то сохранение в QPOSSLAT происходит по переднему фронту сигнала строба
на входе QEP_S при прямом направлении вращения и по заднему фронту для обратного
вращения. При каждом сохранении счетчика в QPOSSLAT устанавливается флаг
прерывания SEL.
Инициализация счетчика позиции
Счетчик событий может быть проинициализирован программно или по событиям:
- событие индексации;
- событие стробирования.
68
Входной сигнал индексации (QEPI) может использоваться для инициализации
счетчика по переднему и заднему фронту. Если поле IEI = 10b, то счетчик загружается
значением QPOSINIT по переднему фронту сигнала индексации. Аналогично, если
IEI = 11b, то счетчик загружается значением QPOSINIT по заднему фронту сигнала
индексации.
Если поле SEI = 10b, то счетчик загружается значением QPOSINIT по переднему
фронту сигнала стробирования на входе QEP_S. Если SEI = 11b, то счетчик загружается
значением QPOSINIT по переднему фронту сигнала стробирования, если идет счет вверх,
и по заднему - если вниз.
Программно счетчик инициализируется при записи единицы в бит SWI регистра
QEPCTL. Бит не сбрасывается автоматически, но повторная запись единицы также
приведет к инициализации счетчика.
Компаратор счетчика позиции
Рисунок 13.7 - Функциональная схема компаратора счетчика позиции
Компаратор (см. рисунок 13.7) сравнивает значение счетчика позиции с регистром
QPOSCMP и при совпадении значений формирует прерывание, а также внешний
синхросигнал, который может быть направлен на один из выводов: индексный вывод
QEP_I или вывод стробирования QEP_S. Бит SPSEL в регистре QDECCTL определяет, на
какой именно вывод будет направлен сигнал синхронизации, а бит SOEN в регистре
QDECCTL разрешает этому выводу работать как выход.
Регистр QPOSCMP может использовать режим отложенной загрузки, когда
отложенное значение берется из теневого регистра, а если режим отложенной загрузки
выключен, то запись в QPOSCMP производится сразу в активный регистр.
Отложенная загрузка происходит по следующим событиям:
- по совпадению результатов сравнения;
- по обнулению счетчика QPOSCNT.
Флаг успешного сравнения PCM устанавливается, когда выполняется условие
QPOSCNT = QPOSCMP, при этом также формируется синхроимпульс требуемой
длительности для извещения внешнего устройства (сигнал PCSOUT). Настраиваемая
длительность синхроимпульса контролируется специальной схемой задержки.
Флаг PCR готовности компаратора к отложенной загрузке значения сравнения
выставляется, когда выполняется условие для отложенной записи, заданное битом
PCLOAD в регистре QPOSCTL. При этом генерация соответсвующего прерывания и
установка флага PCR будет осуществляться лишь при включения режима
отложенной загрузки PCSHDW (регистр QPOSCTL).
69
13.4 Таймер временных отсчетов
Таймер, используемый для оповещения программного обеспечения о необходимости
начать измерение скорости, представляет собой 32-разрядный таймер, работающий на
частоте системного тактового сигнала. Включается установкой бита UTE в регистре
QEPCTL. Когда значение таймера достигает порога (QUTMR = QUPRD), формируется
прерывание и выставляется флаг UTO. Данный блок таймера может быть использован для
вычисления скорости на высоких скоростях (см. рисунок 13.8), а также для сохранения
счетчика позиции, регистра таймера и регистра периода в регистрах QPOSLAT,
QCTMRLAT и QCPRDLAT, соответственно. Режим сохранения определяется состоянием
бита QCLM в регистре QEPCTL.
Рисунок 13.8 - Функциональная схема таймера временных отсчетов
13.5 Модуль захвата времени
Функциональная схема модуля захвата времени представлена на рисунке 13.9.
Таймер использует тактовый сигнал и сигнал квадратурных событий с коэффициентами
деления, программируемыми полями CCPS и UPPS в регистре QCAPCTL. Коэффициенты
деления можно менять в процессе работы, но в этом случае может произойти событие
захвата, содержащее неверные данные, которые следует игнорировать. Во избежание
подобной ситуации перед изменением значений коэффициентов деления следует
выключить модуль захвата (сбросить бит CEN) и снять все маски прерываний. После
изменения коэффициентов проинициализировать таймер QCTMR (записать нулевое
значение), сбросить все статусы, вновь разрешить прерывания и включить модуль захвата.
Также, существует возможность включить улучшенный режим теневой загрузки
UPPS/CCPS. Если установить бит EPSLD в регистре QCAPCTL, то изменение UPPS/CCPS
в процессе работы будет происходить следующим образом:
- при записи, значение UPPS/CCPS занесется в теневой регистр
- по ближайшему, после записи, событию QCLK: новое значение делителя примет
силу, сбросится QCTMR, сбросится счетчик предделителя UPPS, сбросится UPEVNT.
Таким образом, в этом режиме - следующее событие (установка UPEVNT и захват
QCTMR в QCPRD), которое будет следовать после изменения UPPS/CCPS, будет уже
корректным. Без необходимости осуществлять пропуски данных или дополнительных
программных манипуляций.
70
Рисунок 13.9 - Функциональная схема модуля захвата времени
Если бит SELEVNT в регистре QCAPCTL сброшен, то по деленному квадратурному
событию значение таймера QCTMR загружается в регистр периода QCPRD, после чего
таймер сбрасывается и устанавливается флаг UPEVNT в регистре QEPSTS, означающий
обновление регистра QCPRD. Флаг сбрасывается программно записью единицы.
При установленном бите SELEVNT обновление регистра периода происходит по
сигналу от выхода компаратора PCSOUT.
Значение таймера можно использовать при измерениях скорости, если:
- его значение не превысило FFFFFFFFh;
- направление вращения за время измерения не изменилось.
Если между двумя событиями UPEVNT (т. е. во время измерения) таймер QCTMR
переполнился, устанавливается флаг ошибки COEF в регистре QEPSTS. Если между
двумя событиями положения вала изменилось направление вращения, устанавливается
флаг ошибки CDEF.
Значения таймера (QCTMR) и регистра периода (QCPRD) могут быть
сконфигурированы для захвата в регистры QCTMRLAT и QCPRDLAT по событиям:
- прочитан регистр QPOSCNT;
- сработал сторожевой таймер.
Если бит QCLM сброшен, то при каждом чтении регистра счетчика позиции
QPOSCNT регистры QCTMR и QCPRD загружаются в QCTMRLAT и QCPRDLAT,
соответственно.
Если бит QCLM установлен, то при каждом срабатывании таймера временных
отсчетов счетчик позиции, регистр таймера и регистр периода захватываются в регистры
QPOSLAT, QCTMRLAT и QCPRDLAT, соответственно.
Измерения на малых скоростях вращения (низкая частота квадратурного сигнала)
производятся следующим образом - таймер QCTMR, тактирующийся от системного
тактового сигнала с делителем CCPS, по событию UPEVNT, сохраняет свое значение
времени в регистре QCPRD, одновременно сбрасывается, и выставляет флаг UPEVNT в
регистре QEPSTS, чтобы сообщить программе об окончании измерения. Событие
UPEVNT возникает каждые несколько тактов QCLK, в соответствии с
запрограммированным коэффициентом деления UPPS в регистре QCAPCTL. Таким
образом, зная количество квадратурных событий за измеренный отрезок времени, а также
71
такой параметр, как количество квадратурных событий за полный оборот вала, можно
вычислить скорость вращения.
Измерения на высоких скоростях (см. рисунок 13.10) могут производиться иначе.
Таймер временных отсчетов формирует общую длительность измерения, счетчик позиции
подсчитывает количество импульсов QCLK. Зная количество импульсов QCLK за один
полный оборот, можно вычислить скорость вращения вала.
Рисунок 13.10 - Работа на высоких скоростях
Также существует и смешанный способ измерения скорости
- по заданному
значению счетчика позиции, с помощью компаратора счетчика позиции, можно
сформировать событие UPEVNT (необходимо установить бит SELEVNT в регистре
QCAPCTL), которое, так же как и при измерениях на малых скоростях, позволит получить
значение таймера QCTMR. Для использования этого способа измерения скорости
необходимо разрешить прерывание по событию PCSOUT компаратора и устанавливать в
этом прерывании каждый раз порог сравнения компаратора QPOSCMP на заданное
количество меток вперед по сравнению с текущей позицией счетчика QPOSCNT (в
зависимости от направления вращения). Тогда, устанавливая QPOSCMP дальше от
QPOSCNT с увеличением скорости вращения, можно поддерживать оптимальное
захватываемое время, обеспечивающее максимальную точность измерения времени для
всех диапазонов вращения. Этот способ измерения наиболее сложен, но и наиболее
универсален.
Дополнительно, модуль захвата времени способен генерировать запросы DMA.
Чтобы разрешить генерацию необходимо установить бит DMAEN в регистре DMAREQ.
Затем, каждый раз когда флаг UPEVNT (регистра EPSTS) переходит из 0 в 1 будет
генерироваться запрос. Если UPEVNT будет оставаться несброшенным, то запросы
генерироваться не будут. При этом, когда происходит чтение QCPRD при DMAEN=1 флаг
UPEVNT сбрасывается автоматически.
72
13.6 Сторожевой таймер
Блок квадратурного декодера содержит 32-битный сторожевой таймер, который
тактируется системным тактовым сигналом, деленным на 64, и сбрасывается любым
квадратурным событием (перепад на выводе QEP_A/QEP_B). Если ни одного
квадратурного события не было зафиксировано до события QWDTMR = QWDPRD,
сторожевой таймер формирует флаг прерывания WTO в регистре QFLG. Регистр
QWDPRD содержит значение срабатывания сторожевого таймера. Функциональная схема
сторожевого таймера представлена на рисунке 13.11.
Рисунок 13.11 - Функциональная схема сторожевого таймера
13.7 Система прерываний
Блок квадратурного декодера содержит 11 источников прерываний (см. рисунок
13.12). Система прерываний состоит из регистра маски прерываний QEINT, регистра
флагов прерываний QFLG, а также схемы формирования внешнего прерывания QEP_INT
по наличию активных флагов. Прерывание INT также может быть маскировано в
контроллере прерывания NVIC. Сброс флагов прерываний осуществляется через регистр
QCLR. Сброс флага активности прерывания INT осуществляется записью в регистр
INTCLR. Также, прерывание можно сформировать программной записью в регистр QFRC,
но для этого необходимо предварительно включить счетчик позиции, установив бит
QPEN в регистре QEPCTL.
Рисунок 13.12 - Схема системы прерываний
На рисунке 13.13 показана схема формирования прерывания внутри блока обработки
событий для события UTO (срабатывание таймера временных отсчетов). Схемы
формирования прерываний для остальных событий идентичны.
Рисунок 13.13 - Схема формирования прерывания UTOINT
73
14 Блоки ШИМ
Архитектура блоков ШИМ разработана по принципу минимальной нагрузки на
процессор, что достигается автоматизацией формирования выходных импульсов с
настраиваемыми пользователем параметрами. Так, после минимальных настроек, эти
блоки способны работать самостоятельно, формируя выходные сигналы на выводах
PWM_A и PWM_B микроконтроллера.
Микроконтроллер содержит три блока ШИМ, объединенных схемой синхронизации.
Каждый блок ШИМ поддерживает следующую функциональность:
- 16-разрядный таймер;
- два выхода PWM_A и PWM_B, которые могут работать в режиме фронтовой и
центрированной модуляции как полностью независимо, так и комплементарно с
разделением генератором «мертвого времени»;
- выходы PWM_A и PWM_B могут управляться в зависимости от событий цифровых
компараторов блока АЦП, а также от событий блока аналоговых компараторов,
обеспечивая автоматический релейный режим поддержания заданной величины;
- программное управление выходами ШИМ;
- программное задание фазы счетчиков таймера для координации работы нескольких
блоков ШИМ;
- аппаратный контроль фазы при координации работы нескольких блоков ШИМ;
- предотвращение наложения фронтов за счет генератора «мертвого времени» с
независимой схемой задержки переднего и заднего фронтов выходного сигнала;
- сигнал аварии может переводить выходы PWM_A и PWM_B в высокое, низкое или
Z-состояние;
- однократная и циклическая обработка сигналов аварии;
- все события могут инициировать прерывания;
- программируемый предделитель событий позволяет снизить нагрузку на процессор
при обработке прерываний;
- ШИМ-сигнал может модулироваться высокочастотным сигналом при
использовании драйверов ключей с импульсным трансформатором.
Для начала работы с блоками ШИМ необходимо снять с них сброс и разрешить
тактирование - необходимо установить биты PWMEN регистов PCLKCFG и PRSTCFG.
Описание сигналов и выводов блока ШИМ:
- PWM_A и PWM_B - выходы ШИМ;
- PWM_TZ - вход, с которого принимается сигнал аварии (общий для всех блоков
ШИМ, и каждый блок может использовать или не использовать этот сигнал);
- PWM_SYNCI - вход, служащий для приема синхросигнала;
- PWM_SYNCO - внутренний сигнал синхронизации на выходе блока ШИМ,
являющийся синхросигналом для остальных блоков ШИМ;
- PWM_TZINT - прерывание по сигналу аварии;
- PWM_HDINT - прерывание от порогового выключателя;
Функциональная схема блока ШИМ показана на рисунке 14.1.
74
Рисунок 14.1 - Блок ШИМ
14.1 Таймер
Таймер представляет собой двунаправленный счетчик (TBCTR), тактируемый
сигналом TBCLK, который формируется на основе синхросигнала PCLK. Частота сигнала
TBCLK задается произведением коэффициентов двух делителей. Коэффициенты задаются
полями CLKDIV и HPCLKDIV регистра TBCTL. Для работы других блоков ШИМ
счетчик позволяет формировать события такие, как совпадение по периоду CTR = PRD
(TBCTR = TBPRD), совпадение с нулем CTR = Zero (TBCTR = 0000h), совпадение с
регистрами CTR = CMPA и CTR = CMPB (TBCTR = CMPA и TBCTR = CMPB,
соответственно). Событие TBCTR = FFFFh влияет только на флаг CTRMAX регистра
TBSTS.
Всеми настройками работы счетчика таймера управляет регистр TBCTL.
Состояние счетчика отражают флаги регистра TBSTS.
На выходе первого блока ШИМ формируется сигнал SYNCO, который является,
синхросигналом для остальных блоков ШИМ (см. рисунок 14.3а). Сигнал SYNCO имеет
три источника - программно сгенерированный синхроимпульс, посредством записи
75
единицы в бит SWFSYNC, события CTR = Zero и CTR = CMPB. Выбор источника
осуществляется посредством поля SYNCOSEL.
В блоке таймера находятся регистры начальной фазы счета TBPHS и периода
(максимального значения счетчика) TBPRD. Регистр периода имеет теневой регистр для
синхронной загрузки значения, до которого счетчик осуществляет счет. Управление
загрузкой осуществляется битом PRDLD.
Счетчик может работать в трех режимах счета (см. рисунок 14.2):
- вверх (от 0000h до значения TBPRD, затем сброс в 0000h и т. д.);
- вниз (от значения TBPRD до 0000h, затем загрузка значения TBPRD и т. д.);
- вверх-вниз (от 0000h до значения TBPRD, затем от значения TBPRD до 0000h и т. д.).
Параметры счета задаются полем CTRMODE.
Рисунок 14.2 - Режимы работы счетчика при значении периода 0004h (Tpwm);
для режима счета «вверх-вниз» дополнительно указано поведение флага CTRDIR
Теневая загрузка
Регистры TBPRD, CMPA, CMPAHR, CMPB имеют соответствующие теневые
регистры и управляющие биты, регулирующие режим и событие загрузки. Помимо
индивидуальной настройки теневого режима есть бит SHDWGLOB регистра TBCTL. По
умолчанию он установлен, и теневая загрузка работает согласно настройкам. Но
возможны ситуации, когда необходимо обеспечить одновременную загрузку всех теневых
регистров. Тогда перед загрузкой необходимо сбросить SHDWGLOB, в результате
значения будут попадать в теневые регистры, но перезапись в активные будет
блокирована. Когда все необходимые регистры будут записаны, следует установить этот
бит и тогда все активные регистры будут перезаписаны в соответствии с заданными
настройками по соответствующим событиям. Данный бит не оказывает влияния, если для
регистров выбрана прямая загрузка, без участия теневых.
76
Синхронизация таймеров блоков ШИМ
Реализована схема синхронизациии блоков ШИМ, см. рисунок 14.3а.
Рисунок 14.3 - Схема синхронизации модулей ШИМ
Система синхронизации таймеров включает в себя таймеры всех блоков ШИМ.
Каждый блок ШИМ имеет вход синхронизации PWM_SYNCI и выход синхронизации
PWM_SYNCO.
Если бит PHSEN установлен, то в счетчик таймера будет автоматически загружаться
значение регистра TBPHS, при выполнении каждого из условий:
- изменение входного сигнала PWM_SYNCI (в этом случае загрузка значения
TBPHS в регистр TBCTR происходит на следующий такт TBCLK после поступления
импульса на вход PWM_SYNCI с задержкой в два системных такта, если TBCLK = PCLK,
или один такт, если TBCLK ≠ PCLK);
- запись единицы в бит SWFSYNC (программная синхронизация), которая
генерирует импульс синхронизации, аналогичный импульсу с входа PWM_SYNCI.
В режиме счета вверх-вниз необходимо запрограммировать бит PHSDIR, чтобы
задать направление счета таймера после синхронизации.
Если бит PHSEN сброшен, блок ШИМ не будет реагировать на входной сигнал
синхронизации, а только передавать напрямую этот сигнал на выход PWM_SYNCO,
чтобы тактировать другие блоки ШИМ. Следующая особенность схемы: генерация и
распространение сигнала синхронизации от блока ШИМ, - занимает один такт TBCLK.
К примеру, если по событию синхронизации блока 0 в счетчик блока 1 должен быть
записан ноль, то этот ноль запишется только на следующий такт после события
(см. рисунок 14.3б). Таким образом, при синхронизации от другого блока ШИМ нужно
всегда учитывать этот такт, и записывать значение фазы, следующее по порядку, в
соответствии с режимом счета (см. рисунок 14.3в).
77
14.2 Компаратор
Компаратор - это блок, сравнивающий значение счетчика таймера с заданными
значениями порогов срабатывания. Значения хранятся в регистрах CMPA и CMPB.
Значения, записываемые по адресам регистров CMPA и CMPB, предварительно
размещаются в теневых регистрах. Это нужно для синхронной загрузки новых значений.
Управление загрузкой регистров CMPA и CMPB осуществляется битами SHDWAMODE и
SHDWBMODE, а также полями LOADAMODE и LOADBMODE регистра CMPCTL.
Блок компаратора формирует на выходах два события CTR
= CMPA и
CTR = CMPB, возникающие в случае совпадения значения счетчика с регистром CMPA
и/или регистром CMPB, соответственно.
Для каждого компаратора событие может возникать:
- один раз за период, если счетчик считает вверх или вниз;
- один раз за период, если счетчик считает вверх-вниз, но при этом значение в
регистре CMPA/CMPB равно 0000h или значению TBPRD;
- два раза за период, если счетчик считает вверх-вниз и при этом значение в регистре
CMPA/CMPB лежит в диапазоне 0001h - (TBPRD - 1).
На рисунках 14.4 - 14.7 приведены примеры формирования сигналов событий.
78
14.3 Обработчик событий
Обработчик событий - блок, управляющий поведением сигналов на линиях PWMA и
PWMB (см. рисунок 14.1) в зависимости от возникающих событий на входе блока и
направления счета счетчика таймера. На поведение выходных сигналов влияют импульсы
входных сигналов при возникновении событий: CTR = PRD, CTR = Zero, CTR = CMPA,
CTR = CMPB.
Основные действия с сигналами PWMA и PWMB:
- переключение в единицу или ноль;
- инверсия (переключение в противоположное состояние);
- сохранение без изменений.
Поведение сигналов задается независимо друг от друга. Кроме этого, обработчик
событий позволяет программно задавать состояние сигналов PWMA и PWMB и величину
«мертвого времени» ШИМ. Управление работой блока производится посредством
регистров AQCTLA, AQCTLB, AQSFRC, AQCSFRC.
Существует вероятность того, что несколько событий могут произойти
одновременно. Для таких ситуаций обработчик событий использует систему приоритетов
событий.
Таблица 14.1 - Распределение приоритетов событий при счете вверх
Событие
Приоритет
Программное
1 (наивысший)
CTR = TBPRD
2
CTR = CMPB (счет вверх) при счете вверх
3
CTR = CMPA (счет вверх) при счете вверх
4 (низший)
79
Таблица 14.2 - Распределение приоритетов событий при счете вниз
Событие
Приоритет
Программное
1 (наивысший)
CTR = Zero
2
CTR = CMPB (счет вниз) при счете вниз
3
CTR = CMPA (счет вниз) при счете вниз
4 (низший)
Таблица 14.3 - Распределение приоритетов событий при счете вверх-вниз
Событие
Приоритет
Программное
1 (наивысший)
CTR = CMPB (счет вверх) при счете вверх
или
2
CTR = CMPB (счет вниз) при счете вниз
CTR = CMPA (счет вверх) при счете вверх
или
3
CTR = CMPA (счет вниз) при счете вниз
CTR = Zero или CTL = PRD
4
CTR = CMPB (счет вверх) при счете вниз
или
5
CTR = CMPB (счет вниз) при счете вверх
CTR = CMPA (счет вверх) при счете вниз
или
6 (низший)
CTR = CMPA (счет вниз) при счете вверх
В режиме счета вверх:
- если компаратор запрограммирован так, что CMPA/CMPB ≤ TBPRD (счет вверх),
то событие произойдет при CTR = CMPA/CMPB;
- если компаратор запрограммирован так, что CMPA/CMPB > TBPRD (счет вверх),
то событие не произойдет;
- если компаратор запрограммирован на срабатывание при счете вниз, то событие не
произойдет.
В режиме счета вниз:
- если компаратор запрограммирован так, что CMPA/CMPB ≤ TBPRD (счет вниз), то
событие произойдет при CTR = CMPA/CMPB;
- если компаратор запрограммирован так, что CMPA/CMPB ≥ TBPRD (счет вниз), то
событие произойдет при CTR = TBPRD;
- если компаратор запрограммирован на срабатывание при счете вверх, то событие
не произойдет.
В режиме счета вверх-вниз (см. рисунок 14.8):
- если счетчик считает вверх, а компаратор запрограммирован так, что
CMPA/CMPB < TBPRD (счет вверх), то событие произойдет при CTR = CMPA/CMPB;
- если CMPA/CMPB
≥ TBPRD (счет вверх), то событие произойдет при
CTR = TBPRD;
- если счетчик считает вниз, а компаратор запрограммирован так, что
CMPA/CMPB < TBPRD (счет вниз), то событие произойдет при CTR = CMPA/CMPB;
- если CMPA/CMPB
≥ TBPRD (счет вверх), то событие произойдет при
CTR = TBPRD.
80
Рисунок 14.8 - Работа таймера при счете вверх-вниз с симметричным выходом
(центрированная модуляция)
На рисунках 14.9 - 14.11 показано поведение линий PWMA и PWMB при различных
видах модуляции. На рисунках приняты обозначения, пояснения к которым приведены в
таблице 14.4.
Таблица 14.4 - Пояснения к обозначениям на рисунках 14.9 - 14.11
Обозначение
Пояснение
P
CA
CB
События CTR = PRD, CTR = CMPA, CTR = CTRB, соответственно.
×
×
×
Символ «×» указывает на то, что при возникновении этого события
сигнал на линии PWMA/PWMB остается без изменений. Пунктирными
линиями отмечены моменты возникновения события.
Так, например (см. рисунок 14.9), при возникновении события CTR =
CTRB, сигнал на линии PWMA остается без изменения, а сигнал на
линии PWMB переключается в ноль
Z
Z
Событие CTR = Zero
Символы «↑»/«↓» указывают на то, что
CA
CA
Событие CTR = CMPA
при возникновении этого события
сигнал на линии PWMA/PWMB
CB
CB
Событие CTR = CMPB
переключается в единицу/ноль
81
Рисунок 14.9 - Независимый режим работы выходов (фронтовая модуляция)
Рисунок 14.10 - Симметричный режим работы при счете вверх-вниз
(центрированная модуляция)
Рисунок 14.11 - Ассиметричный режим работы при счете вверх-вниз
14.4 Пороговый выключатель
Пороговый выключатель контролирует выходные сигналы PWMA и PWMB
обработчика событий и позволяет удерживать их в определенном заданном пользователем
состоянии в случае прихода сигнала триггера от цифровых компараторов блока АЦП.
82
Этот блок удобен для организации релейного поддержания заданного уровня какой-либо
физической величины, например для организации контура тока. В этом случае цифровой
компаратор, к каналу АЦП которого подключен сигнал датчика тока контура, формирует
сигнал о превышении током задания, а соответствующий пороговый выключатель
реагирует на это превышение и включает/отключает соответствующий силовой
транзистор посредством влияния на выход ШИМ.
Функциональные возможности:
- входные события от компараторов блока АЦП могут использоваться всеми
блоками ШИМ;
- при регистрации события от компаратора блока АЦП, выходные сигналы
обработчика событий могут быть переведены в состояние логической единицы, нуля или
оставлены без изменений;
- поддерживаются однократное и циклическое срабатывания для удержания выхода;
- входное событие от компаратора блока АЦП может анализироваться в
однократном и циклическом режимах;
- событие срабатывания компаратора блока АЦП может быть сгенерировано
программно;
- пороговый выключатель может быть отключен, если он не требуется.
- может генерироваться прерывание по событиям порогового выключателя.
Управление пороговым выключателем осуществляется посредством регистров
HDSEL, HDCTL и HDFRC.
Функционирование
Когда выходные сигналы компараторов блока АЦП переходят в состояние высокого
уровня, формируется событие. Каждый пороговый выключатель блока ШИМ может
использовать, а может не использовать эти события в своей работе; выбор, по сигналу
какого компаратора блока АЦП формировать событие удержания, задается с помощью
регистра HDSEL. Длительность импульса на входном сигнале от компаратора блока АЦП
не должна быть меньше периода системного синхросигнала. Каждый входной сигнал
компаратора блока АЦП должен быть настроен на однократное или циклическое
формирование события, выбор режима задается битами CBC и OST, а источник события
полем ADCDC.
При получении события от компаратора блока АЦП в режиме циклической
обработки немедленно формируется реакция на основе содержимого регистра HDCTL, в
результате чего меняется состояние сигналов на выходе порогового выключателя взамен
полученных от обработчика событий PWMA и/или PWMB на заданное пользователем в
регистре HDCTL. Дополнительно устанавливается флаг CBC в регистре HDFLG, и
генерируется прерывание PWM_HDINT. Удержание выходных сигналов PWMA и PWMB
заканчивается по событию TBCTR = 0000h, при условии, что событие компаратора блока
АЦП уже не активно. Таким образом, в режиме циклической обработки состояние
удержания сбрасывается в каждом периоде ШИМ. При этом флаг CBC остается активным
до его программного сброса. Если после сброса флага CBC вновь будет получено событие
компаратора блока АЦП, то флаг установится вновь.
При получении события компаратора блока АЦП в режиме однократной обработки,
также немедленно формируется реакция на основе содержимого регистра HDCTL,
которая меняет состояние выходных сигналов PWMA и/или PWMB. В дополнение,
устанавливается флаг OST, и генерируется прерывание PWM_HDINT. Удержание
выходных сигналов будет производиться до программного сброса записью единицы в бит
OST регистра HDCLR.
Способ удержания выходных сигналов при получении события компаратора блока
АЦП программируется индивидуально для выходных сигналов PWMA и PWMB в регистр
HDCTL.
83
14.5 Генератор задержки ШИМ
Блок имеет на входе сигналы ШИМ A и B с выходов обработчика событий, а на
выходах повторяет эти сигналы, но со вставкой задержки («мертвое время») в момент
переключения сигналов (если это необходимо).
Задержку можно учесть при программировании обработчика событий, но чтобы с
высокой вероятностью избежать ошибок, желательно использовать генератор задержки
ШИМ.
Основные функции генератора:
- генерация пары сигналов (PWMA и PWMB) с выдержкой интервалов (задержек)
времени относительно сигнала PWMA;
- программирование задержки для активного высокого и активного низкого уровня
сигналов каналов PWMА и PWMB;
- добавление программируемой задержки передних фронтов сигналов;
- добавление программируемой задержки для задних фронтов сигналов;
- возможность передачи сигналов с входов на выходы без изменений.
Генератор задержки ШИМ программируется посредством регистров DBCTL,
DBRED и DBFED. Структурная схема генератора «мертвого времени» ШИМ
представлена на рисунке 14.14.
Рисунок 14.12 - Структурная схема генератора «мертвого времени» ШИМ
Функционирование
Генератор задержки ШИМ может работать с четырьмя источниками (фронты
сигналов PWMA и PWMB). Выбор источника задается полем MODE регистра DBCTL.
Поле POLSEL позволяет задать инверсию (переключение значения на
противоположное) сигнала после внесения задержки (см. рисунок 14.13).
Величины задержек по переднему и заднему фронту программируются раздельно
посредством регистров DBRED и DBFED, соответственно.
84
Рисунок 14.13 - Временные диаграммы работы генератора «мертвого времени»
в типовой конфигурации
14.6 Фильтр коротких импульсов
Фильтр коротких импульсов предназначен для блокирования прохождения на выход
импульсов с длительностью меньше заданной. Этот блок может применяться, если
драйвер силового ключа инвертора не имеет такой функции, а для обеспечения
правильного режима работы транзистора необходимо запретить открытие/закрытие
транзистора на очень короткое время.
Основные функции фильтра:
- программируемая ширина минимального пропускаемого импульса;
- фильтр может быть отключен, если он не требуется.
Ширина минимального импульса, допускаемого к прохождению на выход, задается
в регистре FWDTH и может принимать значение от 00h (фильтр выключен) до 0Fh.
Импульсы длительностью меньше заданной пропускаться не будут.
14.7 Модулятор
Блок позволяет модулировать выходной ШИМ сигнал с помощью высокочастотных
импульсов программируемой скважности. Модулирование требуется для управления
силовыми ключами через импульсный трансформатор.
Основные функции модулятора:
- программируемая частота;
- программируемая ширина первого импульса;
- программируемая скважность второго и последующего импульсов;
- модулятор может быть отключен (бит CHPEN регистра PCCTL).
Модулятор программируется посредством регистра PCCTL. Структурная схема
модулятора приведена на рисунке 14.14.
85
Рисунок 14.14 - Структурная схема модулятора
Функционирование
Ширина первого импульса программируется независимо полем OSTWTH, это
требуется для открывания ключа. Для остальных импульсов частота модуляции
формируется на основе системной частоты при помощи делителя, программируемого
полем SHPFREQ. Скважность импульсов программируется полем CHPDUTY.
Значения поля OSTWTH лежат в диапазоне 0h - Fh.
Ширина L первого импульса определяется по формуле
L = T × 8 × (OSTWTH + 1),
(14.1)
где T - период синхросигнала PCLK.
Значения поля CHPDUTY лежат в диапазоне 0h - 7h.
Скважность D (с шагом 12,5 %) последующих импульсов определяется по формуле
D = 12,5 × (CHPDUTY + 1).
(14.2)
На рисунке 14.15 приведен пример временных диаграмм работы модулятора.
Рисунок 14.15 - Временные диаграммы работы модулятора
86
14.8 Детектор сигнала аварии
Блок контролирует выходы PWM_A и PWM_B и может переводить их в
определенное (запрограммированное) состояние в случае, если поступит сигнал аварии.
Основные функции:
- входной сигнал аварии с вывода микроконтроллера PWM_TZ может
использоваться любым блоком ШИМ;
- в случае если поступит сигнал аварии, выводы ШИМ могут быть переведены в
одно из состояний: логического нуля, логической единицы, высокоимпедансное или
оставлены без изменения;
- поддерживается однократная блокировка выводов для ситуации короткого
замыкания или перегрузки по току;
- поддерживается циклическая блокировка для режима ограничения тока;
- каждый входной источник сигнала аварии может быть обработан в однократном и
циклическом режимах;
- поддерживается программная генерация сигнала аварии;
- детектор сигнала аварии может быть отключен, если он не требуется.
Детектор сигнала аварии программируется посредством регистров TZSEL, TZCTL,
TZEINT, TZFLG, TZCLR и TZFRC.
Функционирование
Структурная схема детектора сигналов аварии показана на рисунке 14.16.
Рисунок 14.16 - Структурная схема детектора сигналов аварии
Переход входного сигнала аварии PWM_TZ из состояния логической единицы в
состояние логического нуля формирует событие аварии. Каждый блок ШИМ может
использовать или не использовать это событие в своей работе (программируется
посредством регистра TZSEL). События могут формироваться синхронно (с цифровым
фильтром помех) или асинхронно (программируется через регистры GPIO
микроконтроллера). При синхронной обработке длительность импульса на входном
сигнале сбоя должна быть не меньше периода синхросигнала TBCLK. Если же обработка
87
производится в асинхронном режиме, то событие формируется и обрабатывается даже в
том случае, если по какой-либо причине отключилось тактирование. Каждый входной
сигнал аварии должен быть настроен на однократное или циклическое формирование
события аварии (программируется посредством регистра TZSEL).
При получении события аварии в режиме циклической обработки немедленно
выполняется действие, заданное регистром TZCTL, и устанавливается флаг CBC в
регистре TZFLG, а также генерируется прерывание PWM_TZINT (если разрешено в
регистре TZEINT и контроллером прерываний). Аварийное удержание выводов
заканчивается по событию TBCTR = 0000h при условии, что событие аварии уже
неактивно. Таким образом, в режиме циклической обработки событие аварии
сбрасывается в каждом периоде ШИМ, хотя флаг аварии CBC остается установленным до
принудительного программного сброса. Если после сброса регистра флага CBC вновь
будет получено событие аварии, то флаг установится вновь. На рисунке 14.17 показана
схема формирования прерывания.
Рисунок 14.17 - Схема формирования прерывания
При получении события аварии в режиме однократной обработки немедленно
выполняется действие, заданное регистром TZCTL, и устанавливается флаг OST в
регистре TZFLG, а также генерируется прерывание PWM_TZINT (если разрешено в
регистре TZEINT и контроллером прерываний). Аварийное удержание выводов
заканчивается после принудительного программного сброса записью в бит OST регистра
TZCLR.
Аварийное состояние выводов при получении события сбоя программируется
индивидуально для выходов PWM_А и PWM_В полями TZA и TZB регистра TZCTL.
14.9 Триггер событий
Основные функции:
- получение событий, сформированных таймером и компаратором;
- использование информации о направлении счета (вверх-вниз);
- использование делителя событий, для формирования сигнала прерывания, запросов
к DMA и АЦП;
- предоставление доступа процессора к содержимому регистра флагов событий и
счетчикам событий.
Триггер событий (не показан на рисунке 14.1) программируется посредством
регистров ETSEL, ETPS, ETFLG, ETCLR и ETFRC.
88
Прерывания
Функциональная схема триггера событий для генерации прерываний показана на
рисунке 14.18.
Рисунок 14.18 - Структурная схема триггера событий для генерации прерываний
Триггер может генерировать прерывания (если разрешено битом INTEN регистра
ETSEL) по каждому первому, второму или третьему событию (поле INTPRD), которое
задается полем INTSEL. Количество возникших событий отражается в поле INTCNT.
Счетчик INTCNT считает от 00b до INTPRD и сбрасывается только вместе с отправкой
активного прерывания.
Когда возникает совпадение INTCNT и INTPRD, то возможны варианты:
- если прерывание разрешено и сброшен флаг INT (регистр ETFLG), то генерируется
прерывание и устанавливается флаг INT, а счетчик INTCNT сбрасывается в 00b и
начинает считать заново;
- если прерывание запрещено или флаг INT установлен, то счетчик перестает
считать события;
- если прерывание разрешено, но флаг от предыдущего прерывания еще не сброшен,
то счетчик хранит свое максимально достигнутое значение (INTCNT = INTPRD) до сброса
флага INT. Это позволяет обработать еще прерывание, пришедшее за то время, пока
обрабатывалось предыдущее.
Каждая запись в INTPRD сбрасывает счетчик INTCNT. Запись единицы в бит INT
регистра ETFRC увеличит значение счетчика на единицу. Если значение INTPRD = 00b,
то счетчик отключен, а входные события игнорируются.
Сопряжение с блоком DMA
Аналогичто триггеру событий работает и взаимодействием с блоком DMA.
Управление запросами DMA - PWM_DRQA, PWM_DRQB осуществляется через регистры
ETSEL, ETPS, ETFRC аналогично механизму управления сигналом прерывания
PWM_INT.
Функциональная схема триггера событий для генерации запросов DMA показана на
рисунке 14.19.
89
Рисунок 14.19 - Структурная схема триггера событий для генерации запросов DMA
Сопряжение с блоком АЦП
Управление сигналами запуска АЦП - PWM_SOCA, PWM_SOCB осуществляется
аналогично сигналу прерывания PWM_INT и запросам PWM_DRQA, PWM_DRQB через
регистры ETSEL, ETPS, ETFRC.
Функциональная схема триггера событий для генерации сигнала запуска АЦП
показана на рисунке 14.20.
Рисунок 14.20 - Структурная схема триггера событий для генерации сигналов
запуска АЦП
90
Выходы всез трёх блоков ШИМ (PWM_SOCA и PWM_SOCB каждого блока)
объединяются по ИЛИ, как показано на рисунке 14.21. Сигналы с выходов элементов
ИЛИ защелкиваются в триггерах и формируют импульсы запуска секвенсоров блока
АЦП.
Рисунок 14.21 - Схема соединений меджду блока ШИМ и АЦП
91
15 Приемопередатчик UART
В состав микроконтроллера входят четыре идентичных универсальных асинхронных
приемопередатчика UART0, UART1.
В состав приемопередатчика входят два буфера типа FIFO. Буфер приемника имеет
разрядность 12, буфер передатчика - разрядность восемь. Каждый буфер может хранить
до 32 байт данных, и каждый буфер может быть сконфигурирован (программно) как
32-байтный или как однобайтный.
Приемопередатчик обеспечивает:
- независимое маскирование прерываний от буфера передатчика, буфера приемника,
по таймауту приемника, а также в случае обнаружения ошибки;
- возможность деления тактовой частоты в диапазоне от 1 до 65 535 (допускается
использование нецелых коэффициентов деления, что позволяет использовать любой
опорный генератор с частотой более 3,6864 МГц);
- поддержку прямого доступа к памяти;
Приемопередатчик реализует:
- передачу данных длиной от 5 до 8 бит со скоростью до 921 600 бит/с;
- контроль четности (проверочный бит выставляется по четности, нечетности, имеет
фиксированное значение либо не передается);
- формирование одного или двух стоповых бит;
- обнаружение ложных стартовых битов;
- формирование и обнаружение сигнала разрыва линии.
Функциональные возможности
Режим работы приемопередатчика и скорость обмена данными контролируются
регистром LCRH и регистрами делителя IBRD и FBRD.
Устройство может формировать следующие сигналы:
- независимые маскируемые прерывания от приемника (в том числе по таймауту),
передатчика, а также в случае обнаружения ошибки;
- общее прерывание, возникающее в случае, если возникло одно из независимых
немаскированных прерываний;
- сигналы запроса на прямой доступ к памяти для совместной работы с
контроллером DMA.
В случае возникновения ошибки в структуре сигнала, четности данных, а также
разрыва линии, соответствующий бит ошибки устанавливается и сохраняется в буфере
приемника. В случае переполнения буфера приемника также устанавливается
соответствующий бит, а буфер становится недоступным для записи.
15.1 Функционирование блока UART
На рисунке 15.1 показана упрощенная функциональная схема приемопередатчика.
Генератор тактового сигнала приемопередатчика формирует синхросигнал
последовательного обмена данными, который представляет собой последовательность
импульсов с шириной, равной одному периоду сигнала UARTCLK, и частотой в 16 раз
превышающей частоту передачи данных.
Буфер передатчика предназначен для хранения данных (полученных от ЦП) до тех
пор, пока они не будут переданы внешнему устройству.
92
Рисунок 15.1 - Функциональная схема приемопередатчика
Буфер приемника предназначен для хранения данных и кодов ошибки (принятых от
внешнего устройства) до тех пор, пока они не будут прочитаны ЦП.
Обработчик прерываний генерирует независимые маскируемые прерывания с
активным высоким уровнем. Кроме того, формируется комбинированное прерывание
путем объединения независимых прерываний по схеме ИЛИ. Сигнал прерывания
передается на контроллер NVIC.
Сброс модуля
Приемопередающая логика модуля, управляющие регистры и FIFO по умолчанию
находятся в сбросе. Снять сброс можно путём установки бита RSTDIS в соответсвующем
регистре UARTCFGx (i - номер модуля 0 или 1) блока RCU.
Синхронизация
Существует ограничение на соотношение между тактовыми частотами PCLK и
UARTCLK:
UARTCLK ≤ 5/3 × PCLK
Например, для достижения максимальной скорости передачи данных 921 600 бод
(при Fuartclk = 921 600 × 16 = 14,7456 МГц) частота PCLK должна быть не менее 8,84736
МГц.
Для точной настройки частоты передачи данных используются два делителя - один
управляется регистром UARTCFGx блока RCU, второй находится внутри модуля UART.
Коэффициент деления второго делителя имеет целую и дробную части, которые задаются
регистрами IBRD и FBRD. Возможность задания нецелых коэффициентов деления
позволяет осуществлять обмен данными на стандартных скоростях, используя в качестве
источника тактовый сигнал с произвольной частотой более 3,6864 МГц.
Коэффициент деления К частоты сигнала UARTCLK рассчитывается по формуле
K = Fuartclk/(16×baudrate),
93
где Fuartclk - частота сигнала синхронизации блока UART - UARTCLK, Гц;
baudrate - скорость передачи, бод.
Получившееся дробное десятичное число следует разделить на две части - целую и
дробную.
Целая часть после преобразования в двоичный формат записывается в регистр IBRD.
Дробная часть умножается на 64 и округляется до ближайшего целого числа.
Полученное число преобразовывается в двоичный формат и записывается в регистр
FBRD.
Для примера, пусть требуемая скорость передачи данных 230 400 бит/с и частота
тактового сигнала UARTCLK равна 4 МГц. Тогда:
К = (4 ×106) / (16 × 230 400) = 1,085.
Получившееся число разбивается на две части - 1 и 0,085.
В регистр IBRD записывается значение 0001h.
Значение (0,085 × 64) округляется и преобразовывается в 05h для записи в регистр
FBRD.
Таким образом, реальные значения коэффициента деления частоты и скорости
передачи будут следующими:
К = 1 + 5/64 = 1,078,
baudrate = (4 × 106)/ (16 × 1,078) = 231 911 бит/с.
Ошибка установки скорости:
Δ = ((231 911 - 230 400) / 230 400) × 100 % = 0,656 %.
Максимальная ошибка установки скорости передачи данных:
Δ = (1/64) × 100 % = 1,56 %.
Такая ошибка возникает в случае K = 1, при этом разница накапливается в течение
64 тактовых интервалов.
Содержимое регистров LCRH, IBRD и FBRD обновляется при записи в регистр
LCRH. Таким образом, для того, чтобы новые параметры коэффициента деления вступили
в силу, после их записи в регистры IBRD и FBRD, необходимо осуществить запись в
регистр LCRH и только в такой последовательности.
Примечание
- Изменение содержимого регистров IBRD, FBRD и LCRH
допускается только во время, когда приемопередатчик запрещен и не осуществляется
передача/прием байта.
Передача и прием данных
Данные для передачи заносятся в буфер передатчика посредством записи в регистр
DR. После записи хотя бы одного байта в буфер передатчика устанавливается флаг BUSY
в регистре FR. Это состояние флага сохраняется, пока буфер передатчика не пуст (даже
если работа приемопередатчика запрещена). Далее, если работа приемопередатчика
разрешена (установлены биты UARTEN и TXE регистра CR), начинается передача
информационного кадра с параметрами, указанными в регистре управления линией
94
LCRH. Передача данных продолжается до опустошения буфера передатчика (до
окончания передачи всех байт). По окончании передачи сбрасывается флаг BUSY.
При приеме байта данных (установлены биты UARTEN и RXE регистра CR) для
каждого бита производятся три выборки уровня, и решение о значении бита принимается
по мажоритарному принципу.
В случае, если приемник находился в неактивном состоянии (постоянный высокий
уровень сигнала на линии UART_RX) и произошла смена уровня входного сигнала с
высокого на низкий (стартовый бит), включается счетчик, тактируемый внутренним
сигналом, после чего отсчеты сигнала на входе приемника регистрируются каждые восемь
тактов.
Стартовый бит считается достоверным в случае, если сигнал на линии UART_RX
сохраняет низкий логический уровень в течение восьми периодов внутреннего
синхросигнала с момента включения счетчика. В противном случае переход в ноль
рассматривается как ложный старт и игнорируется.
После обнаружения достоверного стартового бита очередной бит данных
фиксируется каждые 16 отсчетов тактового сигнала. Производится регистрация всех бит
данных (согласно запрограммированным параметрам) и бита четности (если включен
режим контроля четности).
По окончании приема байта производится проверка присутствия корректного
стопового бита (высокий логический уровень сигнала UART_RX). После этого байт
заносится в буфер приемника вместе с тремя битами признаков ошибки (см. рисунок 15.2)
и битом переполнения буфера.
В 12-разрядной ячейке буфера байт данных располагается в области младших
восьми бит, три бита признаков ошибки - в битах с 8 по 10.
Флаг переполнения буфера приемника выставляется в том случае, если к моменту,
когда очередной кадр данных полностью принят, буфер уже заполнен. В этом случае
принятый кадр остается в сдвиговом принимающем регистре и, в случае приема
следующего кадра данных, будет потерян.
Как только в буфере приемника освобождается место для записи, кадр данных,
находящийся в сдвиговом регистре, переписывается в буфер, а флаг переполнения
сбрасывается.
Рисунок 15.2 - 12-разрядная ячейка принимающего буфера
Данные из буфера приемника можно прочитать посредством регистра DR.
Состояние признаков ошибки и флага переполнения определяется чтением регистра RSR
и относится к последнему байту, считанному из регистра DR, в связи с этим регистр DR
всегда должен считываться первым.
Все флаги сбрасываются одновременно записью любого значения в регистр RSR или
после сброса устройства.
Примечания
1 Необходимо запрещать работу приемопередатчика перед перепрограммированием
его регистров управления. Если приемопередатчик переводится в отключенное состояние
95
во время передачи или приема, то перед остановкой он завершает выполняемую
операцию.
2 Целостность данных в буферах передатчика и приемника не гарантируется, если
установился флаг BRK (разрыв линии), или если программное обеспечение произвело
остановку приемопередатчика после его повторного перевода в разрешенное состояние.
15.2 Интерфейс прямого доступа к памяти
Приемопередатчик оснащен интерфейсом подключения к контроллеру прямого
доступа к памяти. Работа в данном режиме контролируется регистром управления
DMACR. Интерфейс DMA включает в себя шесть сигналов.
RXDMASREQ (для приема) - запрос передачи отдельного символа, инициируемый
приемопередатчиком. Размер символа в режиме приема данных - до 12 бит. Сигнал
переводится в активное состояние в случае, если буфер приемника содержит, по меньшей
мере, один символ.
RXDMABREQ (для приема) - запрос блочного обмена данными, инициируемый
приемопередатчиком. Сигнал переходит в активное состояние в случае, если заполнение
буфера приемника превысило заданный порог. Порог программируется индивидуально
для каждого буфера посредством полей регистра IFLS.
RXDMACLR (для приема) - сброс запроса на DMA, инициируемый
приемопередатчиком. В случае если был запрошен блочный обмен данными, сигнал
сброса формируется в ходе передачи последнего символа данных в блоке.
TXDMASREQ (для передачи) - запрос передачи отдельного символа, инициируемый
приемопередатчиком. Размер символа в режиме передачи данных - до восьми бит. Сигнал
переводится в активное состояние в случае, если буфер передатчика содержит, по
меньшей мере, одну свободную ячейку.
TXDMABREQ (для передачи) - запрос блочного обмена данными, инициируемый
приемопередатчиком. Сигнал переводится в активное состояние в случае, если заполнение
буфера передатчика ниже заданного порога. Порог программируется индивидуально для
каждого буфера посредством полей регистра IFLS.
TXDMACLR (для передачи) - сброс запроса на DMA, инициируемый контроллером
DMA с целью сброса принятого запроса. В случае если был запрошен блочный обмен
данными, сигнал сброса формируется в ходе передачи последнего символа данных в
блоке.
Сигналы блочного и одноэлементного обмена данными не являются взаимно
исключающими, они могут быть инициированы одновременно. Например, в случае, если
заполнение данными буфера приемника превышает пороговое значение, формируется как
сигнал запроса одноэлементного обмена, так и сигнал запроса блочного обмена данными.
В случае, если количество данных в буфере приема меньше порогового значения,
формируется только запрос одноэлементного обмена. Это бывает полезно в ситуациях,
при которых объем данных меньше размера блока.
Пусть, например, нужно принять
19 символов, а порог заполнения буфера
установлен равным четырем. Тогда контроллер DMA осуществит четыре передачи блоков
по четыре символа, а оставшиеся три символа передаст в ходе трех одноэлементных
обменов, поскольку для них блок UART не может инициировать процедуру блочного
обмена.
Каждый инициированный приемопередатчиком сигнал запроса DMA остается
активным до момента его сброса соответствующим сигналом DMACLR.
После снятия сигнала сброса модуль приемопередатчика вновь получает
возможность сформировать запрос на DMA в случае выполнения описанных выше
условий. Все запросы DMA снимаются после запрета работы приемопередатчика, а также
96
в случае установки в ноль бита управления DMATXDMAE или RXDMAE в регистре
управления DMACR.
В случае запрета буферов устройство способно передавать и принимать только
одиночные символы и, как следствие, контроллер может инициировать DMA только в
одноэлементном режиме. При этом модуль в состоянии формировать только сигналы
управления RXDMASREQ и TXDMASREQ.
Когда буферы включены, обмен данными может производиться в ходе как
одноэлементных, так и блочных передач данных, в зависимости от установленной
величины порога заполнения буферов и их фактического заполнения.
В таблице 15.1 указаны значения параметров срабатывания запросов блочного
обмена RXDMABREQ и TXDMABREQ в зависимости от порога заполнения буфера.
Таблица 15.1 - Параметры срабатывания запросов блочного обмена данными в режиме
DMA
Количество незаполненных
Количество заполненных ячеек
Пороговый уровень
ячеек буфера передатчика
буфера приемника
1/8
28
4
1/4
24
8
1/2
16
16
3/4
8
24
7/8
4
28
В регистре управления DMACR предусмотрен бит DMAONERR, который позволяет
запретить DMA от приемника в случае активного состояния линии прерывания по
обнаружению ошибки EINTR. При этом соответствующие линии запроса DMA
-
RXDMASREQ и RXDMABREQ переводятся в неактивное состояние (маскируются) до
сброса EINTR. На линии запроса DMA обслуживающие передатчик состояние EINTR не
влияет.
15.3 Прерывания
В модуле предусмотрено 5 маскируемых источников прерываний.
Сигналы запросов на прерывания:
- RXINTR - от приемного FIFO;
- TXINTR - от передающего FIFO;
- RTINTR - по таймауту приемника;
- TDINTR - по окончанию передачи в линии;
- EINTR - по ошибке.
Каждый из сигналов может быть маскирован путем установки соответствующего
бита в регистре маски IMSC.
Источник прерывания также можно определить, считав состояние регистра RIS или
регистра MIS (маскированные прерывания). Сброс прерывания осуществляется
программно путём установки соответствующего бита в регистре ICR.
RXINTR
Запрос возникает в случае обнаружения одного из событий:
- буфер приемника в режиме FIFO и его заполнение достигло заданного порогового
значения;
- буфер приемника имеет одну ячейку (режим FIFO запрещен) и принят один кадр
данных.
97
Линия прерывания переходит в высокое состояние и удерживается в нем до тех пор,
пока из буфера не будет прочитан как минимум один байт или выполнен программный
сброс прерывания (регистр ICR).
TXINTR
Запрос возникает в случае обнаружения одного из событий:
- буфер передатчика в режиме FIFO и его опустошение достигло заданного
порогового значения;
- буфер передатчика имеет одну ячейку (режим FIFO запрещен) и пуст.
Линия прерывания переходит в высокое состояние и удерживается в нем до тех пор,
пока в буфер не будет записан как минимум один байт или выполнен программный сброс
прерывания.
Запись данных в буфер передатчика допускается как перед разрешением работы
приемопередатчика и прерываний, так и после разрешения.
Примечание
- Прерывание передатчика работает по фронту, а не по уровню
сигнала. В случае, если работа приемопередатчика и прерывания от него разрешена до
осуществления записи данных в буфер передатчика, прерывание не формируется.
Прерывание возникает только при опустошении буфера.
TDINTR
Запрос возникает в случае окончания передачи в линии.
RTINTR
Запрос возникает в случае, если буфер приемника не пуст и на вход приемника не
поступало новых данных в течение периода времени, необходимого для передачи 32 бит.
Прерывание сбрасывается после считывания данных из буфера приемника до его
опустошения или программно.
EINTR
Запрос возникает в случае ошибки при приеме данных. Оно может быть вызвано:
- ошибкой в структуре кадра;
- ошибкой контроля четности;
- разрывом линии;
- переполнением буфера приемника.
На NVIC заведено 4 линии прерываний:
- UART_RX_INT - запрос RXINTR;
- UART_TX_INT - запрос TXINTR;
- UART_TD_INT - запрос TDINTR;
- UART_E_RT_INT - объединенные по ИЛИ запросы RTINTR и EINTR.
15.4 Программирование
Для программирования рекомендуется следующая последовательность действий:
- запретить работу приемопередатчика;
- дождаться окончания приема и/или передачи текущего байта данных;
- сбросить буфер передатчика посредством сброса бита FEN регистра LCRH;
- изменить настройки регистра CR;
- разрешить работу приемопередатчика.
98
16 Контроллер интерфейса SPI
Контроллер интерфейса SPI реализует интерфейс последовательной синхронной
связи в режиме ведущего (мастера) и ведомого устройства и обеспечивает обмен данными
с подключенным ведомым или ведущим периферийным устройством в соответствии с
одним из трех протоколов фирм Motorola, National Semiconductor, Texas Instruments.
Последовательный синхронный интерфейс SPI фирмы Motorola обеспечивает
полнодуплексный обмен данными по четырехпроводной линии и программное задание
фазы и полярности тактового сигнала.
Интерфейс Microwire фирмы National Semiconductor обеспечивает полудуплексный
обмен данными с использованием 8-битных управляющих последовательностей.
Интерфейс SSI фирмы Texas Instruments обеспечивает полнодуплексный обмен
данными по четырехпроводной линии и возможность перевода линии передачи данных в
третье (высокоимпедансное) состояние.
Выбор интерфейса осуществляется посредством поля FRF регистра CR0.
В режиме мастера и в режиме ведомого устройства контроллер SPI обеспечивает:
- передачу данных, размещенных в буфере передатчика (восемь 16-разрядных
ячеек);
- прием данных и размещение их в буфере приемника (восемь 16-разрядных ячеек).
Контроллер формирует сигналы прерываний по следующим событиям:
- необходимость обслуживания буферов приемника и/или передатчика;
- переполнение буфера приемника;
- наличие данных в буфере приемника по истечении времени таймаута.
Основные характеристики:
- программное управление скоростью обмена;
- программируемая длительность информационного кадра от 4 до 16 бит;
- независимое маскирование прерываний от буферов передатчика и приемника;
- поддержка прямого доступа к памяти (DMA).
16.1 Структура контроллера SPI
Упрощенная функциональная схема контроллера SPI с блоком синхронизации
показана на рисунке 16.1.
Рисунок 16.1 - Упрощенная функциональная схема контроллера SPI
99
Синхронизация
Тактирование контроллера SPI осуществляется тактовым сигналом SPICLK,
который формируется на основе одного из четырех базовых синхросигналов (см. раздел 4
«Система тактирования микроконтроллера»).
Существует ограничение на соотношение между тактовыми частотами PCLK и
SPICLK:
SPICLK ≤ PCLK.
В режиме мастера на основе сигнала SPICLK посредством двух последовательно
стоящих делителей формируется сигнал тактирования передачи и приема данных с
частотой Fspi_sck, которую можно вычислить по формуле
Fspi_sck = Fspiclk/(CPSDVSR×(1+SCR)),
где - Fspiclk - частота входного синхросигнала SPICLK;
CPSDVSR - коэффициент первого делителя частоты (задается в регистре SPSR);
SCR - коэффициент второго делителя частоты (задается в регистре CR0).
Сформирований синхросигнал подается на вывод SPI_SCK микроконтроллера и
далее к подключенным внешним ведомым устройствам.
В режиме ведомого значения коэффициентов делителей не важны. Внешний
синхросигнал подается на вывод SPI_SCK и тактирует прием и передачу данных.
Для корректной работы всегда должны соблюдаться условия:
- в режиме мастера для формируемого синхросигнала
Fspi_sck ≤ PCLK/2;
- в режиме ведомого для входящего внешнего синхросигнала
Fspi_sck ≤ PCLK/12.
Буферы приема и передачи
Для хранения передаваемых и принятых данных в контроллере SPI имеются два
16-разрядных буфера, организованных по типу FIFO. Каждый буфер может хранить до
восьми слов данных. Буфер для передаваемых данных доступен только для записи, а
буфер принятых данных - только для чтения.
Данные для передачи записываются в буфер через регистр DR. Допускается заранее
заполнить буфер или записывать в него данные в течение работы контроллера. Состояние
буфера можно контролировать с помощью битов TNF и TFE регистра SR. Если
контроллер выключен (сброшен бит SSE регистра CR1), то запись в регистр DR приведет
к тому, что данные будут размещены в буфере и будут переданы после включения
контроллера. Если контроллер включен и выбран режим мастера, то в случае отсутствия
данных в буфере запись в регистр DR приведет к немедленному началу передачи. Если
запись данных в регистр DR происходит во время текущей передачи, то данные
размещаются в буфере.
Полученные данные автоматически сохраняются в буфере принятых данных.
Извлечь данные из буфера возможно чтением регистра DR. Состояние буфера можно
контролировать с помощью битов RFFF и RNE регистра SR.
Размер передаваемого кадра данных может быть от 4 до 16 бит, что задается полем
DSS регистра CR0. Если выбран размер кадра менее 16 бит, данные выравниваются по
правой границе; неиспользуемые биты игнорируются.
100
16.2 Интерфейс прямого доступа к памяти
Контроллер SPI имеет интерфейс подключения к контроллеру прямого доступа к
памяти. Работа в данном режиме контролируется регистром DMACR.
Сигналы для приема:
- RXDMASREQ - запрос
передачи
отдельного
слова,
инициируется
приемопередатчиком. Сигнал переводится в активное состояние в случае, если буфер
приемника содержит, по меньшей мере, одно слово;
- RXDMABREQ - запрос
блочного
обмена
данными,
инициируется
приемопередатчиком. Сигнал переходит в активное состояние в случае, если заполнение
буфера приемника превысило заданный порог. Порог программируется индивидуально
посредством поля RXIFLSEL регистра CR1.
- RXDMACLR - сброс запроса на DMA, инициируется контроллером DMA с целью
сброса принятого запроса. В случае если был запрошен пакетный обмен данными, сигнал
сброса формируется в ходе передачи последнего слова данных в пакете.
Сигналы для передачи:
- TXDMASREQ - запрос
передачи
отдельного
слова,
инициируется
приемопередатчиком. Сигнал переводится в активное состояние в случае, если буфер
передатчика содержит, по меньшей мере, одну свободную ячейку;
- TXDMABREQ - запрос
блочного
обмена
данными,
инициируется
приемопередатчиком. Сигнал переводится в активное состояние в случае, если заполнение
буфера передатчика ниже заданного порога. Порог программируется индивидуально
посредством поля TXIFLSEL регистра CR1.
- TXDMACLR - сброс запроса на DMA, инициируется контроллером DMA с целью
сброса принятого запроса. В случае если был запрошен пакетный обмен данными, сигнал
сброса формируется в ходе передачи последнего слова данных в пакете.
Сигналы блочного и одноэлементного обмена данными не являются взаимно
исключающими, они могут быть инициированы одновременно. Например, в случае, если
заполнение данными буфера приемника превышает пороговое значение, формируется как
сигнал запроса одноэлементного обмена, так и сигнал запроса блочного обмена данными.
В случае, если количество данных в буфере приема меньше порогового значения,
формируется только запрос одноэлементного обмена. Это бывает полезно в ситуациях,
при которых объем данных меньше размера блока.
Например, нужно принять 19 слов, а порог заполнения буфера установлен равным
четырем. Тогда контроллер DMA осуществит четыре пакетные передачи блоков по
четыре слова, а оставшиеся три слова - в ходе трех одиночных обменов, поскольку для
них контроллер SPI не инициирует процедуру пакетного обмена.
Каждый инициированный приемопередатчиком сигнал запроса DMA остается
активным до момента его сброса соответствующим сигналом от контроллера DMA.
После снятия сигнала сброса приемопередатчик вновь получает возможность
сформировать запрос на DMA в случае выполнения описанных выше условий. Все
запросы DMA снимаются после запрета работы приемопередатчика, а также в случае
снятия сигнала разрешения DMA.
16.3 Функционирование
Приемопередающая логика модуля, управляющие регистры и FIFO по умолчанию
находятся в сбросе. Снять сброс можно путём установки бита RSTDIS в соответсвующем
регистре SPICFG блока RCU.
Прежде чем разрешить работу битом SSE регистра CR1, следует сконфигурировать
контроллер посредством регистров CR0 и CR1, а также, если это необходимо,
запрограммировать маски прерываний.
Динамическое изменение конфигурации устройства не допускается.
101
Для протокола SPI дополнительно задаются полярность и фаза сигнала (биты SPH и
SPO регистра CR0).
После разрешения работы приемопередатчик готов к обмену данными с внешними
устройствами по линиям SPI_TX (передача данных к внешнему устройству) и SPI_RX
(прием данных от внешнего устройства).
В зависимости от режима работы сигнал на линии SPI_FSS используется либо для
кадровой синхронизации (интерфейс SSI, активное состояние - высокий уровень), либо
для выбора устройства в режиме ведомого (интерфейсы SPI и Microwire, активное
состояние - низкий уровень).
Во всех трех режимах SPI, Microwire и SSI синхросигнал SPI_SCK формируется
только тогда, когда приемопередатчик готов к обмену данными. Перевод сигнала
SPI_SCK в неактивное состояние используется как признак таймаута приемника, то есть
наличия в буфере приемника необработанных данных по истечении заданного интервала
времени.
Установка бита MS регистра CR1 включает режим ведомого устройства. В этом
режиме разрешение или запрещение передачи данных через выход SPI_TX
контролируется битом SOD. На прием синхросигнала и данных состояние этого бита
влияния не оказывает.
Интерфейс SPI
Реализует полнодуплексный режим передачи данных.
Включает одну линию синхронизации SPI_SCK, две линии приема и передачи
данных SPI_RX и SPI_TX, а также линию выбора устройства (для режима ведомого)
SPI_FSS.
Если устройство функционирует в режиме ведомого, то на его вход SPI_FSS должен
подаваться низкий уровень сигнала в течение всей передачи кадра (последовательность
передаваемых бит данных длиною от 4 до 16 бит).
Передача данных может быть одиночной (один кадр) или непрерывной (более
одного кадра подряд). Данные передаются старшим битом вперед.
Особенностью интерфейса SPI является то, что в нем реализована возможность
задания полярности и фазы тактового сигнала. Бит SPO регистра CR0 задает полярность
тактового сигнала, т. е. определяет, какой уровень сигнала будет удерживаться на линии
SPI_SCK в то время, когда линия не активна.
Бит SPH задает фазу тактового сигнала. Фактически, он задает порядок считывания
и выставления данных. По умолчанию, бит SPH сброшен и выставление данных на линиях
SPI_TX и SPI_RX происходит по переднему фронту сигнала синхронизации, а выборка -
по заднему.
Передним всегда считается тот фронт сигнала, который является началом передачи
первого бита (см. рисунок 16.2).
Рисунок 16.2 - Сигнал синхронизации SPI_SCK при разных состояниях бита CPOL
102
Комбинации битов SPO и SPH задают четыре режима обмена данными (см.
рисунок 16.3).
Рисунок 16.3 - Передача кадров данных в интерфейсе SPI
На рисунке 16.4 показано поведение сигналов при непрерывной передаче кадров
данных.
Рисунок 16.4 - Непрерывная передача кадров данных
В режиме непрерывной передачи данных при условии SPH = 0 на линии SPI_FSS
должны формироваться импульсы между передачами кадров данных. Это связано с тем,
что в этом режиме низкий уровень сигнала на линии SPI_FSS ведомого устройства
блокирует запись в сдвиговый регистр. Поэтому мастер должен переводить линию
SPI_FSS в высокий уровень по окончании передачи каждого кадра, разрешая, таким
образом, запись новых данных. По окончании приема последнего бита кадра линия
SSP_FSS переводится в состояние логической единицы по истечении одного такта сигнала
SPI_SCK.
В режиме непрерывной передачи данных при условии SPH = 1 низкий уровень
сигнала на линии SPI_FSS не блокирует запись в сдвиговый регистр. Поэтому линия
SPI_FSS может оставаться в состоянии нуля в течение передачи всех кадров и переведена
в состояние логической единицы только по окончании передачи.
103
Интерфейс Microwire
Реализует полудуплексный режим передачи данных.
Включает линию синхронизации SPI_SCK, две линии приема и передачи данных
SPI_RX и SPI_TX, а также линию выбора устройства (для режима ведомого) SPI_FSS.
Если устройство функционирует в режиме ведомого, то на его вход SPI_FSS должен
подаваться низкий уровень сигнала в течение всей передачи кадра (последовательность
передаваемых бит данных длиною от 4 до 16 бит).
Передача данных может быть одиночной (один кадр) или непрерывной (более
одного кадра подряд). Данные передаются старшим битом вперед.
Перед началом передачи линия SPI_FSS переводится в низкое состояние.
Каждая передача начинается с передачи от мастера к ведомой
8-битной
управляющей последовательности. В течение передачи этой последовательности
приемник мастера не обрабатывает входящие данные. После того как управляющая
последовательность передана и декодирована одним из ведомых устройств, этот ведомый
выдерживает паузу в один такт синхросигнала и начинает передавать мастеру кадр
данных (см. рисунок 16.5).
Выставление данных происходит по заднему фронту сигнала SPI_SCK, а считывание
- по переднему.
Рисунок 16.5 - Передача кадра данных в интерфейсе Microwire
По окончании приема данных линия SPI_FSS переводится в высокое состояние.
Примечание
- В течение времени, когда передается управляющая
последовательность и между передачами, линия SPI_RX может находиться в третьем
состоянии.
В режиме непрерывной передачи начало и завершение передачи нескольких кадров
данных аналогично передаче одного кадра. Линия SPI_FSS удерживается в нуле в течение
всего сеанса передачи. По окончании передачи одного кадра данных начинается передача
управляющей последовательности без паузы (см. рисунок 16.6).
Примечание
- Буферы FIFO приема и передачи данных не очищаются
автоматически, даже в случае запрещения работы сбросом бита SSE.
104
Рисунок 16.6 - Передача кадров данных в интерфейсе Microwire
Интерфейс SSI
Реализует полнодуплексный режим передачи данных.
Включает одну линию синхронизации SPI_SCK, две линии приема и передачи
данных SPI_RX и SPI_TX, а также линию выбора устройства SPI_FSS.
Перед началом передачи каждого кадра на линии SPI_FSS формируется импульс
длительностью в один период сигнала SPI_SCK. Далее мастер и ведомый передают
данные. Установка данных производится по переднему фронту синхросигнала, а выборка
- по заднему (см. рисунок 16.7). Весь цикл передачи начинается сразу же после появления
хотя бы одного элемента в буфере FIFO передатчика.
Рисунок 16.7 - Передача кадра данных в интерфейсе SSI
Режим непрерывной передачи кадров данных показан на рисунке 16.8.
Рисунок 16.8 - Непрерывная передача кадров данных в интерфейсе SSI
16.4 Прерывания
Оба буфера могут генерировать
4 независимых маскируемых запроса на
прерывания:
- TXINTR - запрос на обслуживание буфера передатчика (опустошение буфера равно
или ниже порога);
105
- RXINTR - запрос на обслуживание буфера приемника (заполнение буфера равно
или выше порога);
- RTINTR - таймаут ожидания чтения данных из буфера приемника (буфер
приемника не пуст и не было попыток обращения к нему в течение времени равного
передаче 32 бит);
- RORINTR - переполнение буфера приемника.
Пороги программируется индивидуально для каждого буфера посредством полей
TXIFLSEL и RXIFLSEL регистра CR1.
Каждый из сигналов может быть маскирован путем установки соответствующего
бита в регистре маски IMSC.
Источник прерывания также можно определить, считав состояние регистра RIS или
регистра MIS (маскированные прерывания). Сброс прерывания осуществляется
программно путём установки соответствующего бита в регистре ICR.
На NVIC заведено 3 линии прерываний:
- SPI_RX_INT - запрос RXINTR;
- SPI_TX_INT - запрос TXINTR;
- SPI_RO_RT_INT - объединенные по ИЛИ запросы ROINTR и RTINTR.
106
17 Контроллер интерфейса I2C
Модуль контроллера I2C обеспечивает полную поддержку двухпроводного
последовательного синхронного интерфейса I2C/SMBus. Результат такой совместимости -
легкое соединение со многими запоминающими устройствами и устройствами ввода-
вывода, включая EEPROM, SRAM, счетчики, АЦП, ЦАП, периферийные устройства.
Функциональные возможности модуля:
- совместимость с протоколами SMBus 1.1 и SMBus 2.0, ACCESS.Bus, I2C 2.1;
- поддержка скоростного/стандартного (FS) и высокоскоростного (HS) режимов;
- программирование действий мастера/ведомого;
- возможность подключения к шине нескольких ведущих устройств, т. е. поддержка
режима мультимастер (ММ);
- один программно задаваемый адрес;
- 7- или 10-битная адресация ведомого;
- поддержка адреса общего вызова.
Особые возможности SMBus:
- отслеживание времени простоя линии SCL;
- наличие функции отслеживания ошибок в пакетах данных (PEC) с использованием
метода расчета контрольной суммы (CRC);
- поддержка адреса отклика мастера;
- поддержка полинга и контроля прерываний.
17.1 Протокол шины
Протокол I2C использует двухпроводной интерфейс для двухсторонней связи между
устройствами, подключенными к шине. Двунаправленная шина состоит из двух линий:
данных SDA и тактового сигнала SCL. Эти линии подключены к источнику питания через
подтягивающие резисторы. Шинные формирователи любых устройств, подключаемых к
шине, выполняются по схеме с открытым коллектором или открытым стоком. Устройства
могут выставить только низкий уровень на соответствующей линии. Следовательно, обе
линии SDA и SCL реализуют функцию «монтажное И».
Протокол поддерживает режим мультимастер, в котором шина может
контролироваться одним или несколькими устройствами, из подключенных к шине.
Каждое устройство, подключенное к шине, имеет свой адрес и может быть как
приемником, так и передатчиком (некоторые только приемниками).
Операции с данными
Устройство, которое начинает передачу данных, становится мастером. Мастер
генерирует тактовый сигнал SCL, а также инициирует и завершает передачу данных по
шине. За один такт сигнала SCL передается один бит данных по линии SDA
(рисунок 17.1).
Рисунок 17.1 - Передача бита данных
107
Данные валидны (верны), пока уровень сигнала на линии SCL высокий. Когда на
линии SCL низкий уровень сигнала, данные могут меняться.
Старт и стоп
Состояние старта формируется тогда, когда на линии SCL держится высокий
уровень сигнала, а на линии SDA возникает перепад уровня сигнала из высокого в низкий
(см. рисунок 17.2).
Состояние стопа (останова) формируется тогда, когда на линии SCL держится
высокий уровень сигнала, а на линии SDA возникает перепад уровня сигнала из низкого в
высокий (см. рисунок 17.2).
Состояния старта и стопа формирует только мастер.
Рисунок 17.2 - Состояния старта и стопа
После того, как сформировано состояние старта, шина считается занятой и другие
устройства не должны пытаться управлять ею. Шина считается занятой до тех пор, пока
не будет сформировано состояние стопа. В середине передачи может быть сформировано
состояние повторного старта, если мастеру нужно обратиться к другому ведомому или
если требуется изменение направления передачи данных без потери контроля над шиной
(см. рисунок 17.3).
Рисунок 17.3 - Состояние повторного старта
Арбитраж
Арбитраж выполняется в момент времени, когда на линии SCL находится «1». Два
устройства могут сгенерировать стартовое состояние в одно и то же время. Далее
арбитраж будет продолжаться до тех пор, пока одно из устройств сформирует «0», а
другое - «1» на линии SDA. Устройство, которое установило «1» на линии SDA,
проигрывает арбитраж. На рисунке 17.4 приведен пример арбитража.
Рисунок 17.4 - Арбитраж на линии SDA
108
Два устройства передают свои данные DATA1 и DATA2 на линию SDA. В момент
времени, когда очередной бит данных DATA1 равен «1», а бит данных DATA2 равен «0»,
второе устройство выигрывает арбитраж и продолжает передачу своих данных, а первое
устройство прекращает передачу.
Если устройство проигрывает арбитраж во время передачи первого байта после
старта (во время передачи адреса ведомого), оно становится ведомым приемником и
мониторит передаваемый адрес на случай совпадения. Арбитраж также может быть
проигран в режиме мастера приемника во время квитирования или в режиме ведомого
передатчика во время ответа на адрес отклика на сигнал предупреждения.
В случае проигрывания арбитража в битовом поле MODE регистра ST
устанавливается соответствующий код и генерируется прерывание.
Синхронизация
Синхронизация тактовых сигналов разных устройств, подключенных к шине I2C,
реализуется в случаях, когда несколько устройств являются мастерами, и выполняется с
использованием той особенности, что линия SCL реализована как монтажное «И» линий
тактовых сигналов этих устройств. Для примера рассмотрим синхронизацию двух
мастеров с линиями тактовых сигналов CLK1 и CLK2 (см. рисунок 17.5).
Рисунок 17.5 - Синхронизация
Линия SCL переводится в состояние «0» сразу, как только один из мастеров
выставляет на своей линии тактового сигнала низкий уровень сигнала (CLK1 на
рисунке 17.5). При этом его внутренний счетчик длительности низкого уровня сигнала
сбрасывается и начинает отсчет. Второй мастер выставляет низкий уровень позже, и его
счетчик также сбрасывается (CLK2).
Как только внутренний счетчик первого мастера переполнится, мастер выставит на
линии CLK1 высокий уровень сигнала. Тем не менее, линия SCL будет по-прежнему
оставаться в состоянии «0», удерживаемая вторым мастером. В связи с этим, первый
мастер перейдет в состояние ожидания (см. рисунок 17.5). Когда переполнится счетчик
второго мастера, он выставит на линии CLK2 высокий уровень сигнала, и в этот момент
линия SCL перейдет в состояние «1». С этого момента внутренние счетчики длительности
высокого уровня сигнала обоих мастеров начнут синхронный отсчет.
Каждая передача данных состоит из начального состояния «старт», состояний
передач битов и состояния «стоп». Данные передаются старшим битом (MSB) вперед.
Передача каждого байта завершается квитированием, т. е. приемник подтверждает
окончание приема сигналом подтверждения (ACK). Ведомое устройство может
увеличивать паузу между тактовыми импульсами, удерживая на линии SCL сигнал
низкого уровня, пока происходит обработка принятых данных или подготовка данных для
следующей передачи. Этот процесс может происходить после передачи любого бита/байта
(см. рисунок 17.6).
109
Рисунок 17.6 - Передача данных
Квитирование
Каждый байт посылки должен быть завершен квитированием, т. е. ответом на прием
сигнала запроса подтверждения приема (ACK). На рисунках
17.6 и 17.7 показано
положение момента квитирования в пределах посылки.
Рисунок 17.7 - Квитирование и неквитирование бита подтверждения ACK
Бит запроса подтверждения приема генерируется мастером. Передатчик (мастер или
ведомый) в момент девятого такта синхросигнала оставляет линию SDA в состоянии «1»
(бит ACK). В свою очередь, приемник должен сбросить линию SDA в «0» в течение
времени, пока на линии SCL удерживается высокий уровень девятого импульса тактового
сигнала, т. е. квитировать прием (см. рисунок 17.7). Если приемник не отвечает на запрос
подтверждения и не подтверждает прием байта, то он оставляет линию SDA без
изменений в состоянии «1», т. е. не квитирует прием.
Примечание - Все устройства, подсоединенные к шине I2C, в обязательном
порядке должны квитировать бит ACK при получении байта с их собственным адресом.
Этот механизм используется для отслеживания наличия отключившихся (самостоятельно
или по каким-то причинам) от шины устройств.
Ведомое устройство имеет право не квитировать бит ACK в следующих случаях:
- если ведомый не может принять данные или он занят. Мастер, обнаружив
неквитирование байта, должен сгенерировать состояние стопа и прервать передачу. Как
альтернатива, ведомый может затянуть период низкого уровня сигнала тактирования на
линии SCL для завершения своих операций и продолжить передачу;
- если ведомый обнаружил некорректную команду или некорректные данные. В этом
случае, ведомый должен неквитировать принятый байт. Мастер, обнаружив
неквитирование байта, должен сгенерировать состояние стопа и повторить передачу;
- если мастер функционирует как приемник, то, приняв байт, он должен сообщить
ведомому об окончании данных неквитированием бита ACK, посланного ведомым. После
110
этого ведомый передатчик должен освободить линию SDA для того, чтобы мастер смог
сгенерировать состояние завершения передачи (состояние стопа).
Формат передачи данных с 7-битной адресацией
На рисунке 17.8 показана передача адреса и двух байт данных. Каждому устройству,
подключенному к шине, присваивается уникальный 7-битный адрес. Первые семь бит,
передаваемые после старта, представляют собой адрес ведомого, восьмой бит (R/W#)
определяет направление передачи - от ведомого (чтение, если R/W# = «1») или к
ведомому (запись, если R/W# = «0»).
Рисунок 17.8 - Передача данных с 7-битной адресацией
Каждый ведомый, получивший байт адреса, сравнивает его со своим собственным
адресом. Если адрес распознается как «свой», ведомый квитирует прием и далее, в
зависимости от состояния бита R/W#, становится передатчиком или приемником.
Протокол SMBus/I2C позволяет генерировать адрес общего вызова для
одновременного обращения ко всем устройствам, подключенным к шине. Первым
передается адрес общего вызова (00h), затем следует байт назначения общего вызова.
Ведомые, которые ожидают данные, квитируют этот байт и становятся приемниками,
остальные игнорируют общий вызов.
Протокол SMBus/I2C поддерживает уникальную функцию - распознавание адреса
отклика на сигнал предупреждения (Alert Response Address - ARA). В системах с
несколькими ведомыми каждое устройство может послать мастеру сигнал
предупреждения. Для этого используется дополнительная третья линия ALERT#,
физически идентичная линиям SDA и SCL, реализованная по принципу монтажное «И». К
этой линии также подключаются все устройства. Когда какому-то ведомому (или
нескольким ведомым) необходимо обратиться к мастеру, он (или они) выставляет на
линии ALERT# низкий уровень сигнала - это сигнал предупреждения (см. рисунок 17.9).
Рисунок 17.9 - Передача адреса отклика на сигнал предупреждения
Мастер, обнаружив «0» на линии ALERT#, обращается ко всем ведомым, посылая
адрес отклика на сигнал предупреждения (ARA). Адрес состоит из семи битов
(0001_100b) и бита R/W#
=
«1» (чтение). Ведомый, который отправил сигнал
предупреждения, получив ARA, квитирует его и затем отправляет свой 7-битный адрес
(восьмой бит может быть как «0», так и «1»), сообщая, таким образом, ведомому, какое
именно устройство посылало сигнал предупреждения. Кроме этого, ведомый, который
выставлял «0» на линии ALERT#, должен перестать удерживать линию, чтобы на ней
установился высокий уровень сигнала. В том случае, если несколько устройств посылали
111
сигнал предупреждения, то после получения ARA, свой адрес передает то устройство,
которое захватывает шину по стандартным правилам арбитража. Если после
обслуживания ведомого мастер все еще обнаруживает на линии ALERT# низкий уровень
сигнала, он понимает это как то, что сигнал предупреждения посылался несколькими
ведомыми. Мастер снова отправляет ARA и затем общается со следующим ведомым.
Появление на линии ALERT# высокого уровня сигнала означает, что все ведомые,
которые требовали обращения, обслужены.
Примечание - Описываемый в настоящем техническом описании модуль I2C не
имеет выделенной линии ALERT#. При необходимости, пользователь может
задействовать свободный вывод микроконтроллера и программно реализовать
возможность передачи сигнала предупреждения от ведомого к мастеру. В свою очередь,
функция распознавания адреса отклика (ARA) и последующей отправки собственного
адреса реализована полностью. Включить функцию можно установкой бита SMBARE в
регистре CTL0.
Формат передачи данных с 10-битной адресацией
10-битная адресация позволяет адресовать до
1 024 ведомых устройств с
использованием резервной комбинации 1111_0xxb, которая передается по линии SDA
сразу после старта. 10-битный формат полностью совместим с 7-битным форматом и
может использоваться одновременно с ним, что позволяет соединять по шине I2C
устройства с разной адресацией.
Основной идеей формата является передача 10-битного адреса в двух первых байтах,
следующих сразу после старта. В первом байте передается значение 1111_0ххb, где «хх» -
это два старших бита адреса и бит R/W# (на рисунке 17.10 обозначен символом «W» -
запись), который должен быть равен «0», чтобы ведомый понял, что в следующем байте
будут переданы остальные 8 бит адреса. Во втором байте передаются 8 бит адреса (см.
рисунок 17.10).
Рисунок 17.10 - Передача данных ведомому с 10-битным адресом (для расшифровки
обозначений, применяемых на рисунке, следует обратиться к таблице 17.1)
Чтобы осуществить чтение ведомого, которого адресует мастер после второго байта
адреса, следует отправить бит повторного старта и затем комбинацию 1111_0xxb и бит
R/W# (обозначен символом «R» - чтение), который на этот раз равен «1» (см. рисунок
17.11).
Рисунок 17.11 - Получение данных от ведомого с 10-битным адресом
На рисунках 17.10 и 17.11 биты посылки условно обозначены буквами S, W и др.
или состояния битов указаны непосредственно «0» или «1». В дальнейшем на подобных
рисунках, поясняющих содержимое посылки при передаче или приеме данных, будут
112
применяться такие же и другие обозначения. Все обозначения, которые будут
использоваться, указаны в таблице 17.1 с подробными пояснениями.
Таблица 17.1 - Условные обозначения, принятые на рисунках, показывающих содержимое
посылок данных или адресов на линии SDA
Обозначение
Расшифровка обозначения
S
Состояние старта. Символом «S» обозначается стартовый бит посылки
SR
Состояние повторного старта
R/W
Бит указания направления передачи. В тексте настоящего описания он
упоминается как R/W#. Наличие этого обозначения в бите посылки
указывает на то, что этот бит может быть равен как «0», так и «1»
R
Частный случай обозначения бита направления передачи R/W#. Если в
обозначении бита стоит символ «R», то это указывает на то, что в данной
посылке бит R/W# должен быть равен «1», т. е. направление передачи
данных происходит от ведомого к мастеру (чтение)
W
Частный случай обозначения бита направления передачи R/W#. Если в
обозначении бита стоит символ «W», то это указывает на то, что в данной
посылке бит R/W# должен быть равен «0», т. е. направление передачи
данных происходит от мастера к ведомому (запись)
A/A#
Бит квитированого/неквитированого приема, посылаемый приемником в
ответ на запрос передатчика подтвердить прием. Наличие этого
обозначения в бите посылки указывает на то, что этот бит может быть
равен как «0», так и «1»
A
Частный случай обозначения бита A/A#. Если в обозначении бита стоит
символ «А», то это указывает на то, что в данной посылке в ответ на
запрос подтверждения приема байта произошло квитирование, т. е.
приемник установил линию SDA в «0». В тексте настоящего описания
квитированный бит запроса подтверждения приема обозначается как
ACK
A#
Частный случай обозначения бита A/A#. Если в обозначении бита стоит
символ «А#», то это указывает на то, что в данной посылке в ответ на
запрос подтверждения приема байта произошло неквитирование, т. е.
приемник не изменил линию SDA и оставил ее в состоянии «1». В тексте
настоящего описания, неквитированный бит запроса подтверждения
приема обозначается как NACK
P
Состояние окончания передачи. Символом «P» обозначается стоповый
бит посылки
Код мастера
8-битный код мастера. Значение 0000_1хххb, где «ххх» - уникальный код
каждого мастера в системе нескольких устройств
Адрес
7-битный адрес ведомого, передаваемый мастером
Адрес
Адрес ведомого, передаваемый во втором байте посылки. В режиме HS
ведомого
это 7-битный адрес, на что указывает идущий следом бит R/W#, в
остальных случаях это восемь младших бит 10-битного адреса
Данные
Байт или несколько байт данных
GC
Байт адреса общего вызова (0000_0000b)
AR
Адрес отклика (0001_100b)
Изображение числа в овале с линией, прикрепляющей его к изображению
передачи битов, обозначает код операции и указывает момент, в который
этот код записывается в поле MODE регистра ST
Цветное поле
Серым цветом обозначены биты, передаваемые от мастера к ведомому
Белое поле
Белым цветом обозначены биты, передаваемые от ведомого к мастеру
113
17.2 Функциональное описание
Структурная схема модуля I2C представлена на рисунке 17.12. Далее приводится
краткое описание назначения блоков модуля.
Рисунок 17.12 - Структурная схема модуля I2C
Входные и выходные каскады линий SDA и SCL
Для обеих линий используются входные шумовые фильтры. В режиме FS эти
фильтры подавляют любые импульсы входного сигнала, длительность которых не
превышает один такт системного синхросигнала. Выходные каскады включают в себя
понижающие (до уровня «0») устройства с открытым стоком. Функционирование входных
и выходных каскадов зависит от состояния модуля I2C, т. е. включен или выключен.
Управление режимом работы и опрос состояния
Управление модулем осуществляют блоки управления режимом работы и скоростью
передачи, регистров управления и состояния. В состав этих блоков входят следующие
регистры:
- ST - содержит биты, отражающие текущую конфигурацию модуля I2C (мастер или
ведомый, передатчик или приемник) и бит флага прерывания;
- CST - является одновременно регистром управления шиной и регистром состояния
шины;
- CTL0 - управляет генерированием состояний старта, повторного старта и останова,
а также квитированием;
- CTL1 и CTL2 - устанавливают параметры тактового сигнала в режиме мастера и
контролируют режим 10-битной адресации.
114
Регистры адреса и компаратор адреса
В регистр адреса ADDR может быть записан 7-битный адрес, который является
адресом устройства при работе его в режиме ведомого. Распознавание адреса включается
установкой бита SAEN.
Компаратор адреса сравнивает принятый 7-битный адрес со значением, хранящимся
в поле ADDR. Если разрешено распознавание адреса общего вызова (установлен бит
GCMEN регистра CTL0), то компаратор сравнивает принятый адрес со значением
0000_000b. Если разрешено распознавание адреса отклика на сигнал предупреждения
(установлен бит SMBARE регистра CTL0), то компаратор сравнивает принятый адрес со
значением 0001_100b.
Если включен режим 10-битной адресации (одновременно установлены биты SAEN
и S10EN регистров ADDR и CTL2, соответственно), компаратор сравнивает старшие пять
битов первого полученного байта со значением 1111_0b, а следующие два бита - со
значением второго и первого битов поля S10ADR регистра CTL2. Старший бит второго
полученного байта сравнивается со значением нулевого бита поля S10ADR, а оставшиеся
семь битов - со значением битового поля ADDR регистра ADDR (см. рисунок 17.13).
Рисунок 17.13 - Компаратор адреса в режиме 10-битной адресации
Сдвиговый регистр данных
Регистр SDA представляет собой сдвиговый регистр, используемый для приема и
передачи данных. Старший бит регистра передается/принимается первым, младший бит -
последним. Запись в регистр SDA возможна только, если установлен бит INT регистра ST.
Регистр может быть прочитан в любой момент времени, но прочитанные данные будут
гарантированно достоверными только при установленном бите INT. Регистр SDA не
очищается при сбросе и хранит случайные данные до тех пор, пока не будет перезаписан
программно или аппаратно после приема байта.
Генерация тактового сигнала и синхронизация
Последовательный тактовый сигнал (выходной сигнал модуля I2C в режиме
мастера) формируется генератором на базе системного тактового сигнала (с частотой
Fpclk).
Модуль I2C может функционировать в двух глобальных режимах
-
стандартном/скоростном (FS) и высокоскоростном (HS).
В режиме FS используется 15-битный предделитель. Значение младших 6 бит
определяется значением битового поля SCLFRQ регистра CTL1, а нулевой бит всегда
равен нулю (деление производится только на четное число). Значение старших 8 бит
задается полем SCLFRQ регистра CTL3. Блок синхронизации тактового сигнала
производит синхронизацию генератора тактового сигнала и выходного сигнала SCL с
тактовым сигналом других устройств, подключенных к шине.
В режиме HS используется 12-битный предделитель. Значение младших 4 бит
определяется значением битового поля HSDIV регистра CTL2, нулевой бит при этом бит
всегда равен нулю. Значение старших 8 бит задается полем HSDIV регистра CTL4.
115
Определяемое спецификацией протокола SMBus наименьшее время ожидания на
линии SCL составляет 25 мс. Если пауза между двумя тактовыми импульсами превысила
25 мс, то устройство должно прервать текущую передачу. Мастер должен сформировать
состояние старта в процессе передачи или после ее окончания. Ведомый должен
освободить шину. Устройства, обнаружившие данное состояние, должны восстановить
свои соединения и ожидать формирования состояния старта в пределах 10 мс.
Для отслеживания периодов ожиданий на шине в модуле I2C имеется счетчик
времени ожидания. Функциональная схема счетчика показана на рисунке 17.14.
Рисунок 17.14 - Функциональная схема счетчика времени ожидания
Счетчик времени ожидания состоит из делителя, 8-битного программируемого
предделителя и 8-битного основного счетчика. Все элементы счетчика времени ожидания
начинают работу по отрицательному фронту сигнала на линии SCL (если работа счетчика
разрешена). Положительный фронт сигнала на линии SCL сбрасывает значения делителя,
предделителя и основного счетчика. Предделитель считает вниз, начиная со значения,
записанного в регистр TOPR. После достижения нуля счетчиком предделителя, он
загружается значением из регистра TOPR. Основной счетчик считает вниз от значения
FFh. Каждое достижение нуля предделителем декрементирует значение основного
счетчика. Обнуление основного счетчика и загрузка его значением FFh вызывает
остановку основного счетчика, предделителя и делителя и установку флага TOERR в
регистре CST. Дополнительно устанавливается флаг INT и если разрешено, генерируется
прерывание.
Период времени ожидания определяется следующим выражением
Тожид = Tpclk × TOCDIV × (SMBTOPR + 1) × 256 ,
(17.1)
где Tpclk - период системного тактового сигнала с частотой Fpclk.
Арбитраж и обнаружение ошибок на шине
Арбитраж в режиме мастера передатчика может быть потерян в случае, когда два
мастера одновременно формируют состояние старта и начинают передачу данных. Потеря
арбитража может происходить как во время передачи адреса, так и во время передачи
данных.
В случае потери приоритета при передаче байта адреса, мастер переходит в режим
ведомого приемника и начинает принимать адрес. Если принятый адрес оказался «своим»,
модуль I2C далее функционирует в режиме ведомого. Если принятый адрес не оказался
«своим», то модуль I2C переходит в режим безадресного ведомого.
В случае потери приоритета при передаче байта данных модуль I2C сразу переходит
в режим безадресного ведомого.
116
Обнаружение и исправление ошибок на шине
Состояние ошибки на шине возникает в том случае, если во время передачи
адреса/данных или во время квитирования на шине обнаруживаются состояния старта или
стопа. При обнаружении ошибки на шине выполняются действия:
- в поле MODE регистра ST записывается код ошибки 1Fh;
- генерируется прерывание (если разрешено);
- модуль I2C переходит в режим безадресного ведомого;
- линии SDA и SCL освобождаются.
Обнаружение ошибки на шине может вызвать у простой шины некорректное
формирование состояния старта и отключение модуля I2C. Поэтому для возврата к
нормальной работе следует выполнить действия:
- выключить и снова включить модуль I2C (бит ENABLE в регистре CTL1);
- в течение времени простоя проверить, не подключен ли другой активный мастер к
шине (бит BB регистра CST должен быть обнулен);
- в режиме мастера шины сформировать состояние старта, передать адрес и затем
сформировать состояние останова, таким образом, проведя синхронизацию всех ведомых
устройств (в том числе и тех, которые не обнаружили ошибку на шине).
Режим IDLE
Переход в режим IDLE происходит при отключении внешнего сигнала тактирования
модуля I2C записью нуля в бит I2CEN регистра APB_CLK. Переход в режим IDLE
подобен программному выключению модуля I2C (очистка бита ENABLE в регистре
CTL1). Регистры CTL0, ST и CST очищаются, чтобы гарантировать нормальный старт
после возобновления функционирования модуля.
Выход из режима IDLE осуществляется записью единицы в бит I2CEN и
включением модуля битом ENABLE.
17.3 Инициализация и функционирование
В целом модуль I2C поддерживает два базовых режима - режим FS и режим HS.
Стандартный/скоростной режим или режим FS - стандартный режим работы, в
котором модуль функционирует по умолчанию. Диапазон частот сигнала на линии SCL -
от 763 Гц до 6.25 МГц (при Fpclk = 100 МГц).
Высокоскоростной режим или режим HS - режим работы, который включается
программно. Режим HS значительно превосходит режим FS по скорости - диапазон частот
сигнала на линии SCL от 8.14кГц до 16.67 МГц (при Fpclk = 100 МГц).
Все операции режима HS начинаются в режиме FS в следующем порядке:
- стартовое состояние;
- 8-битный код мастера (значение 0000_1хххb, где «ххх» - уникальный код каждого
мастера в системе нескольких устройств);
- неквитирование.
Арбитраж на шине происходит в момент передачи несколькими мастерами своих
уникальных кодов. Выигравший арбитраж мастер захватывает шину. В связи с такой
организацией режима HS дальнейший арбитраж и синхронизация на шине не
реализуются.
После выполнения вышеуказанных шагов устройства, поддерживающие режим HS,
переключаются в этот режим. Мастер генерирует состояние повторного старта (SR), а
затем передает адрес ведомого и бит направления передачи R/W# (см. рисунок 17.15.
Расшифровка обозначений, принятых на рисунке, приведена в таблице 17.1).
117
Все передачи в режиме HS по формату идентичны передачам режима FS, что делает
эти два режима полностью совместимыми.
Рисунок 17.15 - Переход в режим HS и обратно в режим FS
Выход из режима HS происходит генерированием состояния окончания передачи
(P), после которого все устройства переключаются обратно в режим FS. В каждом из двух
базовых режимов - FS и HS - модуль I2C может функционировать как мастер или
ведомый, получать или передавать информацию.
Далее все режимы работы модуля I2C будут рассмотрены подробно.
Инициализация
Для начала работы следует произвести инициализацию:
1 Включить модуль I2C установкой бита ENABLE в регистре CTL1.
2 Если активен режим мастера, записать нужный коэффициент деления в битовое
поле SCLFRQ (регистры CTL1, CTL3) для выбора периода тактового сигнала SCL (для
режима HS записать коэффициент деления в поле HSDIV регистров CTL2, CTL4).
3 Если активен режим ведомого, необходимо:
- записать «собственный» адрес ведомого в битовое поле ADDR и установить бит
SAEN регистра ADDR;
- для реализации 10-битной адресации записать старшие биты адреса в битовое поле
S10AD и установить бит S10EN регистра CTL2;
- для включения функции распознавания адреса общего вызова установить бит
GCMEN в регистре CTL0;
- для включения функции распознавания адреса отклика установить бит SMBARE в
регистре CTL0.
4 При необходимости отслеживания периодов ожидания на шине записать желаемые
значения в регистр TOPR и в битовое поле TOCDIV (регистр CST) для отсчета времени
ожидания на линии SCL. Для автоматического отслеживания времени ожидания записать
ненулевое значение в битовое поле TOCDIV регистра CST.
5 Для разрешения формирования запроса на прерывание установить бит INTEN в
регистре CTL0.
Функционирование
Модуль I2C может работать в режиме мастера или ведомого. Также он может
функционировать как передатчик или приемник. Итого, модуль I2C поддерживает девять
режимов:
- безадресный ведомый;
- мастер передатчик в режиме FS;
- мастер передатчик в режиме HS;
- мастер приемник в режиме FS;
- мастер приемник в режиме HS;
- ведомый передатчик в режиме FS;
- ведомый передатчик в режиме HS;
- ведомый приемник в режиме FS;
- ведомый приемник в режиме HS.
118
Передача информации по шине состоит из последовательности различных действий
(начало передачи, прием данных и др.). Каждое действие называется состоянием
(состояние старта, состояние останова и др.). После того, как то или иное состояние
сформировано, его код аппаратно записывается в регистр ST в битовое поле MODE и
может быть прочитано программно. В таблицах 17.2 и 17.3 приводятся все возможные
состояния, их мнемонические обозначения и коды. На квитирование или неквитирование
приема указывает запись «ACK» или «NACK», соответственно. Так, например, если
мастер отправил байт адреса ведомому, который после получения квитировал прием, то
на это будет указывать «ACK», а в поле MODE регистра ST будет записан код 04h,
соответствующий состоянию с мнемоническим обозначением «MTADPA». Более
подробно каждый режим работы модуля I2C будет рассмотрен далее. На рисунках 17.16 -
17.23, поясняющих работу модуля в том или ином режиме, приняты обозначения,
расшифровка которых приводится в таблице 17.1. Для получения дополнительной
информации и понимания работы модуля I2C можно воспользоваться приложением Б.
Таблица 17.2 - Коды функционирования модуля I2C в режиме FS
Описание состояния на момент записи
ACK/
Режим
Код
Мнемоника
кода в поле MODE регистра ST
NACK
IDLE, нет доступной валидной
Общий
00h
IDLE
-
информации о статусе
01h
STDONE
Сформировано состояние старта
-
Сформировано состояние повторного
02h
RSDONE
-
старта
Потеря арбитража, переход в режим
03h
IDLARL
-
безадресного ведомого
Мастер
04h
MTADPA
Отправлен адрес ведомого
ACK
в
05h
MTADNA
Отправлен адрес ведомого
NACK
Передача
режиме
06h
MTDAPA
Отправлен байт данных
ACK
FS
07h
MTDANA
Отправлен байт данных
NACK
08h
MRADPA
Отправлен адрес ведомого
ACK
09h
MRADNA
Отправлен адрес ведомого
NACK
Прием
0Ah
MRDAPA
Принят байт данных
ACK
0Bh
MRDANA
Принят байт данных
NACK
0Сh
MTMCER
Отправлен код мастера, обнаружена ошибка
ACK
0Dh - 0Fh
Зарезервировано. Не использовать!
-
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
FS
Принят адрес отклика на
19h
SATAAP
ACK
Передача
предупреждение после потери арбитража
адреса
Отправлены данные в ответ на получение
1Ah
SATDAP
ACK
отклика
адреса отклика
Отправлены данные в ответ на получение
1Bh
SATDAN
NACK
адреса отклика
119
Окончание таблицы 17.2
Описание состояния на момент записи
ACK/
Режим
Код
Мнемоника
кода в поле MODE регистра ST
NACK
Обнаружено состояние останова
Ведомый
1Сh
SSTOP
-
ведомого
в
-
1Dh
SGADPA
Принят адрес общего вызова
ACK
режиме
Принят адрес общего вызова после
FS
1Eh
SDAAPA
ACK
потери арбитража
Обнаружена ошибка на шине
Общий
1Fh
BERROR
(некорректное состояние старта или
-
останова)
Примечание - Диапазон значений кодов 0Dh-0Fh зарезервирован и не доступен
для использования. Дополнительная информация находится в приложении Б.
Таблица 17.3 - Коды функционирования модуля I2C в режиме HS
Описание состояния на момент записи
ACK/
Режим
Код
Мнемоника
кода в поле MODE регистра ST
NACK
Код мастера передан успешно,
21h
HMTMCOK
-
переход в режим HS
22h
Сформировано состояние повторного
HRSDONE
-
старта
23h
Потеря арбитража, переход в режим HS
HIDLARL
-
Мастер
безадресного ведомого
в
24h
HMTADPA
Отправлен адрес ведомого
ACK
режиме
25h
HMTADNA
Отправлен адрес ведомого
NACK
Передача
HS
26h
HMTDAPA
Отправлен байт данных
ACK
27h
HMTDANA
Отправлен байт данных
NACK
28h
HMRADPA
Отправлен адрес ведомого
ACK
29h
HMRADNA
Отправлен адрес ведомого
NACK
Прием
2Ah
HMRDAPA
Принят байт данных
ACK
2Bh
HMRDANA
Принят байт данных
NACK
30h
HSRADPA
Принят адрес
ACK
Ведомый
Прием
32h
HSRDAPA
Принят байт данных
ACK
в
33h
HSRDANA
Принят байт данных
NACK
режиме
34h
HSTADPA
Принят адрес
ACK
HS
Передача
36h
HSTDAPA
Отправлен байт данных
ACK
37h
HSTDANA
Отправлен байт данных
NACK
Примечание - Диапазоны значений кодов 2Ch-2Fh и 38h-3Fh, а также коды 20h,
31h, 35h зарезервированы и недоступны для использования. Дополнительная информация
находится в приложении Б.
Режим безадресного ведомого
Режим работы по умолчанию (MODE = 00h). После включения модуль I2C начинает
функционировать в режиме безадресного ведомого и непрерывно мониторит шину. При
обнаружении состояния старта или повторного старта переходит в режим ведомого
приемника. Для перехода в режим мастера передатчика нужно сформировать корректное
состояние старта.
Переключение в режим безадресного ведомого происходит в случаях:
- стартовое состояние не было успешно сформировано, так как другое устройство
удерживало на линии SCL низкий уровень сигнала;
120
- произошла потеря арбитража во время передачи байта данных в режиме мастера
передатчика или во время передачи бита 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 переходит в режим мастера приемника.
121
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 представлено графическое пояснение к описанию режима.
122
Рисунок 17.16 - Режим FS мастера передатчика
Рисунок 17.17 - Режим HS мастера передатчика
123
Режим 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 представлено графическое пояснение к описанию режима.
124
Рисунок 17.18 - Режим FS мастера приемника
Рисунок 17.19 - Режим HS мастера приемника
125
Режим 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
освободит шину.
Дополнительно можно обратиться к приложению Б.
126

 

 

 

 

 

 

 

содержание      ..      1      2      3      ..