MSP430_Final
.pdf17.3. Функционирование модуля USСI: режим I2C 411
Конфигурирование и реконфигурирование модуля USCI необходимо осу ществлять при установленном бите UCSWRST, чтобы предотвратить непредска зуемое поведение модуля. При установке бита UCSWRST в режиме I2C происхо дит следующее:
обмен по шине I2C прекращается;
выводы SCL и SDA переводятся в высокоимпедансное состояние;
биты 6…0 регистра UCBxI2CSTAT сбрасываются;
биты UCBxTXIE и UCBxRXIE сбрасываются;
биты UCBxTXIFG и UCBxRXIFG сбрасываются;
остальные биты и регистры не изменяются.
Примечание. Инициализация и реконфигурирование модуля USCI
Инициализацию и реконфигурирование модуля USCI рекомендуется выполнять
в следующей последовательности:
1. Установить бит UCSWRST (BIS.B #UCSWRST,&UCxCTL1).
2.Инициализировать все регистры USCI установкой UCSWRST = 1 (включая ре гистр UCxCTL1).
3.Сконфигурировать порты ввода/вывода.
4. Сбросить в программе бит UCSWRST (BIС.B #UCSWRST,&UCxCTL1).
5.Разрешить прерывания (при необходимости) установкой битов UCxRXIE и/или UCxTXIE.
17.3.2.Передача данных по шине I2C
Для каждого передаваемого бита данных ведущий генерирует один тактовый импульс. В режиме I2C обмен осуществляется побайтно. Данные передаются на чиная со старшего значащего бита, как показано на Рис. 17.3.
SDA |
|
|
|
|
|
|
|
|
|
|
|
MSB |
|
|
Подтверждение |
|
|
Подтверждение |
|||
|
|
|
|
от приёмника |
|
|
от приёмника |
|||
SCL |
|
|
|
|
|
|
|
|
|
|
Состояние |
1 |
2 |
7 |
8 |
9 |
1 |
2 |
8 |
9 |
Состояние |
СТАРТ (S) |
|
|
|
R/W |
ACK |
|
|
|
ACK |
СТОП (P) |
|
|
|
|
|
|
|
|
|
Рис. 17.3. Передача данных по шине I2C.
Первый байт, передаваемый после состояния СТАРТ, содержит 7 битный адрес ведомого и бит направления передачи R/W. При R/W = 0 ведущий передаёт дан ные ведомому. При R/W = 1 ведущий принимает данные от ведомого. После каж дого байта приёмник во время 9 го импульса SCL передаёт бит квитирования ACK.
Состояния СТАРТ и СТОП формируются ведущим устройством, как показа но на Рис. 17.3. Состоянию СТАРТ соответствует изменение уровня на линии SDA с ВЫСОКОГО на НИЗКИЙ при ВЫСОКОМ уровне на линии SCL. Состоя нию СТОП соответствует изменение уровня на линии SDA с НИЗКОГО на ВЫ СОКИЙ при ВЫСОКОМ уровне на линии SCL. Флаг занятости UCBBUSY уста навливается после формирования состояния СТАРТ и сбрасывается после фор мирования состояния СТОП.
412 Глава 17. Универсальный последовательный коммуникационный интерфейс: режим I2C
Сигнал на линии SDA должен быть неизменным в течение всего времени, по ка на линии SCL присутствует ВЫСОКИЙ уровень, как показано на Рис. 17.4. Уровень сигнала на линии SDA может изменяться только при НИЗКОМ уровне на линии SCL, в противном случае произойдет формирование состояния СТАРТ или СТОП.
Линия данных Данные не
изменяются
SDA
SCL
Изменение данных разрешено
Рис. 17.4. Передача бита по шине I2C.
17.3.3. Режимы адресации I2C
Модуль I2C поддерживает 7 и 10 битный режимы адресации.
7Cбитная адресация
При использовании 7 битной адресации первый байт пакета содержит 7 бит ный адрес и бит R/W, как показано на Рис. 17.5. После получения каждого байта приёмник отсылает бит ACK.
1 |
7 |
1 |
1 |
8 |
1 |
8 |
1 |
1 |
S |
Адрес ведомого |
R/W |
ACK |
Данные |
ACK |
Данные |
ACK |
P |
Рис. 17.5. 7 битный режим адресации модуля I2C.
10Cбитная адресация
При использовании 10 битной адресации (Рис. 17.6) первый байт пакета со держит значение 11110b плюс два старших бита 10 битного адреса, а также бит R/W. Второй байт пакета содержит оставшиеся 8 бит 10 битного адреса. Затем по шине пересылаются 8 битные данные. После получения каждого байта приёмник отсылает бит ACK.
1 |
7 |
|
|
1 |
1 |
8 |
1 |
8 |
1 |
1 |
S |
1 й байт адреса |
R/W |
ACK |
2 й байт адреса |
ACK |
Данные |
ACK |
P |
||
|
ведомого |
|
|
|
ведомого |
|
|
|
|
|
1 |
1 1 1 |
0 |
X |
X |
|
|
|
|
|
|
Рис. 17.6. 10 битный режим адресации модуля I2C.
17.3. Функционирование модуля USСI: режим I2C 413
Состояние ПОВСТАРТ
Направление потока данных, передаваемых по линии SDA, может быть измене но ведущим устройством без предварительного останова процесса пересылки. Для этого ведущий повторно формирует состояние СТАРТ, которое в данном случае имеет название ПОВСТАРТ. После ПОВСТАРТ снова передаётся адрес ведомого устройства, но уже с другим значением бита R/W, определяющего направление пе ресылки данных. Использование состояния ПОВСТАРТ показано на Рис. 17.7.
1 |
7 |
1 |
1 |
8 |
1 |
1 |
7 |
1 |
1 |
8 |
1 |
1 |
S Адрес ведомого R/W |
ACK |
Данные ACK |
S |
Адрес ведомого R/W |
ACK |
Данные |
ACK |
P |
||||
|
|
1 |
|
Любое |
|
|
|
1 |
|
Любое |
|
|
|
|
|
|
количество |
|
|
|
|
количество |
|
|
Рис. 17.7. Адресация с использованием состояния ПОВСТАРТ.
17.3.4. Режимы работы модуля I2C
В режиме I2C модуль USCI может работать как ведущий передатчик, веду щий приёмник, ведомый передатчик или ведомый приёмник. Эти режимы ра боты рассматриваются в следующих подразделах. Для иллюстрации режимов ис пользуются циклограммы.
На Рис. 17.8 показана расшифровка условных обозначений, используемых в циклограммах. Данные, передаваемые ведущим, изображаются серыми прямо угольниками, а данные, передаваемые ведомым, — белыми. Данные, передавае мые модулем USCI, независимо от его режима работы изображаются прямоуголь никами большей высоты.
Другой ведущий
Другой ведомый
USCI — ведущий
USCI — ведомый
...
Биты устанавливаются или сбрасываются программно
...
Биты устанавливаются или сбрасываются аппаратно
Рис. 17.8. Условные обозначения циклограмм I2C.
414 Глава 17. Универсальный последовательный коммуникационный интерфейс: режим I2C
Действия, выполняемые модулем USCI, указываются в серых прямоугольни ках со стрелкой. Стрелка показывает конкретное место в потоке данных, в кото ром производятся эти действия. Действия, которые должна выполнять пользова тельская программа, изображаются белыми прямоугольниками со стрелкой. Стрелка показывает место в потоке данных, в котором эти действия должны быть выполнены.
Режим ведомого
Для переключения модуля USCI в режим ведомого I2C необходимо выбрать режим I2C, установив биты UCMODEx = 11 и UCSYNC = 1, и сбросить бит UCMST.
Сначала модуль USCI должен быть сконфигурирован как приёмник (бит UCTR = 0) для приёма адреса I2C. Далее режим работы (приёмник/передатчик) будет выбран автоматически в зависимости от значения бита R/W, полученного вместе с адресом.
Собственный адрес модуля USCI хранится в регистре UCBxI2COA. При UCA10 = 0 используется 7 битная адресация, а при UCA10 = 1 — 10 битная. Со стояние бита UCGCEN определяет реакцию модуля на общие вызовы.
После того как модуль USCI обнаружит на шине состояние СТАРТ, он при нимает адрес, переданный ведущим, и сравнивает его со своим адресом, храня щимся в регистре UCBxI2COA. При равенстве полученного адреса и собственно го адреса модуля USCI будет установлен флаг прерывания UCSTTIFG.
Режим «ведомый.передатчик» модуля I2C
Ведомое устройство переключается в режим передачи в том случае, если ад рес, переданный ведущим, совпадает с собственным адресом модуля и бит R/W установлен. Ведомый передатчик побитно выставляет данные на линию SDA синхронно с тактовыми импульсами, генерируемыми ведущим устройством. Ве домое устройство не генерирует тактовый сигнал, однако может удерживать НИЗКИЙ уровень на линии SCL, если после передачи очередного байта требует ся вмешательство ЦПУ.
Если ведущий запрашивает данные от ведомого устройства, то модуль USCI автоматически конфигурируется как передатчик, при этом устанавливаются биты UCTR и UCBxTXIFG. Модуль удерживает НИЗКИЙ уровень на линии SCL до тех пор, пока первый передаваемый байт данных не будет загружен в буфер пере дачи UCBxTXBUF. После этого формируется подтверждение приёма адреса, сбрасывается флаг UCBxTXIFG и начинается передача данных. Одновременно с перегрузкой содержимого буфера в сдвиговый регистр передачи снова устанавли вается флаг UCBxTXIFG. После того как ведущий подтвердит получение данных, передаётся следующий байт, находящийся в регистре буфера UCBxTXBUF. Если буфер пуст, то процесс обмена приостанавливается (удержанием НИЗКОГО уровня на линии SCL после получения бита квитирования) до тех пор, пока в UCBxTXBUF не будут загружены новые данные. При посылке ведущим непод тверждения (NACK) с последующим формированием состояния СТОП устанав ливается флаг UCSTPIFG. Если после бита NACK формируется состояние ПОВ
17.3. Функционирование модуля USСI: режим I2C 415
СТАРТ, то конечный автомат I2C модуля USCI возвращается в состояние ожида ния приёма адреса.
Работа модуля в режиме «ведомый передатчик» проиллюстрирована на
Рис. 17.9.
Приём своего |
|
|
|
|
|
|
|
|
|
|
адреса и |
|
|
|
|
|
|
|
|
|
|
передача |
S |
SLA/R |
A |
DATA |
A |
DATA |
A |
DATA |
A |
P |
байтов |
|
|
|
|
|
|
|
|
|
|
данных |
|
|
|
|
|
|
|
|
|
|
UCTR = 1 (Передатчик) |
|
|
Записать данные в UCBxTXBUF |
|
UCBxTXIFG= 0 |
|
||
UCSTTIFG = 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UCBxTXIFG = 1 |
|
|
|
|
|
|
|
|
UCSTPIFG = 0 |
|
UCBxTXIFG = 1 |
|
|
|
UCSTPIFG = 1 |
||
UCBxTXBUF игнорируется |
|
|
|
|
||||
|
|
|
|
|
|
UCSTTIFG = 0 |
||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
Шина блокируется (НИЗКИЙ уровень на SCL), пока данные не будут готовы
Записать данные в UCBxTXBUF |
|
|
|
|
|
Повторный старт – |
DATA |
A |
S |
SLA/R |
|
|
|
|
|
||
далее работает, как |
|
|
|
|
|
ведомый передатчик |
|
|
|
|
|
|
UCBxTXIFG = 0 |
|
|
||
|
|
UCTR = |
1 (Передатчик) |
||
|
|
UCSTTIFG = 1 |
|
||
|
|
UCBxTXIFG = 1 |
|
||
|
|
UCBxTXBUF игнорируется |
|||
Повторный старт – |
DATA |
A |
S |
SLA/W |
|
далее работает, как |
|||||
|
|
|
|
||
ведомый приёмник |
|
|
|
|
|
|
UCBxTXIFG= 0 |
|
|
Потеря арбитража |
|
UCTR = 0 (Приёмник) |
в режиме ведущего и |
A |
|
адресация в качестве |
|
UCSTTIFG = 1 |
|
|
|
ведомого |
|
|
UCALIFG = 1
UCMST = 0
UCTR = 1 (Передатчик)
UCSTTIFG = 1
UCBxTXIFG = 1
UCSTPIFG = 0
Рис. 17.9. Режим «ведомый передатчик» модуля I2C.
Режим «ведомый.приёмник» модуля I2C
Модуль переключается в режим «ведомый приёмник» в том случае, если ад рес, переданный ведущим, совпадает с собственным адресом модуля, а бит R/W сброшен. В этом режиме биты данных, передаваемые по линии SDA, считывают ся модулем синхронно с тактовыми импульсами, генерируемыми ведущим уст ройством. Ведомое устройство не генерирует тактовый сигнал, однако оно может
416 Глава 17. Универсальный последовательный коммуникационный интерфейс: режим I2C
удерживать НИЗКИЙ уровень на линии SCL, если после приёма очередного бай та требуется вмешательство ЦПУ.
Если ведомый должен принимать данные от ведущего, то модуль USCI авто матически конфигурируется как приёмник, при этом сбрасывается бит UCTR. После приёма первого байта данных устанавливается флаг прерывания приёма UCBxRXIFG. Модуль автоматически подтверждает получение данных и перехо дит к ожиданию следующего байта данных.
Если к моменту завершения приёма байта ранее принятое значение не было считано из буфера приёма UCBxRXBUF, то обмен на шине приостанавливается удержанием НИЗКОГО уровня на линии SCL. Сразу же после чтения регистра UCBxRXBUF в него перегружаются новые данные, отсылается подтверждение ведущему устройству и разрешается приём следующих данных.
Установленный бит UCTXNACK вызовет передачу ведущему устройству сиг нала NACK в такте квитирования. Сигнал NACK отсылается даже в том случае, если буфер UCBxRXBUF не готов к приёму последних данных. Если бит UCTXNACK устанавливается в то время, пока модуль удерживает на линии SCL НИЗКИЙ уровень, то шина освобождается, сразу же передаётся сигнал NACK, а в буфер UCBxRXBUF загружаются последние принятые данные. Поскольку пре дыдущие данные не были считаны, они теряются. Чтобы избежать потери дан ных, необходимо перед установкой бита UCTXNACK выполнить чтение регистра UCBxRXBUF.
При формировании ведущим состояния СТОП устанавливается флаг UCSTPIFG.
Если ведущий формирует состояние ПОВСТАРТ, то конечный автомат I2C модуля USCI возвращается в состояние ожидания приёма адреса.
Работа модуля в режиме «ведомый приёмник» проиллюстрирована на
Рис. 17.10.
Ведомый I2C и режим 10.битной адресации
Режим 10 битной адресации выбирается при UCA10 = 1; работа ведомого с использованием 10 битной адресации проиллюстрирована на Рис. 17.11. При 10 битной адресации ведомое устройство после получения полного адреса находится в режиме «ведомый приёмник». Модуль USCI сигнализирует об этом установкой флага UCSTTIFG с одновременным сбросом бита UCTR. Для перевода модуля в режим «ведомый передатчик» ведущее устройство формирует состояние ПОВСТАРТ и передаёт первый байт адреса с установленным битом R/W. При по лучении этого байта устанавливается флаг UCSTTIFG (если ранее он уже был сброшен программой), и модуль USCI переключается в режим передатчика с од новременной установкой бита UCTR = 1.
Режим ведущего
Для переключения модуля USCI в режим ведущего I2C необходимо выбрать режим I2C, установив биты UCMODEx = 11 и UCSYNC = 1, а также установить бит UCMST. При наличии в системе нескольких ведущих устройств должен быть установлен бит UCMM, а в регистр UCBxI2COA — загружен собственный адрес модуля. При UCA10 = 0 используется 7 битная адресация, а при UCA10 = 1 —
17.3. Функционирование модуля USСI: режим I2C 419
давались. Если необходимо передать единственный байт данных, то бит UCSTP должен быть установлен либо во время пересылки этого байта, либо в любое вре мя после начала передачи без загрузки новых данных в UCBxTXBUF. В против ном случае будет передан только адрес. При перегрузке данных из буфера в сдви говый регистр устанавливается флаг UCBxTXIFG, сообщающий о том, что нача лась передача данных и бит UCTXSTP может быть установлен.
Установка бита UCTXSTT вызывает формирование состояния ПОВСТАРТ. При этом установкой или сбросом бита UCTR может быть изменён режим рабо ты модуля, а в регистр UCBxI2CSA, при необходимости, может быть загружен но вый адрес ведомого устройства.
Если ведомое устройство не подтверждает переданные ему данные, то уста навливается флаг отсутствия подтверждения UCNACKIFG. При установке этого флага ведущий должен сформировать состояние СТОП либо ПОВСТАРТ. Если в регистр UCBxTXBUF уже были загружены данные, то они теряются. Если эти данные должны быть переданы после ПОВСТАРТ, их необходимо снова записать в UCBxTXBUF. Значение бита UCTXSTT также игнорируется. Для формирова ния состояния ПОВСТАРТ бит UCTXSTT необходимо установить повторно.
Работа модуля в режиме «ведущий передатчик» проиллюстрирована на
Рис. 17.12.
Режим «ведущий.приёмник» модуля I2C
После инициализации модуля переключение последнего в режим «ведущий приёмник» производится записью в регистр UCBxI2CSA адреса искомого ведо мого устройства, выбором разрядности адреса ведомого при помощи бита UCSLA10, сбросом бита UCTR для включения режима передатчика и установкой бита UCTXSTT для формирования состояния СТАРТ.
Модуль USCI проверяет доступность шины, формирует состояние СТАРТ и передаёт адрес ведомого устройства. Сразу же после подтверждения ведомым уст ройством отправленного адреса бит UCTXSTT сбрасывается.
После получения подтверждения принимается первый байт данных, отправ ленный ведомым, отсылается подтверждение и устанавливается флаг UCBxRXIFG. Приём данных от ведомого устройства осуществляется до тех пор, пока не будет установлен бит UCTXSTP или UCTXSTT. Если чтение регистра UCBxRXBUF не производится, то ведущий при приёме последнего бита данных удерживает на линии SCL НИЗКИЙ уровень до тех пор, пока этот регистр не бу дет прочитан.
Если ведомое устройство не подтверждает переданный ему адрес, то устанав ливается флаг отсутствия подтверждения UCNACKIFG. При установке этого флага ведущий должен сформировать состояние СТОП либо ПОВСТАРТ.
Установка бита UCXSTP вызывает формирование состояния СТОП. При ус тановке этого бита отсылается сигнал NACK, после чего формируется состояние СТОП. Эти действия выполняются после получения следующего байта данных от ведомого или, если модуль ожидает чтения регистра UCxRXBUF, сразу же после установки бита.