Помогите по i2c, вопрос по asm

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Мучитель микросхем
Аватара пользователя
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

Сообщение v000va »

Разбираюсь с протоколом i2c, нашел доку AVR 300: Software I2C™ Master Interface и файлик на асме к нему. Так вот файлик на асме обзывается:

Title : I2C (Single) Master Implementation
;* Version : 1.0 (BETA)
;* Last updated : 97.08.27
;* Target : AT90Sxxxx (any AVR device)

Есть 2 вопроса по тексту программы:
1. Дока пишет, что частоты i2c могут быть 100 и 400кгц.
И в программе-примере соответсвенно используются специальне циклы задержки:
;* FUNCTION
;* i2c_hp_delay
;* i2c_qp_delay
;*
;* DESCRIPTION
;* hp - half i2c clock period delay (normal: 5.0us / fast: 1.3us)
;* qp - quarter i2c clock period delay (normal: 2.5us / fast: 0.6us)

В каких случаях применятся задержка на полпериода, а в каких случаях на четверть периода?

2. В первом же куске кода реализуется повторный старт, например.
Берем первую команду sbi - установить бит. Регистр DDRD ведь управляет направлением работы порта ввода-вывода, каким образом реаизуется установка SCL в ноль? В тексте проги пишут :

sbi DDRD,SCLP ; force SCL low

Ну и далее по тексту идет cbi и т.д. Не понятно каким образом управляя только DDRD на выводах контроллера реализуются логические уровни? Поясните плз. Ведь чтоб на выводах что-то появилось нужно вывести порт с помощью out, например.

PS По будет пользоваться с Tiny2313

---------------------------------------------------------------------
Кусочек кода из программы для пояснения 2-го вопроса.
....
.equ SCLP = 1 ; SCL Pin number (port D)
.equ SDAP = 0 ; SDA Pin number (port D)
....

i2c_rep_start:
sbi DDRD,SCLP ; force SCL low
cbi DDRD,SDAP ; release SDA
rcall i2c_hp_delay ; half period delay
cbi DDRD,SCLP ; release SCL
rcall i2c_qp_delay ; quarter period delay
Вложения
avr300_asm.txt
Собственно сам код апноута, в полном объеме.
(11.49 КБ) 567 скачиваний
Реклама
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

По поводу качания ногами портов - не обязательно выводить что то в порт, можно снять/установить бит командой cbi/sbi при условии, что данный пин порта настроен как выход, можно также и по-другому управлять портом. допустим у Вас в 0 бите порта (например PORTB) загружен каким-либо образом лог.0, если вы установите этот порт как выход, допустим командой sbi DDRB, 0 то у вас на соответствующей ноге контроллера установится 0, после того как вы сконфигурируете направление соответсвующего пина на вход. например сbi DDRB, 0, сохраняя в 0 бите PORTB логический 0, то у вас соответсвующая ножка будет настроена как вход без подтягивающих резисторов, и напряжение на ножке будет зависеть от того что к этой ножке присоединено
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

Сообщение v000va »

В том-то и дело, что не совсем ясно, как получаются 0 и 1 на выходе. Апноут гласит, что к выводам контроллера на которых формируются sda и scl подключены подтягивающие резисторы на +5В.
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Все просто.
В регистре портД (PORTD) в битах SCLP и SDAP, должны быть 0, собственно это условие обеспечивается в i2c_init:

Код: Выделить всё

i2c_init:
	clr	i2cstat			; clear I2C status register (used
					; as a temporary register)
	out	PORTD,i2cstat		; set I2C pins to open colector
	out	DDRD,i2cstat
	ret
sbi	DDRD,SCLP		; 	force SCL low
Дело в том, что в данном случае порт устанвливается в режим высокого входного сопротивления, а внешние подтягивающие резисторы будут обеспечивать единицу (высокий уровень) на линиях SCL и SDA

Когда нужно сделать какую либо линию нулем, то соответсвующий вывод переводится в режим выхода командой: sbi DDRD,SCLP либо sbi DDRD,SDAP, на соответсвующем выводе контроллера получается 0, засчет того что сопротивление открытого транзистора соответствующего вывода порта много меньше чем сопротивление подтягивающего резистора происходит то что в АН названо force SCL low (притягиваем SCL к нулю).

При насторойке порта на вход командой cbi DDRD,SCLP либо cbi DDRD,SDAP, соответствующий вывод порта вновь настраивается как вход и засчет внешних подтягивающих резисторов становится единицей
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

Сообщение v000va »

smac Спасибо огромное, так яснее. Теперь ясно как это все реализуется. Разобраться бы еще с задержками, когда какую ставить :)) Спасибки!
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»