Руководство пользователя MSP430 (1041606), страница 32
Текст из файла (страница 32)
Модуль 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 для других условий I2C
Нарушение выполнения этого процесса может привести к непредсказуемому поведению 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 ; Возврат
15.3 Регистры модуля I2C
Регистры модуля I2C и соответствующие адреса приведены в таблице 15-3.
Таблица 15-3. Регистры I2C
Регистр | Краткое | Тип | Адрес | Исходное |
Разрешение прерывания I2C | I2CIE | Чтение/запись | 050h | Сброс с PUC |
Флаг прерывания I2C | I2CIFG | Чтение/запись | 051h | Сброс с PUC |
Подсчет данных I2C | I2CNDAT | Чтение/запись | 052h | Сброс с PUC |
Управление USART | U0CTL | Чтение/запись | 070h | Сброс с PUC |
Управление передачей I2C | I2CTCTL | Чтение/запись | 071h | Сброс с PUC |
Управление данными I2C | I2CDCTL | Только чтение | 072h | Сброс с PUC |
Прескалер I2C | I2CPSC | Чтение/запись | 073h | Сброс с PUC |
«Высокий» SCL I2C | I2CSCLH | Чтение/запись | 074h | Сброс с PUC |
«Низкий» SCL I2C | I2CSCLL | Чтение/запись | 075h | Сброс с PUC |
Данные I2C | I2CDR | Чтение/запись | 076h | Сброс с PUC |
Собственный адрес I2C | I2COA | Чтение/запись | 0118h | Сброс с PUC |
Адрес ведомого I2C | I2CSA | Чтение/запись | 011Ah | Сброс с PUC |
Вектор прерываний I2C | I2CIV | Только чтение | 011Ch | Сброс с PUC |
U0CTL, регистр управления USART0 в режиме I2C
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
RXDMAEN | TXDMAEN | I2C | XA | LISTEN | SYNC | MST | I2CEN |
rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-1 |
RXDMAEN | Бит 7 | Разрешение DMA при приеме. Этот бит включает контроллер DMA, чтобы переносить данные из модуля I2C после приема данных модулем I2C. Когда RXDMAEN=1, RXRDYIE автоматически очищается. 0 Выключен 1 Включен |
TXDMAEN | Бит 6 | Разрешение DMA при передаче. Этот бит включает контроллер DMA, что может быть использовано для переноса данных в модуль I2C для передачи. Когда TXDMAEN=1, TXRDYIE автоматически очищается. 0 Выключен 1 Включен |
I2C | Бит 5 | Включение режима I2C. Этот бит позволяет выбрать режим I2C или SPI, когда SYNC=1. 0 Режим SPI 1 Режим I2C |
XA | Бит 4 | Расширенная адресация 0 7-разрядная адресация 1 10-разрядная адресация |
LISTEN | Бит 3 | Прослушивание. Этот бит устанавливает режим обратной петли. Бит LISTEN действителен только когда MST=1 и I2CTRX=1 (ведущий передатчик). 0 Нормальный режим 1 SDA внутренне подключается назад к приемнику (обратная петля) |
SYNC | Бит 2 | Включение синхронного режима 0 Режим UART 1 Режим SPI или I2C |
MST | Бит 1 | Выбор режима ведущий/ведомый. Этот бит выбирает режим ведомого или ведущего. Бит MST автоматически очищается при потере арбитража. 0 Режим ведомого 1 Режим ведущего |
I2CEN | Бит 0 | Включение I2C. Бит включает или выключает модуль I2C. В исходном состоянии он установлен, и для UART или SPI функционирует как SWRST. Когда первыми после PUC устанавливаются биты I2C и SYNC, этот бит функционирует как I2CEN и автоматически очищается. 0 Работа I2C запрещена. 1 Работа I2C разрешена. |
I2CTCTL, регистр управления передачей в режиме I2C
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
I2CWORD | I2CRM | I2CSSELx | I2CTRX | I2CSTB | I2CSTP | I2CSTT |
rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 |
Модифицируется, только когда I2CEN=0
I2CWORD | Бит 7 | Режим слова I2C. Выбирается режим байта или слова для регистра данных I2C. 0 Режим байта 1 Режим слова |
I2CRM | Бит 6 | Режим повтора I2C 0 I2CNDAT определяет количество переданных байтов 1 Количество передаваемых байт определяется программным обеспечением. I2CNDAT не используется. |
I2CSSELx | Биты | Выбор источника тактирования I2C. Когда MST=1 и арбитраж потерян, автоматически используется внешний сигнал SCL. 00 Нет тактирования – модуль I2C неактивен 01 ACLK 10 SMCLK 11 SMCLK |
I2CTRX | Бит 3 | Передача I2C. Этот бит выбирает функцию передачи или приема для контроллера I2C, когда MST=1. Когда MST=0, бит R/W байта адреса определяет направление данных и I2CTRX отражает направление вывода SDA. 0 Режим приема. Данные принимаются на выводе SDA. 1 Режим передачи. Данные передаются на выводе SDA. |
I2CSTB | Бит 2 | Стартовый байт. Установка бита I2CSTB при MST=1 инициирует стартовый байт. 0 Нет действия 1 Отправка условия СТАРТ, стартового байта (03h), но не условия останова. |
I2CSTP | Бит 1 | Бит стоп. Этот бит используется для генерации условия СТОП. После условия СТОП бит I2CSTP автоматически очищается. 0 Нет действия 1 Отправка условия СТОП |
I2CSTT | Бит 0 | Бит старт. Этот бит используется для генерации условия СТАРТ. После условия СТАРТ бит I2CSTT автоматически очищается. 0 Нет действия 1 Отправка условия СТАРТ |
I2CDCTL, регистр управления данными I2C
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Не исполь | Не исполь | Не исполь | I2C | I2XSBD | I2XTXUDF | I2CRXOVR | I2CBB |
r0 | r0 | r0 | r-0 | r-0 | r-0 | r-0 | r-0 |
Не исполь | Биты | Не используются. Всегда читаются как 0. |
I2C | Бит 4 | «Низкий» SCL I2C. Этот бит показывает, что ведомый удерживает линию SCL в низком состоянии, когда MSP430 – ведущий. Этот бит не используется в режиме ведомого. 0 SCL не удерживается в состоянии низкого уровня. 1 SCL удерживается в состоянии низкого уровня. |
I2CSBD | Бит 3 | Один байт данных I2C. Этот бит показывает, что содержится в регистре приема – слово или байт. Бит I2CSBD действителен только когда I2CWORD=1. 0 Слово было принято полностью 1 В I2CDR достоверен только младший байт |
I2CTXUDF | Бит 2 | Опустошение при передаче I2C 0 Опустошения нет 1 Произошло опустошение при передаче |
I2CRXOVR | Бит 1 | Переполнение при приеме I2C. 0 Переполнения при приеме не произошло. 1 Произошло переполнение при приеме. |
I2CBB | Бит 0 | Бит занятости I2C. Условие старта устанавливает I2CBB в 1. I2CBB сбрасывается условием стоп или при I2CEN=0. 0 Не занято 1 Занято |
I2CDR, регистр данных I2C
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
Старший байт данных I2C (передается вторым) |
rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Младший байт данных I2C |
rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 |
I2CDRx | Биты | Данные I2C |
I2CNDAT, регистр подсчета переданных байтов I2C
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
I2CNDATx |
rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 |
I2CNDATx | Биты | Количество байтов I2C. Эти биты обеспечивают автоматический подсчет байтов данных. В режиме слова I2CNDATx должен иметь четное значение. Запись в регистр: Количество байтов Чтение из регистра, I2CBB=1: Количество байтов, остающихся при передаче Чтение из регистра, I2CBB=0: Количество байтов, которые были переданы |
Примечание: Регистр I2CNDAT |
I2CPSC, регистр прескалера тактирования I2C
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
I2CPSCx |
rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 |
Модифицируется, только когда I2CEN=0
I2CPSCx | Биты | Прескалер тактирования I2C. Входная тактовая частота I2C делится содержимым I2CPSCx, обеспечивая внутреннюю тактовую частоту I2C. Коэффициент деления равен I2CPSC+1. |
I2CSCLH, сдвиговый регистр высокого уровня сигналов тактирования I2C
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
I2CSCLHx |
rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 |
Модифицируется, только когда I2CEN=0
I2CSCLHx | Биты 7-0 | Сдвиговый регистр высокого уровня тактовых импульсов I2C. Эти биты определяют продолжительность высокого уровня сигнала на SCL, когда контроллер I2C находится в режиме ведущего. Длительность высокого уровня SCL составляет (I2CSCLH + 2) * I2CPSC. |
I2CSCLL, сдвиговый регистр низкого уровня сигналов тактирования I2C
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
I2CSCLLx |
rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 |
Модифицируется, только когда I2CEN=0
I2CSCLLx | Биты | Сдвиговый регистр низкого уровня тактовых импульсов I2C. Эти биты определяют продолжительность низкого уровня сигнала на SCL, когда контроллер I2C находится в режиме ведущего. Длительность низкого уровня SCL составляет (I2CSCLL + 2) * I2CPSC. |
I2COA, регистр собственного адреса I2C в 7-разрядном адресном режиме
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
r0 | r0 | r0 | r0 | r0 | r0 | rw-0 | rw-0 |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | I2COAx |
r0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 |
Модифицируется, только когда I2CEN=0
I2COAx | Биты | Собственный адрес I2C. Регистр I2COA содержит локальный адрес контроллера I2C MSP430. Регистр I2COA выровнен по правому краю. Старшим битом (MSB) является 6-ой бит. Биты 15-7 всегда равны 0. |
I2COA, регистр собственного адреса I2C в 10-разрядном адресном режиме
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
0 | 0 | 0 | 0 | 0 | 0 | I2COAx |
r0 | r0 | r0 | r0 | r0 | r0 | rw-0 | rw-0 |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
I2COAx |
rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 | rw-0 |
Модифицируется, только когда I2CEN=0
I2COAx | Биты | Собственный адрес I2C. Регистр I2COA содержит локальный адрес контроллера I2C MSP430. Регистр I2COA выровнен по правому краю. Старшим битом (MSB) является 9-ый бит. Биты 15-10 всегда равны 0. |