Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.51/63: Рейтинг темы: голосов - 63, средняя оценка - 4.51
RusykOk
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 56
1

i2c eeprom не могу записать больше 256 байт подряд

06.10.2016, 21:17. Просмотров 11631. Ответов 41
Метки нет (Все метки)

Код
#define I2C_PORT      GPIOB
#define I2C_SCL            GPIO_PIN_6      /* PB6     ------> I2C1_SCL */
#define I2C_SDA                 GPIO_PIN_7      /* PB7     ------> I2C1_SDA */
#define I2C_NUMBER              I2C1      /* номер периферии          */
#define I2C_EEPROM_ADDRESS      0x50            /* A0 = A1 = A2 = 0 // адрес микросхемы памяти */
#define I2C_EEPROM_PAGE_SIZE   16      /* размер страницы EEPROM для записи */
#define I2C_EEPROM_WRITE_DELAY   5               /* задержка после записи байта или блока данных */
#define I2C_EEPROM_TIMEOUT      5               /* таймаут доступа к памяти */

uint8_t xBuffer[2048];

void y2s_eeprom_write(uint16_t MemAddress, uint8_t *pData, uint16_t Size)
{
uint8_t Data[I2C_EEPROM_PAGE_SIZE]; // буфер для нарезки принятых данных в качестве параметра
uint16_t i = 0; // счетчик

while(i < Size) // большой масив данных будем записывать блоками в соответствии с методикой записи в EEPROM память
{
uint16_t j = 0;
while((j < I2C_EEPROM_PAGE_SIZE) && (i < Size)) // переписываем данные в массив допустимой длинны
{
Data[j] = pData[i];
i++;
j++;
}
if( HAL_OK != HAL_I2C_Mem_Write(&hy2s, (uint16_t)I2C_EEPROM_ADDRESS<<1, MemAddress, 1, Data, j, I2C_EEPROM_TIMEOUT))// запись блока
while(1);
MemAddress += I2C_EEPROM_PAGE_SIZE; // вычисляем адрес для следующей транзакции записи
HAL_Delay(I2C_EEPROM_WRITE_DELAY); // задержка при записи блока или байта данных
}
}

for(uint16_t i = 0; i < 2048; i++)
{
xBuffer[i] = 8;
}
prymtf("\r\n \r\n sizeof(xBuffer) = %u", sizeof(xBuffer));
y2s_eeprom_write(0, xBuffer, sizeof(xBuffer));
после записи 256 байт данные пишутся поверх ранее записанных с начального адреса.
выяснил что в процедуре I2C_RequestMemoryWrite (HAL_I2C_Mem_Write -> I2C_RequestMemoryWrite) растет значение DevAddress. такого как я понимаю не должно быть или нет?
память стоит 24с16 с чтением нет никаких проблем читается вся память
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2016, 21:17
Ответы с готовыми решениями:

STM32f303+EEPROM I2C
Всем добрый день! С полгода назад, начинал проект на камушке stm32f103, но...

stm32f373 i2c tsa5511+eeprom
не удается запустить синтез tsa5511 взял за основу код для eeprom ведь он тоже...

STM32F4 i2c eeprom 24hxx
Кто-то пробовал работать с STM32F4 y2s eeprom 24hxx или виртуальным STM32F4...

PIC16F84 - 24C256 - I2C - EEPROM - Assembler
Помогите кто чем может. Нужна программа на Assembler под микроконтроллер...

Быстрый поиск по внешней I2C EEPROM
1. Сразу скажу, что я осЁл, поэтому буду рад любым советам, в т.ч. тыканьем в...

41
RusykOk
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 56
09.10.2016, 16:06 41
Цитата Сообщение от sirktk
В этом случае я просто прибавляю 32 к 16-битному адресу памяти (ADR24C ) после каждой записи.
мне такое не подходит мне нужно хранить структуры: 350Б + 128Б + ... и все разные по объему. а если нужно будет изменить размерность какой нибудь структуры то опять искать в коде где она пишется и править в циклах? как то мне не очень Ваш вариант по душе. не очень он универсальный
0
sirktk
0 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 182
09.10.2016, 17:18 42
Цитата Сообщение от RusykOk
Цитата Сообщение от sirktk
В этом случае я просто прибавляю 32 к 16-битному адресу памяти (ADR24C ) после каждой записи.
мне такое не подходит мне нужно хранить структуры: 350Б + 128Б + ... и все разные по объему. а если нужно будет изменить размерность какой нибудь структуры то опять искать в коде где она пишется и править в циклах? как то мне не очень Ваш вариант по душе. не очень он универсальный

Ну тогда да.
Я же с ассемблера начинал. :-)
Всё везде по месту ручками правил. :-)
Но думаю, что вам принципа не избежать.
Должно быть понятие - текущий адрес записи в ЕЕПРОМ. 16-битный.
И надо будет тогда вам вычислять всегда - с какого адреса надо в данный момент писать.
Тогда гарантировано всё будет ложиться в нужное место.
0
09.10.2016, 17:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2016, 17:18

(Solved)I2C EEPROM не заводится (STM32F3-Disc|STM32F303VCT6)
(Решено) Доброй ночи. Не получается заставить STM32F3-Dysc | STM32F303VCT6...

Чтение неск.байт по I2C
Подскажите кодом, как правильно считать несколько байт по y2s. Как один...

I2C - не успеваю прочитать байт из буфера
#include &quot;stm32f10x.h&quot; #define MMA_W 0x1D&lt;&lt;1 #define MMA_R (0x1D&lt;&lt;1)|0x01...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru