铁电存储的用法:MB85RC04 + MicroPython

关于铁电存储

单片机上的存储有两个极端:

  • RAM:存储速度快,但断电会丢失。
  • Flash、EEPROM:可以永久保存,但速度慢,并且可擦写寿命有限。

铁电存储器则集合了两者的优点:速度快、寿命长、断电可保存。缺点:价格贵,容量小。

所以铁电存储只适合需要频繁保存的小数据。

以 MB85RC04 为例:

  • 容量:4Kbit(512 个字节,价格2元,64Kb的4元(好像不是原厂的))
  • 寿命:10¹² 次/字节(每个字节地址可擦写一万亿次)
  • 数据保质期:35°C 环境下可保存 200 年,55°C 为 95 年,85°C 为 10 年
  • 电压:2.7~3.6V
  • 电流:操作时最大值 20μA,待机时 1μA

引脚:

编号 功能 说明
1 NC
2、3 A1、A2 用于设置芯片的地址。引脚悬空时为低电平
4 VSS 电源负极
5 SDA I2C 总线的 SDA 引脚
6 SCL I2C 总线的 SCL 引脚
7 WP 写保护(Write Protect)。高电平时不能写入。悬空为低电平
8 VDD 电源正极

MB85RC04 有 512 个字节的空间,寻址范围为 0~511,需要 9 个比特才能表示整个地址(2⁹=512)。而 I2C 每一份数据只能发 8 个比特,于是厂家把该芯片的 9 比特地址被拆分成两部分:第 1 个比特(即最高有效位 MSB)放到芯片的“设备地址”中,其余 8 个比特当作存储空间的地址。

所以芯片的“设备地址”构成为:

1010(MB85RC04 的固定地址部分) + A2 引脚 + A1 引脚 + MSB + 读写标志位(0:写,1:读)

MB85RC04地址

写入操作

时序图:

写入时序

例子:芯片的 A1、A2 悬空,将数字 12 写入到芯片第 0 个地址的位置。

那么设备地址为:1010 + 0(A2 引脚) + 0(A1 引脚) + 0(地址最高位为 0) + 0(写入)

转换成 16 进制为 0xa0。

from machine import Pin, SoftI2C
i2c = SoftI2C(scl=Pin(2), sda=Pin(3), freq=100000)	# 设置I2C引脚,频率不超400K

i2c.start()	# I2C的起始信号
i2c.write(b'\xa0') 		# a0=10100000 设备地址+写命令
i2c.write(bytes([0])) 	# 9比特地址的后8位
i2c.write(bytes([12])) 	# 要写入的内容
i2c.stop()	# I2C的停止信号

其中 bytes([0]) 可以将整数 0 转换成 b'\x00' 二进制字节串

上面的代码中,在 i2c.stop() 之前还可以继续调用 i2c.write() 写入其他数据,因为地址会自动后移。

读取操作

时序图:

MB85RC04读取时序

读取的操作比较特殊:在读取的时候,必须先发送写入的信号。等地址都发送完后,再发送读取的信号。

例子:A1、A2 悬空,读取第 0 个地址的内容。

写的信号为 0xa0,上面说过了。读的信号则是把最后的 0 改成 1,也就是 0xa1。

buf = bytearray(1)		# 用于存储要读取的内容的数组
i2c.start()
i2c.write(b'\xa0')		# 必需!先发送写操作
i2c.write(bytes([0])) 	# 9比特地址的后8位
i2c.start() 	# 关键!还要start一次,表示后面是读取命令
i2c.write(b'\xa1') 		# a1=10100001 设备地址+读命令
i2c.readinto(buf)  		# 读取buf中,读的数量等于buf的长度
i2c.stop()

每次要读取多少个字节,取决于 buf 数组的大小。例如当 buf = bytearray(5),那么 i2c.readinto(buf) 会一次性读取 5 个字节。


posted @ 2025-05-13 22:23  Hemmelfort  阅读(146)  评论(0)    收藏  举报