TWI-> проблема-> помогите

Обсуждаем контроллеры компании Atmel.
Ответить
Catdawr
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Вс авг 21, 2016 19:53:33

TWI-> проблема-> помогите

Сообщение Catdawr »

Здраствуйте, пролема простая, наверняка даже легко решаемая, но я не вдуплю. Кароче хочу, для понимания, чтобы просто заработал следующий код:

[Код из атмел студии 7, на atmega 8, протеус 8]

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

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>



#define ds3231 0b11010001


int main(void)
{

	DDRB = 0xFF;
	DDRD = 0x00;
	// Insert code
	
	
	uint8_t addrW;  // созидание и подготовка адреса с битом записи
	addrW = (ds3231);
	
	uint8_t addrDATA;
	addrDATA = 0x01;

	uint8_t DATA;
	DATA = 0b01010101;
	
	while(1){
		
		_delay_ms(200);
		
		TWBR = 255; //При частоте 1 МГц
		TWSR = (1 << TWPS1)|(0 << TWPS0); //Пред делитель на 4
		TWCR |= (1 << TWEN); //Включение модуля TWI
		// ******настройки

		TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE); // старт
		while (!(TWCR &( 1<<TWINT)));     // ожидание подъема twint
		if ((TWSR & 0xF8) != 0xF8); else PORTB |= (1 << 2);  // ежели  ошибка- загорится лампа



		TWDR= addrW;
		TWCR= (1<<TWINT)|(1<<TWEN);
		while (!(TWCR &( 1<<TWINT)));     // ожидание подъема twint



		TWDR= addrDATA;
		TWCR= (1<<TWINT)|(1<<TWEN);
		while (!(TWCR &( 1<<TWINT)));     // ожидание подъема twint
		if ((TWSR & 0xF8) != 0xF8) ;else PORTB |= (1 << 3);  // ежели ошибка- загорится лампа

		TWDR= DATA;
		TWCR= (1<<TWINT)|(1<<TWEN);
		while (!(TWCR &( 1<<TWINT)));     // ожидание подъема twint
		if ((TWSR & 0xF8) != 0xF8);else PINB |= (1 << 4);  // ежели ошибка- загорится лампа
		
		TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
	}


	return 0;
}
проблему видно на скрине дебагера протеуса.
Изображение
В общем, летит старт, летит адрес, адрес прилетает нормально, * далее летит неправильный (обычно пустой или, 4 раза генерирует некую белибирду) адрес пакета, шлет меня НАКуй... дальше уже не столь важно.

не пойму в чем дело, ломаю голову не первую неделю. Жду лапку помощи
Вложения
3sdf.jpg
(209.65 КБ) 310 скачиваний
Реклама
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: TWI-> проблема-> помогите

Сообщение mas123 »

[uquote="Catdawr",url="/forum/viewtopic.php?p=3233950#p3233950"]#define ds3231 0b11010001[/uquote]"...младший бит, определяет направление пересылки данных. "Ноль" означает, что ведущий будет записывать информацию в выбранного ведомого. "Единица" означает, что ведущий будет считывать информацию из ведомого."
Т.е. ты хочешь читать из ведомого устройства. А не нужно ли ему вначале передать что хочется прочитать, адрес регистра, например?
[uquote="Catdawr",url="/forum/viewtopic.php?p=3233950#p3233950"]TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE); // старт
while (!(TWCR &( 1<<TWINT))); // ожидание подъема twint
if ((TWSR & 0xF8) != 0xF8); else PORTB |= (1 << 2); // ежели ошибка- загорится лампа[/uquote]Зачем включать прерывание, если не используешь его? (TWIE)
Статус удачного старта - 0x08, т.е. для зажигания при ошибке нужно if ((TWSR & 0xF8) != 0x08) PORTB |= (1 << 2);
[uquote="Catdawr",url="/forum/viewtopic.php?p=3233950#p3233950"]TWDR= addrW;
TWCR= (1<<TWINT)|(1<<TWEN);
while (!(TWCR &( 1<<TWINT))); // ожидание подъема twint[/uquote]После передачи адреса устройства хорошо бы проверить результат, код успешного передачи адреса (TWSR & 0xF8) == 0x18
[uquote="Catdawr",url="/forum/viewtopic.php?p=3233950#p3233950"]TWDR= addrDATA;
TWCR= (1<<TWINT)|(1<<TWEN);
while (!(TWCR &( 1<<TWINT))); // ожидание подъема twint
if ((TWSR & 0xF8) != 0xF8) ;else PORTB |= (1 << 3); // ежели ошибка- загорится лампа[/uquote]Здесь, видимо, передаётся адрес регистра. Кстати, код успешной передачи данных (TWSR & 0xF8) == 0x28
Но i2c-адрес говорит "читаем из ведомого". Таким образом, ведомый начал что-то отвечать, но что?
В это же время ведущий начал что-то передавать - получили коллизию.
[uquote="Catdawr",url="/forum/viewtopic.php?p=3233950#p3233950"]В общем, летит старт, летит адрес, адрес прилетает нормально, * далее летит неправильный (обычно пустой или, 4 раза генерирует некую белибирду)[/uquote]i2c работает так, как ты ей сказал. А не так, как хотел чтобы оно работало. :)
В даташите описан алгоритм приема и передачи в/из ведомого.
Реклама
Catdawr
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Вс авг 21, 2016 19:53:33

Re: TWI-> проблема-> помогите

Сообщение Catdawr »

Отлично, всё работает.... спасибо тебе, дружище.
Ответить

Вернуться в «AVR»