Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2019, 07:25

Часовой пояс: 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
Сообщения: 1002
Старшие биты адреса должны попадать в HW_ADR, а у тебя младшие.
Надо вот это переосмыслить
Код:
(uint16_t)_EEPROM_ADR|(Address&0x0003),Address>>2


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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