Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 13.04.2013, 12:44  
Fogtech
Частый гость
 
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Fogtech на пути к лучшему
По умолчанию TWI/I2C для ATXmega128A1 с 24LC256

При работе с протоколом I2C у меня возникли некоторые трудности. Для проверки протокола использую память 24LC256. Сначала я хочу послать туда байт потом считать его и переслать считаное по UART.

UART работает правильно - проверено.
Запись скорее всего нет, так как когда я менял адрес слейва на несуществующий, по уарту я получал ту же фигню. А теперь по поводу фигни... 0x2D 0x39 0x35. У меня есть подозрения, что гдето в настройках
TWI_BAUDSETTING что-то не так, потому как это должно быть равным "0", то есть "0x30".

Прошу подкинуть свежих идей, ипробовал разные комбинации, кстати на настройках
Код:
#define CPU_SPEED 32000000
#define BAUDRATE 200000
получал "0x30", но тем не менее не считывался посланый мной "0x22". Функция Clock_init(); для 32 MHz работает верно - UART работает также на этой частоте.

Вот часть моего кода с I2C:
Код:
#include ‹xmega_a1_xplained.h›//#include ‹avr/io.h›
#include ‹util/delay.h› 
#include ‹string.h›			//strlen()
#include ‹stdlib.h›			//itoa()

#define CPU_SPEED 32000000	//32000000
#define BAUDRATE 400000		//400000
#define TWI_BAUD(F_SYS, F_TWI) ((F_SYS / (2 * F_TWI)) - 5)
#define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)

#define EEPROM 0x57

//====================== UART initialisation ==================================
void UART_init(void)
{...}
//====================== UART Send ============================================
void Send_UART(char data[])
{...}

//////////////////////// I2C Init /////////////////////////////////////////////
void TWI_MasterInit(TWI_t *twi)
{
	twi-›MASTER.BAUD = TWI_BAUDSETTING;
	twi-›MASTER.CTRLA = TWI_MASTER_ENABLE_bm |
	TWI_MASTER_INTLVL_HI_gc |  //
	TWI_MASTER_RIEN_bm |       //
	TWI_MASTER_WIEN_bm;        //
	twi-›MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;
}
//////////////////////// I2C Send Adress //////////////////////////////////////
void Send_Address(TWI_t *twi, char Adresse, char RW)
{
	twi-›MASTER.ADDR = (Adresse ‹‹ 1) + RW;
}
//////////////////////// I2C Send /////////////////////////////////////////////
void EEPROM_send_byte(TWI_t *twi, char Adresse, char byte)
{
	Send_Address(twi, Adresse, 0);
	_delay_us(500);
	twi-›MASTER.DATA = byte;
	twi-›MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
}
//////////////////////// I2C Read /////////////////////////////////////////////
char EEPROM_read_byte(TWI_t *twi, char *Adresse)
{
	Send_Address(twi, Adresse, 1);
	_delay_us(500);
	//twi-›MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
	return twi-›MASTER.DATA;
}
//====================== 32MHz Clock ==========================================
void Clock_init(void)
{
	OSC.CTRL |= OSC_RC32MEN_bm;				// Oscillator set to 32MHz
	while(!(OSC.STATUS & OSC_RC32MEN_bm));	// Wait until the oscillator is ready
	CCP = CCP_IOREG_gc;
	CLK.CTRL = CLK_SCLKSEL_RC32M_gc;		// Clock set to 32MHz 
											// Prescaler A = CLK/2, Prescaler B/C = CLK/1
}
//====================== Body =================================================
int main (void)
{
	char Buffer;
	char Text;
	
	Clock_init();
	UART_init();
	TWI_MasterInit(&TWIC);
	
	while(1)
	{
		EEPROM_send_byte(&TWIC, EEPROM, 0x22);
		_delay_ms(1000);

		
		Buffer = EEPROM_read_byte(&TWIC, EEPROM);//0x50);//
		
		//TWIC.MASTER.CTRLC = TWI_MASTER_CMD_RECVTRANS_gc;
		
		itoa(Buffer, Text, 10);
		Send_UART(Text);
		_delay_ms(1000);
	}
}
ЗЫ. на линии передачи у меня 2 резистора по 10кОм. Если их забрать во время процесса, то получается виннигрет изменяющихся переодично данных.
Реклама:

Последний раз редактировалось Fogtech; 13.04.2013 в 13:16.
Fogtech вне форума  
Непрочитано 13.04.2013, 14:00  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: TWI/I2C для ATXmega128A1 с 24LC256

Подай в уарт 0хАА или 0х55 и посмотри осциллографом длительность импульсов. Я всегда так делаю в подобных случаях
niXto вне форума  
Сказали "Спасибо" niXto
Fogtech (13.04.2013)
Непрочитано 13.04.2013, 14:14  
Fogtech
Частый гость
 
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Fogtech на пути к лучшему
По умолчанию Re: TWI/I2C для ATXmega128A1 с 24LC256

Сообщение от niXto Посмотреть сообщение
Подай в уарт 0хАА или 0х55 и посмотри осциллографом длительность импульсов. Я всегда так делаю в подобных случаях
Если я просто ложу любой байт на уарт - все работает. Увы нет осцилографа, но через терминал могу наблюдать...

Решил спустить скорость передачи данных по i2c к 200000, тут хотя бы ноль шлет на уарт. Думаю проблемма кроется где-то в записи EEPROM_send_byte().
Fogtech вне форума  
Непрочитано 14.04.2013, 23:50  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: TWI/I2C для ATXmega128A1 с 24LC256

в хмега колбасня с делей..
whoim вне форума  
 

Закладки

Метки
24lc256, atxmega128a1, i2c, twi
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Mega 8 + TWI (I2C) Slave Помогите. west1111 Микроконтроллеры, АЦП, память и т.д 46 10.07.2013 01:40
ADC для ATXmega128A1 - помогите найти ошибку в коде Fogtech AVR 21 25.02.2013 12:01
Proteus 7.6sp0 не корректно работает I2C ( TWI ) в AVR. chapa Proteus 5 15.12.2010 09:41
Величина подтягивающих резизторов TWI(I2C) на 3.3 В svad0 Микроконтроллеры, АЦП, память и т.д 7 02.03.2009 14:34
Proteus пример TWI (I2C) для двух AVR EXIS Микроконтроллеры, АЦП, память и т.д 0 14.05.2008 21:43


Часовой пояс GMT +4, время: 02:03.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot