AT24C32、AT24C64都是大容量的,寄存器地址要用16位
如果I2C总线上只挂一个芯片,直接把写保护、A0、A1、A2全部拉低即可
I2C的读可以跨页,但是不能跨块,AT24C08等小容量的块大小是256K字节,AT24C64的块大小是8192字节,而且读的字节数越多,中间出错的概率也变大了,因此不建议一次性读取太多的字节数。
I2C的写是不能跨页的,因此要做到忽略硬件页的影响,需要自己设计算法,把应用层的一次写,在底层分为多次写来实现。
I2C读
先计算设备地址,这一步跟24C02、04、08、16是一样,先得到一个类似于A0、A2的设备地址,代码不能直接用,仅供参考。
这个地址末位的读写标志位,不需要我们操心,硬件I2C会自己帮我填。
/**
* @brief 获取从设备地址
* @param device : I2C设备序号,初始化时指定
* @param addr : 存储地址
* @retval uint16_t : 从设备地址
*/
uint16_t hg_eeprom_get_slave_addr(_I2C_TypeDef device, uint16_t addr)
{
hg_assert_param(device < I2C_MAX);
if (addr < eeprom_para.i2c[device].block_size * 1)
return 0xA0;
else if (addr < (eeprom_para.i2c[device].block_size * 2))
return 0xA2;
else if (addr < (eeprom_para.i2c[device].block_size * 3))
return 0xA4;
else if (addr < (eeprom_para.i2c[device].block_size * 4))
return 0xA6;
else if (addr < (eeprom_para.i2c[device].block_size * 5))
return 0xA8;
else if (addr < (eeprom_para.i2c[device].block_size * 6)