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

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

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

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

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

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

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

 
Опции темы

Запись/чтение в AT24C16.

Непрочитано 05.03.2017, 22:39  
DSerge
Прописка
 
Регистрация: 15.09.2008
Сообщений: 208
Сказал спасибо: 45
Сказали Спасибо 29 раз(а) в 24 сообщении(ях)
DSerge на пути к лучшему
По умолчанию Запись/чтение в AT24C16.

Поясните "на пальцах" или примером в СИ как байтовый массив записать в несколько блоков в AT24C16.
Проблема: не могу перейти в следующий блок при заполнении предыдущего.
Реклама:
DSerge вне форума  
Непрочитано 05.03.2017, 23:21  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
Стрелка Re: Запись/чтение в AT24C16.

ЕМНИП, послать Stop и начать цикл записи снова, с новым адресом:
Сообщение от AT24C16B
The data word address lower three bits are internally incremented following the receipt of each data word. The higher data word address bits are not incremented, retaining the memory page row location. When the word address, internally generated, reaches the page boundary, the following byte is placed at the beginning of the same page. If more than sixteen data words are transmitted to the EEPROM, the data word address will “roll over” and previous data will be overwritten.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 06.03.2017, 00:01  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Запись/чтение в AT24C16.

Там страницы. Адрес инкременируется лишь до конца страницы. Вот пример моего кода:
Код:
char EEPROM_RW (EEPROM_StructTypeDef * EEPROM)
{
	char m_adrs[2], Result = 0, BytesToHandle;
	
	/* Calculate start address */
	m_adrs[1] = (char)EEPROM-›Mem_adrs;
	m_adrs[0] = (char)(EEPROM-›Mem_adrs ›› 8);
	
	/* Calculate bit mask */
	BytesToHandle = m_adrs[0] & (EEPROM-›PageSize - 1);
	
	/* Apply bit mask. If first part of page exist */
	if (BytesToHandle)
	{
		if (EEPROM-›isWriting)
		{
			/* Perform writing */
			Result = EEPROM-›WritePage(EEPROM-›I2C_Adrs, m_adrs, 2, EEPROM-›buf, BytesToHandle);
			EEPROM-›delay_func(EEPROM-›PageWriteTime);
		}
		else
			/* Perform reading */
			Result = EEPROM-›ReadPage(EEPROM-›I2C_Adrs, m_adrs, 2, EEPROM-›buf, BytesToHandle);
		
		EEPROM-›size -= BytesToHandle;
		EEPROM-›Mem_adrs += BytesToHandle;
	}
	if (!EEPROM-›size || Result) return Result; //nothing to write any more

	/* Reading or Writing full pages */
	do
	{
		if (EEPROM-›isWriting)
		{
			/* Perform writing */
			Result = EEPROM-›WritePage(EEPROM-›I2C_Adrs, m_adrs, 2, EEPROM-›buf, EEPROM-›PageSize);
			EEPROM-›delay_func(EEPROM-›PageWriteTime);
		}
		else
			/* Perform reading */
			Result = EEPROM-›ReadPage(EEPROM-›I2C_Adrs, m_adrs, 2, EEPROM-›buf, EEPROM-›PageSize);
		
		/* Calculate new offset */
		EEPROM-›buf += EEPROM-›PageSize;
		EEPROM-›size -= EEPROM-›PageSize;
		EEPROM-›Mem_adrs += EEPROM-›PageSize;
		m_adrs[1] = (char)EEPROM-›Mem_adrs;
		m_adrs[0] = (char)(EEPROM-›Mem_adrs ›› 8);		
		
	}while(EEPROM-›size ›= EEPROM-›PageSize);
	
	if (!EEPROM-›size) return Result; //nothing to write any more
	
	/* Read or write the rest of data */
	if (EEPROM-›isWriting)
	{	
		/* Perform writing */
		Result = EEPROM-›WritePage(EEPROM-›I2C_Adrs, m_adrs, 2, EEPROM-›buf, EEPROM-›size);
		EEPROM-›delay_func(EEPROM-›PageWriteTime);
	}
	else
		/* Perform reading */
		Result = EEPROM-›ReadPage(EEPROM-›I2C_Adrs, m_adrs, 2, EEPROM-›buf, EEPROM-›size);
			
	return Result;
}
Код:
typedef struct
{
	/* Data */
	int Mem_adrs;
	char * buf;
	int size;
	
	/* Functions */
	char (*WritePage)(char I2C_Adrs, char * MemPos, char MemPosSize, char * buf, char size);
	char (*ReadPage) (char I2C_Adrs, char * MemPos, char MemPosSize, char * buf, char size);	
	void (*delay_func)(unsigned int ms);
	
	/* Settings */
	char I2C_Adrs;
	char PageSize;
	char PageWriteTime;
	char isWriting;
}EEPROM_StructTypeDef;
Easyrider83 вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Знатокам I2C. Не могу побороть AT24C16 stri Микроконтроллеры, АЦП, память и т.д 11 18.02.2008 09:18


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.