STM32F0 硬件I2C读取AT24C64

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)
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值