Понадобилось по-быстрому запилить простой “программатор” EEPROM микросхемы, да чтоб читать/писать память её можно было через юзерское приложение в Windows. И что-то я подзатупил изначально с адресацией памяти.Для работы с EEPROM (и не только) в STM32CubeF4 библиотеке есть функции
HAL_I2C_Mem_Read и
HAL_I2C_Mem_Write, инициализацию I2C генерит приложение STM32CubeMX, в общем-то халява, осталось использовать функции, передать данные из/в компьютер и девайс готов. Однако меня сбил с толка параметр функций
uint16_t MemAddSize, который может быть равен
I2C_MEMADD_SIZE_8BIT или
I2C_MEMADD_SIZE_16BIT. В моей микросхеме 2048 байт памяти и логично предположить, что мне нужен вариант
I2C_MEMADD_SIZE_16BIT, т.е. 16 бит на адрес,ибо 8 бит хватит только на адресацию 256 байт.
А вот и нет. Память “побита” на блоки по 256 байт, выбор ID блока происходит через запись соответствующего ID в биты 1,2,3 байта адреса устройства:
Их можно трактовать как ID 256-байтного блока или просто как старшие дополнительные 3 бита адреса памяти (как в таблице и указано). То есть адресация здесь 11 битная.
Собственно, адрес _устройства_ получаем таким образом: 0xA0 | ((memory_address >> 7) & 0xE). Нулевой бит по идее контроллируется библиотекой и делать операцию битового чтения & 0xF по идее не нужно. Но опыт подсказывает, что доверять библиотеке Cube от ST не стоит )
Вдруг кому сэкономит время )
Unknown
while (1)
{
HAL_I2C_Mem_Read(&hi2c1, 0x50 << 1, 0x03, 1, &xBuffer[0], 1, 1000);
HAL_UART_Transmit(&huart1, &xBuffer[0], 1, 0xFFFF);
HAL_Delay(1000);
}
не читает 24lc01. во все ячейки 24lc01 программатором записано значение 55.