Easyelectronics.ru

Электроника для всех
Текущее время: 02 июн 2020, 11:11

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: EEPROM 24c08 проблемы с адресацией
СообщениеДобавлено: 08 сен 2019, 09:39 
Здравствуйте!

Зарегистрирован: 08 сен 2019, 09:24
Сообщения: 1
Хранил айпи адреса, порты и состояния в 24с64... но в последний раз не обнаружил их в городе. Прикупил 8
Нужно исправить рабочий код т.к. 64 слал 32 битные пакеты, а 8ке нужно 16. Плюс как я понял там еще адрес i2c меняется.
Чтение сделал так:
Код:
bool EEPROM_Load(uint16_t Address,void *data,size_t size_of_data)
{
   if(HAL_I2C_Mem_Read(&_EEPROM24XX_I2C,(uint16_t)_EEPROM_ADR|(Address&0x0003),Address>>2,I2C_MEMADD_SIZE_8BIT,(uint8_t*)data,size_of_data,100) == HAL_OK)   
      return true;
   else
      return false;      
}

Запись:
Код:
bool EEPROM_Save(uint16_t Address,void *data,size_t size_of_data)
{
   if(size_of_data > 16)
      return false;
   if(HAL_I2C_Mem_Write(&_EEPROM24XX_I2C,(uint16_t)_EEPROM_ADR|(Address&0x0003),Address>>2,I2C_MEMADD_SIZE_8BIT,(uint8_t*)data,size_of_data,100) == HAL_OK)
   {
      HAL_Delay(10);
      return true;
   }
   else return false;
}

Запись первого блока:
Код:
uint8_t   ReadEEPROM[16];
ReadEEPROM[0] = eeprom.ip[0];
ReadEEPROM[1] = eeprom.ip[1];
ReadEEPROM[2] = eeprom.ip[2];
ReadEEPROM[3] = eeprom.ip[3];
ReadEEPROM[4] = eeprom.sn[0];
ReadEEPROM[5] = eeprom.sn[1];
ReadEEPROM[6] = eeprom.sn[2];
ReadEEPROM[7] = eeprom.sn[3];
ReadEEPROM[8] = eeprom.gw[0];
ReadEEPROM[9] = eeprom.gw[1];
ReadEEPROM[10] = eeprom.gw[2];
ReadEEPROM[11] = eeprom.gw[3];                              
ReadEEPROM[12] = eeprom.srvip[0];
ReadEEPROM[13] = eeprom.srvip[1];
ReadEEPROM[14] = eeprom.srvip[2];
ReadEEPROM[15] = eeprom.srvip[3];
EEPROM_Save(0,ReadEEPROM,sizeof(ReadEEPROM));

и чтение:
Код:
EEPROM_Load(0,ReadEEPROM,sizeof(ReadEEPROM));
netInfo.ip[0] = ReadEEPROM[0];
netInfo.ip[1] = ReadEEPROM[1];
netInfo.ip[2] = ReadEEPROM[2];
netInfo.ip[3] = ReadEEPROM[3];
netInfo.sn[0] = ReadEEPROM[4];
netInfo.sn[1] = ReadEEPROM[5];
netInfo.sn[2] = ReadEEPROM[6];
netInfo.sn[3] = ReadEEPROM[7];
netInfo.gw[0] = ReadEEPROM[8];
netInfo.gw[1] = ReadEEPROM[9];
netInfo.gw[2] = ReadEEPROM[10];
netInfo.gw[3] = ReadEEPROM[11];      
servip[0] = ReadEEPROM[12];
servip[1] = ReadEEPROM[13];
servip[2] = ReadEEPROM[14];
servip[3] = ReadEEPROM[15];

Все работает... пока не начинаешь писать дальше:
Код:
ReadEEPROM[0] = (uint8_t)((eeprom.api_port & 0xFF00) >> 8);
ReadEEPROM[1] = (uint8_t)(eeprom.api_port & 0x00FF);                              
ReadEEPROM[2] = (uint8_t)((eeprom.srvport & 0xFF00) >> 8);
ReadEEPROM[3] = (uint8_t)(eeprom.srvport & 0x00FF);                              
EEPROM_Save(16,ReadEEPROM,4);

И это сразу затирает часть первой записи, при чтении
Код:
EEPROM_Load(0,ReadEEPROM,sizeof(ReadEEPROM));
netInfo.ip[0] = ReadEEPROM[0];
netInfo.ip[1] = ReadEEPROM[1];
netInfo.ip[2] = ReadEEPROM[2];
netInfo.ip[3] = ReadEEPROM[3];
netInfo.sn[0] = ReadEEPROM[4];
netInfo.sn[1] = ReadEEPROM[5];
netInfo.sn[2] = ReadEEPROM[6];
netInfo.sn[3] = ReadEEPROM[7];
netInfo.gw[0] = ReadEEPROM[8];
netInfo.gw[1] = ReadEEPROM[9];
netInfo.gw[2] = ReadEEPROM[10];
netInfo.gw[3] = ReadEEPROM[11];      
servip[0] = ReadEEPROM[12];
servip[1] = ReadEEPROM[13];
servip[2] = ReadEEPROM[14];
servip[3] = ReadEEPROM[15];
      
EEPROM_Load(16,ReadEEPROM,4);
api_port = ((uint16_t)ReadEEPROM[0] << 8) | ReadEEPROM[1];
servport = ((uint16_t)ReadEEPROM[2] << 8) | ReadEEPROM[3];

порты читаются коректно, а первые 16 байт не совсем то что в них писалось.
Подскажите где накосячил плиз! С 64ой не было такого


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: EEPROM 24c08 проблемы с адресацией
СообщениеДобавлено: 08 сен 2019, 12:01 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1471
Старшие биты адреса должны попадать в HW_ADR, а у тебя младшие.
Надо вот это переосмыслить
Код:
(uint16_t)_EEPROM_ADR|(Address&0x0003),Address>>2


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Cthulhu


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB