| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Запись/чтение в AT24C16.
05.03.2017, 22:39
|
|
|
Прописка
Регистрация: 15.09.2008
Сообщений: 208
Сказал спасибо: 45
Сказали Спасибо 29 раз(а) в 24 сообщении(ях)
|
Запись/чтение в AT24C16.
Поясните "на пальцах" или примером в СИ как байтовый массив записать в несколько блоков в AT24C16.
Проблема: не могу перейти в следующий блок при заполнении предыдущего.
|
|
|
|
05.03.2017, 23:21
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
|
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-го уровня.
|
|
|
|
06.03.2017, 00:01
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
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; |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:09.
|
|