Поиск по сайту:

 


По базе:  

микроэлектроника, микросхема, микроконтроллер, память, msp430, MSP430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, SED1335, mega128, avr, mega128  
  Главная страница > Интерфейсы > I2C

реклама

 




Мероприятия:




Практические рекомендации

Ниже мы рассмотрим основные трудности, связанные с использованием шины I2C в целом, а также типичные ошибки, возникающие на начальных этапах реализации алгоритмов обмена.

Удобства применения шины I2C очевидны - малое количество соединительных линий и высокая скорость обмена, простота аппаратной реализации линии связи. Наиболее широко поддерживает шину I2C, конечно же, фирма Philips, производящая множество ИС различной сложности с управлением по I2C. В первую очередь, можно выделить микросхемы энергонезависимой памяти (EEPROM) серии 24Схх в 8-ми выводных корпусах, фактически ставшие промышленным стандартом. Из широко распространенных ИС можно выделить: микросхемы часов PCF8583, параллельный порт PCF8574, 4-х канальный 8-ми разрядный АЦП PCF8591. Cуществует множество модификаций этих ИС и более специализированные контроллеры.

I2C-абоненты жестко разделяются по классам:"Master"- и "Slave"- устройство. Тот факт, что сигнал SCL всегда генерируется "Master"-устройством означает, что "Master"-абонент может быть достаточно легко реализован чисто программными средствами, так как все изменения на шине будут происходить только по сигналу SCL. И наоборот, реализация "Slave"-устройства требует аппаратной поддержки, кроме случая очень низких скоростей обмена. Существуют однокристальные микро-ЭВМ (ОМЭВМ) поддерживающие "Slave"-операции шины I2C. Это прежде всего Philips PCF80C552 (652), Microchip PIC16C62 (64, 73 и др.), Motorola MC68HC705CJ4 (BD3, E5). Кроме того, ОМЭВМ фирмы Philips аппаратно поддерживают "Master"-протокол, хотя практически аппаратные "Master"-контроллеры применяются редко.

Типичная ошибка при реализации программ "Master"-абонента - управление значением порта ОМЭВМ для установки нулевого и единичного состояний линий SCL и SDA. Если для ОМЭВМ семейства MCS-51 это нормальный режим работы, так как единичное состояние порта у них реализуется встроенным подтягивающим резистором = 50 кОМ, то для ОМЭВМ с симметричными портами (Motorola 68HCxx, Microchip PIC, Atmel AVR) это будет порождать электрические конфликты. Например, в руководстве "Microchip. Embedded Control Handbook 1994/1995" приведены практические программы для связи PIC c ИС EEPROM, содержащие подобные грубые ошибки. Положение усугубляется тем, что в случае микросхем EEPROM такой вариант может сработать, так как оин являются 100% аппаратными схемами и не вносят задержек в связной протокол, а пазу ожидания окончания цикла программирования производят переходом в пассивное состояние. Использование таких подпрограмм с ИС, производящими захват линии SCL (практически любой "Slave"-абонент, реализованный с применением ОМЭВМ), приведет к невозможности связи, а возможно, и к выходу ИС из строя.

Реализовать настоящую имитацию ОК (мы назвали этот режим имитацией ОК, так он не позволяет устанавливать на линии напряжение выше напряжения питания, что было бы нормально для настоящего ОК, но так как по спецификации I2C напряжение на линиях SCL и SDA не должно превышать напряжение питания, его вполне законно можно считать выходом с ОК) на порте с симметричным выходом можно, если установить значение порта постоянно в ноль, а управлять состоянием линии через манипуляции с регистром направления данных. Для ОМЭВМ PIC это будет регистр "TRISx", переводящий порт либо в третье состояние, либо подключающий линии в соответствии с состоянием регистра "PORTx". Практически так же это реализуется в AVR и MC68HC05 (08, 11), где "DDRx" коммутирует порт "PORTx", с той лишь разницей, что у них другая полярность управляющего сигнала - у PIC ноль в "TRISx" соответствует нулю на выходе, а у AVR и MC68HC05 единица в "DDRx" соответствует нулю на выходе.

