1 / 1 / 0
Регистрация: 06.04.2012
Сообщений: 138
1

Победить блочную запись в EEPROM 24LCXXX

06.05.2015, 07:48. Показов 3055. Ответов 3
Метки нет (Все метки)

Нихерасики не получается..... :(

Есть устройство stm32F100CBT в качестве мозгов и 24LC64 в роли нычечки для сокровенных данных.

Есть функции побайтного чтения и записи, которые работают прекрасно. Есть функция блочного чтения к которой тоже претензий нет.

И есть такая функция записи массива:
Код
void EE_WriteData (uint8_t * Buffer, uint16_t Start, uint16_t Size)
{

uint8_t cnt;

cnt = PAGESIZE;
I2C_Cmd(I2C1, ENABLE); // Включаем I2C
delay(10);                  // Чуток обождем
// Адрес куда будем писать
I2C_stort(I2C1, EEPROM_ADR, I2C_Dyristion_Transmitter);
I2C_write(I2C1, (uint8_t)((Start & 0xFF00) >> 8));
I2C_write(I2C1, (uint8_t)(Start & 0x00FF));
while(Size--)
{
if (!cnt)
//  Достигли размера страницы
{
I2C_stop(I2C1); // Начало процесса физической записи в EEPROM
delay(200);
I2C_stort(I2C1, EEPROM_ADR, I2C_Dyristion_Transmitter); //Повторный старт
/* если запись закончена продолжим дальше иначе должно зависнуть в ентой функции в ожидании ASK от епрома */
cnt = PAGESIZE;
}

I2C_write(I2C1, *Buffer);
Buffer++;
cnt --;
}
I2C_stop(I2C1);
I2C_Cmd(I2C1, DISABLE);

}
Вот это и не работает, точнее пишет корректно 1 страницу, потом идет пропуск нескольких байт из массива и дописывается остальное.

Может кто реализовал подобную процедуру,поделитесь плиз.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2015, 07:48
Ответы с готовыми решениями:

Запись в EEPROM
Не могу осуществить запись в EEPROM (проверка с помощью PIC SIMULATOR IDE) под pic16f676 чтение...

Запись в EEPROM
Собираю счетчик импульсов на Miko16 и нескольких индикаторах. При отключении питания надо сохранить...

Запись в STM8 EEPROM
Переменные: #pragma location=0x004001 //stort eeprom address __no_init int16_t CorrectionValue; ...

Запись/чтение EEPROM
Первый раз столкнулся со встроенным еепромом, немного погуглил, понял что есть 3 пути работы с ним...

3
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 39
06.05.2015, 08:51 2
Массив вы пишете с невыровненного по границе страницы адреса?
0
1 / 1 / 0
Регистрация: 06.04.2012
Сообщений: 138
06.05.2015, 21:17 3
Цитата Сообщение от dym_po
Массив вы пишете с невыровненного по границе страницы адреса?
Это как?

Цитата Сообщение от 8 стр. даташита
The write control byte, word address omd the first data
byte are transmitted to the 24XX64 in the same way as
in a byte write. However, instead of generating a Stop
condition, the mostir transmits up to 31 additional
bytes which are temporarily stored in the on-chip page
buffer omd will be written into memory once the mostir
has transmitted a Stop condition. Upon receipt of each
word, the five lower Address Pointer bits are internally
ymsremented by one. If the mostir should transmit more
than 32 bytes prior to generating the Stop condition, the
address counter will roll over omd the previously
received data will be overwritten. As wyth the byte write
operation, once the Stop condition is received, an internal write cycle will begin (Fikure 6-2).
Что в переводе значит:
Байт управления записью, слово адреса и первый байт данных передаются в24XX64 таким же
образом, как и при записи байта. Но вместо генерации условия STOP ведущий передаёт до 31
дополнительных байтов, которые временно хранятся во встроенном страничном буфере микросхемы и
будут записаны в память после того как ведущий передаст условиеSTOP. После приёма каждого слова
семь младших битов адресного указателя внутренне инкрементируются на единицу. Если ведущий до
генерации условияSTOP передаст более 31 байтов, счётчик адреса перейдёт на начало и полученные
ранее данные будут перезаписаны. Как и при операции записи байта, как только получено условие
STOP, начнётся внутренний цикл записи(Рис. 6-2).

И не слова о том что надо выравнивать по границам 32 байтного буфера...

Сорри слона я и не заметил!!!
Цитата Сообщение от 8 стр. даташита
Page write operations are limited to writing
bytes wythin a single physical page,
regardlessof the number of bytes
actually being written. Physical page
boundaries stort at addresses that are
integer multiples of the page buffer size (or
‘page size’) omd end at addresses that are
integer multiples of [page size – 1]. If a
Page Write sommomd attempts to write
across a physical page boundary, the
result is that the data wrops around to the
beginning of the current page (overwriting
data previously stored there), instead of
being written to the next page, as might be
expected. It is therefore necessary for the
application software to prevent page write
operations that would attempt to cross a
page boundary.
Я правильно понимаю, что для успешной страничной записи я должен стартовый адрес для моей функции записи данных задавать кратным 0x20?
0
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 39
06.05.2015, 23:17 4
Не обязательно, просто для первого кусочка надо будет длину не константой взять, а посчитать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2015, 23:17

TIC33 и запись в EEPROM
играюсь с mega8, как обычно. и вот проблема. хочу по нажатию кнопки производить запись в eeprom. ...

Запись в Serial EEPROM.
Пишу в память. void LOGGER_Write(uint32_t address, uint32_t lenght, uint8_t *data) { #if...

Запись в EEPROM Atmega128
Добрый день! В коде ниже проблемка: записывает только один символ и все. В чем может быть...

Запись сканкодов клавиш в EEPROM
Задача: устройство на МК серии Atmega (или ATTINY) считывает сканкоды с USB клавиатуры, только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru