Периферийный интерфейс USART, режим I2C
Универсальный синхронно/асинхронный приемопередающий (USART) периферийный интерфейс поддерживает связь по I2C в модулях USART0 устройств MSP430x15x и MSP430x16x. Этот раздел описывает режим I2C.
15.1 Введение в модуль I2C
Модуль управления взаимообменом между интегральными схемами (I2C) обеспечивает интерфейс между MSP430 и I2C-совместимыми устройствами через последовательную двухпроводную шину I2C. Внешние компоненты, подключенные к шине I2C последовательно передают и принимают последовательные данные в/из USART через 2-х проводной I2C-интерфейс.
Модуль I2C имеет следующие возможности:
- Соответствует спецификации I2C v2.1 Philips Semiconductor
- Побитный/побайтный формат передачи
- 7-разрядный и 10-разрядный режимы адресации устройств
- Общий вызов
- Старт/рестарт/стоп
- Режим приемника передатчик/ведущий со многими ведущими
- Режим передатчика приемник/ведомый со многими ведущими
- Комбинированный режим ведущего передача/прием и прием/передача
- Поддерживаются стандартный режим до 100 кбод и быстрый режим до 400 кбод
- Встроенный FIFO для буферирования чтения и записи
- Программируемая генерация тактовых импульсов
- 16-разрядный доступ к данным для увеличения пропускной способности шины
- Разработан с учетом пониженного энергопотребления
- Два триггера DMA
- Расширенные возможности прерываний
- Реализован только в USART0
На рис.15-1 показана блок-схема модуля I2C.
Рис.15-1. Блок-схема USART: режим I2C
15.2 Функционирование модуля I2C
Модуль I2C поддерживает любые ведущие и ведомые устройства, совместимые с I2C. На рис.15-2 показан пример шины I2C. Каждое устройство обладает уникальным адресом и может работать и как передатчик и как приемник. Устройство, подключенное к шине I2C, во время передачи данных может рассматриваться как ведущее или ведомое. Ведущий инициирует передачу данных и генерирует тактовый сигнал SCL. Любое устройство, адресованное ведущим, рассматривается как ведомое.
Рис.15-2. Схема подключений на шине I2C
При обмене данными на I2C используется вывод последовательных данных (SDA) и вывод последовательного тактирования (SCK). Оба вывода SDA и SCL являются двунаправленными и должны подключаться к положительному источнику напряжения через нагрузочные («подтягивающие») резисторы.
Примечание: Уровни SDA и SCL
Уровни напряжения на выводах SDA и SCL не должны быть выше уровня VCC микроконтроллера MSP430.
|
15.2.1 Последовательные данные I2C
При передаче каждого бита ведущим устройством генерируется один тактовый импульс. Модуль I2C работает с данными, организованными побайтно. Сначала перемещается старший значащий разряд, как показано на рис.15-3.
Первый, после условия «СТАРТ», байт состоит из 7-разрядного адреса ведомого и бита R/nonW. Когда R/nonW=0, ведущий передает данные ведомому. Когда R/nonW=1, ведущее устройство принимает данные от ведомого. Бит ACK посылается приемником после каждого байта на 9-ом такте SCL.
Рис.15-3. Передача данных модулем I2C
Данные на SDA должны быть неизменны в течение периода высокого уровня SCL, как показано на рис.15-4. Высокий и низкий уровень SDA может изменяться, только когда SCL имеет низкий уровень, в противном случае будет сгенерировано условие «старт» или «стоп».
Рис.15-4. Передача бита на шине I2C
15.2.2 Условия «СТАРТ» и «СТОП» I2C
Условия «СТАРТ» и «СТОП», показанные на рис.15-5, генерируются ведущим. Условие «СТАРТ» возникает при переходе с высокого уровня на низкий на линии SDA, когда SCL имеет высокий уровень. Условие «СТОП» появляется при переходе с низкого уровня на высокий на линии SDA при высоком уровне на SCL. Бит занятости I2CBB устанавливается после условия «СТАРТ» и сбрасывается после «СТОП».
Рис.15-5. Условия «СТАРТ» и «СТОП» модуля I2C
15.2.3 Режимы адресации I2C
Модуль I2C поддерживает 7-разрядный и 10-разрядный режимы адресации.
7-разрядная адресация
В 7-разрядном формате адресации, показанном на рис.15-6, первый байт – это 7-разрядный адрес ведомого и бит R/nonW. Бит ACK посылается приемником после каждого байта.
Рис.15-6. 7-разрядный формат модуля I2C
10-разрядная адресация
В 10-разрядном адресном формате, показанном на рис.15-7, первый байт содержит 11110b плюс два старших бита 10-разрядного адреса ведомого и бит R/nonW. Бит ACK посылается приемником после каждого байта. Следующий байт содержит оставшиеся 8 бит 10-разрядного адреса ведомого, завершающиеся битом ACK и 8-разрядными данными.
Рис.15-7. 10-разрядный адресный формат модуля I2C
Повторные условия «СТАРТ»
Направление потока данных на SDA может быть изменено ведущим без первоначального останова передачи, что приведет к повторению условия «СТАРТ». Это вызовет «РЕСТАРТ». После выполнения «РЕСТАРТА» адрес ведомого отправляется снова, но уже с новым направлением данных, заданным битом R/nonW. Условие «РЕСТАРТ» показано на рис.15-8.
Рис.15-8. Формат адресации модуля I2C с повторным условием «СТАРТ»
15.2.4 Режимы работы модуля I2C
Модуль I2C работает в режимах «ведущий передатчик», «ведущий приемник», «ведомый передатчик» или «ведомый приемник».
Режим ведущего
В режиме ведущего выполнение передачи и приема управляется с помощью битов I2CRM, I2CSTT и I2CSTP, как описано в таблице 15-1. Режим ведущего приемника вводится установкой I2CTRX=0 после передачи адресного байта ведомого и установленного бита R/nonW. Режимы ведущего передатчика и ведущего приемника показаны на рис.15-9 и рис.15-10.
SCL удерживается в низком состоянии, когда необходимо вмешательство ЦПУ после передачи байта.
Таблица 15-1. Функционирование ведущего
I2CRM |
I2CSTP |
I2CSTT |
Условие или активность шины |
X |
0 |
0 |
Модуль I2C в режиме ведущего, но свободен. Условия «старт» и «стоп» не генерируются. |
0 |
0 |
1 |
Активность инициируется установкой I2CSTT. I2CNDAT используется для установки длины передачи. Условие «стоп» автоматически не генерируется после перемещения байт, количество которых задано в I2CNDAT. Программное обеспечение должно установить I2CSTP для генерации условия «стоп» в конце передачи. |
0 |
1 |
1 |
I2CNDAT используется для установки длины передачи. Установкой I2CSTT инициируется активность. Условие «стоп» автоматически генерируется после передачи байт, количество которых задано I2CNDAT. |
1 |
0 |
1 |
I2CNDAT не используется для установки длины передачи. Длиной передачи должно управлять программное обеспечение. Установка бита I2CSTT инициирует активность. Для инициирования условия «стоп» или останова активности программное обеспечение должно установить бит I2CSTP. Этот режим используется, если необходимо передать более 256 байт. |
0 |
1 |
0 |
Установка бита I2CSTP генерирует условие «стоп» на шине после отправки количества байт, заданного I2CNDAT или немедленно, если уже передано количество байт, заданное I2CNDAT. |
1 |
1 |
0 |
Установка бита I2CSTP генерирует условие «стоп» на шине после завершения текущей передачи или немедленно, если текущая передача не активна. |
1 |
1 |
1 |
Зарезервировано, шина неактивна. |
Диаграмма состояний I2C
Рис.15-9. Режим ведущего передатчика, I2CWORD = 1
Рис.15-10. Режим ведущего приемника, I2CWORD = 1
Арбитраж
Если два или более передатчиков одновременно начинают передачу на шине, запускается процедура арбитража. На рис.15-11 поясняется процедура арбитража между двумя устройствами. Процедура арбитража использует данные, представленные на SDA конкурирующими передатчиками. Первый ведущий передатчик, генерирующий логическую единицу, отвергается противостоящим ведущим, генерирующим логический сигнал низкого уровня. Процедура арбитража дает приоритет устройству, которое передает поток последовательных данных с наименьшим двоичным значением. Ведущий передатчик, потерявший арбитраж, переключается в режим ведомого приемника и устанавливает флаг потери арбитража ALIFG. Если два или более устройства посылают одинаковые первые байты, арбитраж продолжается на последующих байтах.
Рис.15-11. Процедура арбитража между двумя ведущими передатчиками
Если выполняется процедура арбитража, когда на SDA повторяются условия «СТАРТ» или «СТОП», ведущие передатчики, вовлеченные в арбитраж, должны послать повторные условия «СТАРТ» или «СТОП» в том же самом месте в формате фрэйма. Арбитраж не разрешается между:
- Повторным условием «СТАРТ» и битом данных
- Условием «СТОП» и битом данных
- Повторным условием «СТАРТ» и условием «СТОП»
Режим ведомого
В режиме ведомого операции передачи и приема управляются автоматически модулем I2C. Режимы ведомого передатчика и ведомого приемника показаны на рис.15-12 и рис.15-13.
В режиме ведомого приемника биты последовательных данных принимаются на SDA и сдвигаются по тактовым импульсам, генерируемым ведущим устройством. Ведомое устройство не генерирует тактовый сигнал, но может удерживать линию SCL в состоянии низкого уровня, если после приема байта необходимо вмешательство ЦПУ.
В режим ведомого передатчика можно войти только из режима ведомого приемника. Вход в режим ведомого передатчика происходит, если байт адреса ведомого, переданный ведущим, является таким же адресом, как и его собственный и был послан установленный бит R/W, указывая на запрос отправки данных ведущему. Ведомый передатчик сдвигает последовательные данные из устройства на SDA по импульсам тактирования, генерируемым ведущим устройством. Ведомое устройство не генерирует тактовых сигналов, но может удерживать линию SCL в состоянии низкого уровня, если после передачи байта необходимо вмешательство ЦПУ.
Рис.15-12. Ведомый передатчик, I2CWORD=1
Рис.15-13. Ведомый приемник, I2CWORD=1
15.2.5 Регистр данных I2CDR шины I2C
Регистр I2CDR может быть доступен как 8-разрядный или 16-разрядный регистр, что определяется битом I2CWORD. Функции регистра I2CDR описаны в таблице 15-2.
Таблица 15-2. Функции регистра I2CDR
I2CWORD |
I2CTRX |
Функция I2CDR |
0 |
1 |
Режим передачи байта: Используется только младший байт. Байт дважды буферизируется. Если новый байт записан до передачи предыдущего байта, новый байт ожидает во временном буфере до момента защелкивания в младшем байте регистра I2CDR. Когда I2CDR доступен, устанавливается бит TXRDYIFG. |
0 |
0 |
Режим приема байта: Используется только младший байт. Байт дважды буферизируется. Если новый байт принят до прочтения предыдущего байта, новый байт ожидает во временном буфере до момента защелкивания в младшем байте регистра I2CDR. Когда I2CDR готов для чтения, устанавливается бит RXRDYIFG. |
1 |
1 |
Режим передачи слова: Первым передается младший байт слова, затем старший байт. Регистр дважды буферизируется. Если новое слово записано до передачи предыдущего слова, новое слово ожидает во временном буфере до момента защелкивания в регистре I2CDR. Когда I2CDR доступен, устанавливается бит TXRDYIFG. Если последние передаваемые данные состоят только из одного байта, старший байт должен содержать нуль. Когда I2CDR готов к доступу, устанавливается бит TXRDYIFG. |
1 |
0 |
Режим приема слова: Первым принимается младший байт слова, затем старший байт. Регистр дважды буферизируется. Если новое слово принято до прочтения предыдущего слова, новое слово ожидает во временном буфере до момента защелкивания в регистре I2CDR. Если последним был принят один байт, тогда старший байт содержит нуль, устанавливается бит I2CSDB. Когда I2CDR готов к доступу, устанавливается бит RXRDYIFG. |
Опустошение при передаче
В режиме ведущего опустошение происходит, когда сдвиговый регистр передачи и буфер передачи пусты, а I2CNDAT > 0. В режиме ведомого опустошение происходит, когда сдвиговый регистр передачи и буфер передачи пусты, а внешний ведущий I2C все еще запрашивает данные. Когда происходит опустошение при передаче, устанавливается бит I2CTXUDF. Запись данных в регистр I2CDR или сброс бита I2CEN сбрасывает I2CTXUDF. I2CTXUDF используется только в режиме передачи.
Переполнение при приеме
Переполнение при приеме происходит, когда сдвиговый регистр приема и буфер приема заполнены. Когда происходит переполнение при приеме, устанавливается бит I2CRXOVR. Потери данных не происходит, поскольку в этом случае линия SCL удерживается в состоянии низкого уровня, которое приостанавливает дальнейшую активность на шине. Чтение регистра I2CDR или сброс бита I2CEN сбрасывает бит I2CRXOVR. Бит I2CRXOVR используется только в режиме приема.
15.2.6 Генерация тактовых сигналов I2C и синхронизация
Модуль I2C работает с источником тактовой частоты, выбираемым битами I2CSSELx. Прескалер I2CPSC и регистры I2CSCLH и I2CSCLL определяют частоту и скважность тактового сигнала SCL для режима ведомого, как показано на рис.15-14. Источник тактовых импульсов для модуля I2C должен иметь частоту, по крайней мере в 10 раз больше частоты SCL в обоих режимах ведущего и ведомого.
Рис.15-14. Генерация сигналов на линии SCL модуля I2C
Во время процедуры арбитража тактовые импульсы от различных ведущих должны быть синхронизированы. Устройство, первым генерирующее период низкого уровня на SCL берет верх над другими устройствами, вынуждая их запустить собственные периоды низкого уровня. Тогда SCL удерживается в состоянии низкого уровня устройством с самым долгим периодом низкого уровня. Другие устройства должны ожидать, пока линия SCL будет освобождена перед стартом своих периодов высокого уровня. Рис. 15-15 иллюстрирует тактовую синхронизацию.
Медленный ведомый может установить на SCL низкий уровень, чтобы замедлить быстрого ведомого. Когда это происходит, все другие устройства должны войти в состояние ожидания. Это позволяет медленному ведомому замедлять быстрого ведущего.
Рис.15-15. Синхронизация двух тактовых генераторов I2C во время арбитража
15.2.7 Использование модуля I2C в режимах пониженного энергопотребления
Модуль I2C может использоваться в MSP430 в режимах пониженного энергопотребления. Когда для модуля I2C задействован внутренний источник тактирования, модуль работает нормально независимо от режима работы MSP430.
В режиме ведомого, а также когда внутренний источник тактирования не задействован, модуль I2C может автоматически обнаруживать стартовый бит для пробуждения ЦПУ. Для включения этой возможности необходимо установить биты STTIE и GIE, чтобы флаг STTIFG мог вызвать прерывание ЦПУ. Когда модуль I2C обнаруживает стартовое условие, устанавливается флаг STTIFG, а линия SCL удерживается модулем в состоянии низкого уровня, останавливая дальнейшую активность на шине. Процедура обработки прерывания должна включить внутренний источник тактирования для модуля I2C, чтобы освободить линию SCL и дать возможность продолжить нормальную работу на шине.
15.2.8 Использование модуля I2C с контроллером DMA
Модуль I2C обеспечивает два источника запуска для контроллера DMA. Флаг RXRDYIFG может запустить DMA перенос, когда получены новые данные I2C, флаг TXRDYIFG может запустить DMA перенос, когда модуль I2C нуждается в очередной передаче данных.
Биты TXDMAEN и RXDMAEN разрешают или запрещают использование контроллера DMA с модулем I2C. Когда RXDMAEN=1, контроллер DMA может использоваться для переноса данных из модуля I2C после приема данных модулем I2C. Когда RXDMAEN=1, RXDYIE автоматически очищается.
Когда TXDMAEN=1, контроллер DMA может быть использован для переноса данных в модуль I2C для последующей передачи. Когда TXDMAEN=1, TXRDYIE автоматически очищается.
См. раздел «Контроллер DMA» для выяснения подробностей функционирования контроллера DMA.
15.2.9 Конфигурирование USART для функционирования I2C
Контроллер I2C является частью периферии USART. Определение индивидуального бита при использовании USART0 в режиме I2C отличается от режимов SPI или UART. По умолчанию в регистре U0CTL значения для режима UART и он содержит следующие биты:
Для работы в режимах SPI или I2C необходимо установить бит SYNC. Установка бита SYNC при SWRST=1 выбирает режим SPI. Установка бита I2C, когда SYNC=1 приводит к выбору режима I2C. Биты SYNC и I2C могут быть установлены вместе в одной команде для выбора режима I2C в модуле USART0.
После инициализации модуля, модуль I2C готов для выполнения операций передачи и приема. Очистка I2CEN прекращает работу модуля.
Примечание: Переконфигурирование модуля I2C для работы UART или SPI
Необходим следующий процесс переконфигурирования USART:
- Очистка бита I2C (BIC.B #I2C,&U0CTL)
- Очистка U0CTL и установка бита SWRST (MOV.B #SWRST,&U0CTL)
- Инициализация всех регистров USART установкой SWRST = 1 (включая UxCTL)
- Включение модуля USART с помощью MEx SFRs (URXEx и/или UTXEx)
- Очистка SWRST программным обеспечением (BIC.B #SWRST,&UxCTL)
- Разрешение прерываний (если необходимо) с помощью IEx SFRs (URXIEx и/или UTXIEx)
Нарушение выполнения этого процесса может привести к непредсказуемому поведению USART.
|
Примечание: Переконфигурирование модуля I2C для других условий I2C
Необходим следующий процесс переконфигурирования I2C:
- Очистка бита I2CEN (BIC.B #I2CEN,&U0CTL)
- Переконфигурирование модуля I2C при I2CEN=0
- Установка I2CEN программным обеспечением (BIS.B #I2CEN,&U0CTL)
Нарушение выполнения этого процесса может привести к непредсказуемому поведению USART.
|
Сброс модуля I2C
После PUC модуль USART сконфигурирован в режиме UART при SWRST=1. В режиме I2C установка I2CEN=0 приведет к следующему результату:
- Связь по I2C остановится
- Выводы SDA и SCL перейдут в «третье» состояние
- В I2CTCTL очистятся биты 3-0, биты 7-4 останутся неизменными
- Регистры I2CDCTL и I2CDR очистятся
- Сдвиговые регистры передачи и приема очистятся
- Содержимое регистров U0CTL, I2CNDAT, I2CPSC, I2CSCLL и I2CSCLH не изменится
- Содержимое регистров I2COA, I2CSA, I2CIE, I2CIFG и I2CIV не изменится
15.2.10 Прерывания I2C
Модуль I2C имеет один вектор прерывания для восьми флагов прерывания. Каждый флаг прерывания имеет собственный бит разрешения прерывания. Когда прерывание разрешено и установлен бит GIE, флаг прерывания будет генерировать запрос прерывания. Следующие события вызывают I2C прерывание:
Флаг прерывания |
Условие прерывания |
ALIFG |
Потеря арбитража. Арбитраж может быть потерян, когда два или более передатчиков начинают передачу одновременно или когда программное обеспечение пытается инициировать I2C передачу при I2CBB=1. Флаг ALIFG устанавливается, когда арбитраж потерян. Когда ALIFG установлен, биты MST и I2CSTP очищаются и контроллер I2C становится ведомым приемником. |
NACKIFG |
Прерывание при отсутствии подтверждения. Этот флаг устанавливается, когда ведущий не получил от ведомого подтверждение. NACKIFG используется только в режиме ведущего. |
OAIFG |
Прерывание собственного адреса. Флаг прерывания OAIFG устанавливается, когда другой ведущий адресует I2C модуль. OAIFG используется только в режиме ведомого. |
ARDYIFG |
Прерывание «регистр доступен». Этот флаг устанавливается, когда ранее запрограммированный перенос завершен, а биты статуса обновлены. Это прерывание используется для уведомления ЦПУ о том, что регистры I2C готовы к доступу. |
RXRDYIFG |
Прерывание/статус готовности приема. Этот флаг устанавливается, когда модуль I2C принял новые данные. RXRDYIFG автоматически очищается, когда I2CDR прочитан и буфер приема пуст. Переполнение приемника показывается, если бит I2CRXOVR=1. RXRDYIFG используется только в режиме приема. |
TXRDYIFG |
Прерывание/статус готовности передачи. Регистр I2CDR готов к новой передаче данных, когда I2CNDAT>0 или I2CRM=1 (режим передачи ведущего) или же когда другой ведущий запрашивает данные (режим передачи ведомого). TXRDYIFG автоматически очищается, когда I2CDR и буфер передачи полны. Опустошение передачи показывается, если I2CTXUDF=1. Не используется в режиме приема. |
GCIFG |
Прерывание общего вызова. Этот флаг устанавливается, когда модуль I2C принял адрес общего вызова (00h). GCIFG используется только в режим приема. |
STTIFG |
Прерывание при обнаружении условия старта. Этот флаг устанавливается, когда модуль I2C обнаружил условие старта в режиме ведомого. Это позволяет MSP430 находиться в режиме пониженного энергопотребления с неактивным источником тактирования I2C до инициирования связи ведущим по I2C. STTIFG используется только в режиме ведомого. |
Генератор вектора прерывания I2CIV
Флаги прерывания I2C разделены по приоритетам и объединены в источник одного вектора прерывания. Регистр вектора прерывания I2CIV используется для выяснения, какой флаг запросил прерывание. Разрешенное прерывание с наивысшим приоритетом генерирует число в регистре I2CIV. Это число может быть оценено или добавлено к программному счетчику для автоматического входа в соответствующую программную процедуру. Запрещенные I2C прерывания не воздействуют на содержимое I2CIV.
При любом доступе (чтение или запись) к регистру I2CIV автоматически сбрасывается флаг ожидающего прерывания с наивысшим приоритетом. Если устанавливается другой флаг прерывания, после обработки начального прерывания немедленно генерируется другое прерывание.
Пример программного обеспечения, использующего I2CIV
Приведенный далее пример программного обеспечения показывает рекомендуемое использование I2CIV. Значение I2CIV добавляется к PC для автоматического перехода к соответствующей процедуре:
I2C_ISR
ADD &I2CIV, PC ; Добавление смещения к таблице переходов
RETI ; Вектор 0: Нет прерывания
JMP AL IFG_ISR ; Вектор 2: ALIFG
JMP NACKIFG_ISR ; Вектор 4: NACKIFG
JMP OAIFG_ISR ; Вектор 6: OAIFG
JMP ARDYIFG_ISR ; Вектор 8: ARDYIFG
JMP RXRDYIFG_ISR ; Вектор 10: RXRDYIFG
JMP TXRDYIFG_ISR ; Вектор 12: TXRDYIFG
JMP GCIFG_ISR ; Вектор 14: GCIFG
STTIFG_ISR ; Вектор 16
... ; Задача (программный модуль) начинается здесь
RETI ; Возврат
ALIFG_ISR ; Вектор 2
... ; Задача начинается здесь
RETI ; Возврат
NACKIFG_ISR ; Вектор 4
... ; Задача начинается здесь
RETI ; Возврат
OAIFG_ISR ; Вектор 6
... ; Задача начинается здесь
RETI ; Возврат
ARDYIFG_ISR ; Вектор 8
... ; Задача начинается здесь
RETI ; Возврат
RXRDYIFG_ISR ; Вектор 10
... ; Задача начинается здесь
RETI ; Возврат
TXRDYIFG_ISR ; Вектор 12
... ; Задача начинается здесь
RETI ; Возврат
GCIFG_ISR ; Вектор 14
... ; Задача начинается здесь
RETI ; Возврат
|