Еще одна тонкость связанная с PIC, не имеющая собственно к I2C никакого отношения заключается в том, что у него совмещены регистр чтения состояния линий порта и регистр записи значения порта, в результате чего, если часть линий порта запрограммирована на вывод, а другая находится в третьем состоянии, то при выполнении PIC'а установленных в третье состояние, что может нарушить (и скорее всего нарушит) работу программы обмена (потеряются нули обеспечивающие имитацию выходов с ОК). Поэтому лучше производить принудительную установку в ноль битов в "PORTx", например, перед каждой операцией обмена, скажем такой последовательностью:

movlw b'11100111' ; Маска линий SCL и SDA в порте С (RC3 и RC4)
andwf portc,f ; Сбр. значений линий SCL и SDA в порте С в ноль

Другая важная сторона вопроса-необходимость тщательного соблюдения параметров временной диаграммы процесса обмена. Несмотря на то, что шина I2C асинхронная и позволяет затягивать передачу бита (байта) на сколь угодно длительное время (это свойство позволяет реализовывать программы I2C-обмена на самом низком уровне приоритета, прерывая процесс передачи в любое время), требования к минимальным значениям длительностей импульсов очень жесткие. Ситуация усугубляется тем, что положительные перепады состояния линии имеют склонность затягиваться, так как несимметричные управляющие выходы не могут создать крутые положительные фронты.

При написании программ очень важно контролировать время между операциями на шине, реализуемыми различными подпрограммами, например выдача "Start" и "Stop"-условия, передача бита, передача байта. При состыковке этих подпрограмм не должны быть нарушены минимальные значения времени, что очень легко происходит при использовании высокоскоростных процессоров (AVR, PIC). Кроме того, необходимо следить, чтобы время между изменением на линии SDA и стробированием положительным импульсом на линии SCL было не меньше половины минимальной длительности полупериода SCL (4.7 мкс/2=2.4 мкс). Помимо этого, некоторые "Slave"-приборы могут ужесточить требования к максимальной частоте обмена (например, CE110-48 кГц), в этом случае необходимо пропорционально снижению частоты обмена увеличивать значения минимумов временных допусков.

Еще одна распространенная ошибка - игнорирование требования слежения за захватом линии SCL "Slave"-абонентом. Грамотно реализованные прграммы операций "Master"-абонента должны контролировать возврат линии SCL после того, как переводят ее в единичное состояние, и только дождавшись реальной установки линии SCL в единичное состояние продолжать операции приемо-передачи.

Теперь мы опишем минимально необходимый набор операций для реализации "Master"-абонента. Прежде всего, это подпрограммы выдачи "Start"- и "Stop"-условия, подпрограмма передачи байта, подпрограмма приема байта, выдающая сигнал АСК и подпрограмма приема байта, не выдающая сигнал АСК. Три последние используют подпрограммы передачи бита и приема бита.Во временных промежутках между подпрограммами линия SCL имеет нулевое значение. Как уже говорилось ранее, важно правильно согласовывать все временные характеристики подпрограмм. Если, к примеру, вы вызываете повторный "Start" сразу за передачей (приемом) байта, то необходимо, чтобы полностью завершился нулевой полупериод (>4.7 мкс), предшествующий "Start"-условию, а подпрограмма, реализующая "Start"-условие, переведя линии SDA и SCL в единичное состояние, дождавшись их реального возврата, должна удерживать ее в таком состоянии не менее установленного времени (>4.7 мкс), и так во всех случаях.

Оперируя этими пятью подпрограммами можно легко наладить обмен по шине I2C. Можно выдать на шину "Start"-условие, за ним "Siave Adress", далее данные, в соответствии с протоколом конкретной I2C-ИС. Можно выдать повторное "Start"-условие, новый "Slave Adress" и так далее, формируя процесс обмена как из элементов конструктора. Обычно протоколы обмена "Slave"-устройств довольно логично соответствуют программированию в таком стиле.





 
Впервые? | Реклама на сайте | О проекте | Карта портала
тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru
©1998-2023 Рынок Микроэлектроники