Страница 1 из 1

аппаратная поддержка i2c для котят :)

Добавлено: Сб янв 30, 2010 22:47:00
CALLIKA
Помогите ссылками, для самых непонятливых как реализован и как использовать(примеры) аппаратный I2c в мк - atmega, attiny?

Добавлено: Сб янв 30, 2010 22:56:05
GP1
Как реализован и как использовать написано в ДШ, если есть проблемы с аглицким, то Евстифеев А.В. тебе в помощь (можно нйти у Светы в библиотеке)
как пример могу предложить использование I2C в моем спидометре
http://radiokot.ru/forum/viewtopic.php?p=295638#295638
в исходниках есть файл s16_twi.asm, как раз использование аппаратного TWI, но на асме.

зы: а разве в тиньках есть аппаратный I2C?

Добавлено: Сб янв 30, 2010 23:00:20
GP1
сорри :oops:
оказывается в tiny48/88 есть аппаратный I2C

Добавлено: Вс янв 31, 2010 18:42:57
CALLIKA
GP1 писал(а):Как реализован и как использовать написано в ДШ, если есть проблемы с аглицким, то Евстифеев А.В. тебе в помощь (можно нйти у Светы в библиотеке)
как пример могу предложить использование I2C в моем спидометре
http://radiokot.ru/forum/viewtopic.php?p=295638#295638
в исходниках есть файл s16_twi.asm, как раз использование аппаратного TWI, но на асме.

зы: а разве в тиньках есть аппаратный I2C?
спасибо за наводку на книгу, но там я не нашел примера испльзования I2c шины, все очень черствым языком написано, хотелось бы статью с более пнятным разьеснением работы i2c, именно аппаратным i2c, т.е где используется уже готовая библиотека i2c, и я к сожалению понимаю только язык С\С++ :(

Добавлено: Вс янв 31, 2010 21:08:58
Aheir
CALLIKA писал(а):...все очень черствым языком написано...
Ну, вообще-то техническая литература несколько отлична от художественной.. Или Вам импонирует стиль изложения "для американских домохозяек"? :))
CALLIKA писал(а):...аппаратным i2c, т.е где используется уже готовая библиотека i2c...
Вы точно понимаете, что Вам нужно? Использование "аппаратного i2c" и "готовая библиотека i2с" - никак не связаны. Может быть аппаратный интерфейс, обслуживаемый без библиотеки, может быть софтовый с библиотекой, любые другие варианты тоже возможны. С т.з. программиста аппратный i2c - набор регистров, как туда грузить и читать данные - через библиотеку или нет - дело совершенно двадцать пятое. Примеров и того и другого - масса в статьях на сайте и по Форуму тоже есть. Вы хоть пробовали искать-то?

Добавлено: Вс янв 31, 2010 23:16:40
CALLIKA
хм..я значит я ошибочно понял понятие "аппаратным i2c", не подумал :)
Спасибо за разъяснение.

Добавлено: Пн фев 01, 2010 19:51:26
Aheir
Да не за что. Просто Вы бы действтельно разобрались - что Вам требуется, потом будет проще, примеры все есть, подскажем)

Добавлено: Вт фев 02, 2010 12:05:50
Danko
два коротких примера общения МК с DS1307 (CVAVR)
програмный :

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

unsigned char rtc_read(unsigned char address) {
unsigned char data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return data;
}
аппаратный:

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

unsigned char rtc_read(unsigned char address){
unsigned char data;
twi_start();
twi_write(0xd0);
twi_write(address);
twi_start();
twi_write(0xd1);
data=twi_read(0);
twi_stop();
return data;
}
и как в той рекламе какая разница?
только в програмном I2C ножки у МК можно выбирать самостоятельно.

Не формируется стоп

Добавлено: Пт фев 12, 2010 13:34:21
systemmind
Всем привет. Работаю с IIC. Когда сделал работу по прерыванию, то все получилось, но теперь надо сделать без них. Вот код на С:

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

char TWI_Rx(unsigned char adress)
{
	unsigned char data;
	TWCR=0xA4;			//формирование старт без прерываний
	while (!TWINT){}		//Было сформировано состояние Старт
//	while (TWSR!=0x08){}//Было сформировано состояние Старт
	TWDR=0xD0;			//Пакет SLA-W (режим записи), адрес ведомого 1101000
	TWCR=0x84;			//Сбрасываем флаг TWINT и разрешаем работу TWI
	TWIE=0;
	while (!TWINT){}	//Был передан пакет SLA+W
//	while (TWSR!=0x18){}	//Был передан пакет SLA+W
	TWDR=adress-0xE0;	//Адрес записывамеых данных
	TWCR=0x84;			//Сбрасываем флаг TWINT, передача данных
	TWIE=0;
	while (!TWINT){}	//Если передался адрес, то
//	while (TWSR!=0x28){}//
	TWCR=0xA4;			//формируем повстарт
	while (!TWINT){}	//Если сформировался повтарт, то
	TWDR=0xD1; 			//записываем адрес устройства и
	TWCR=0x84;			//передаем SLA-R
	while (!TWINT){}	//Если передался пакет Слар
	TWCR=0x84;			//Будет принят байт с неподтверждением
	while (!TWINT){}	//принялся байт с неподтверждением
	data=TWDR;			//считываем данные
	TWCR=0x94;			//формируем Стоп
	
//	while (!TWINT){}	//принялся байт с неподтверждением

	return data;
}
Глюк заключается в самом конце. Дело в том, что не формируется Стоп. Если раскоментарить последний while (!TWINT){}, то стоп формируется, но тогда программа зависает в этом цикле навсегда. Подскажите как это исправить?

Черт! Уже сам разобрался. Баг появляется, когда я последовательно пишу, например:
PORTB=TWI_Rx(0xE1);
PORTB=TWI_Rx(0xE5);

Т.о. нужно поставить задержку между этими строчками..