铁电存储的用法: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:读)

写入操作
时序图:

例子:芯片的 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() 写入其他数据,因为地址会自动后移。
读取操作
时序图:

读取的操作比较特殊:在读取的时候,必须先发送写入的信号。等地址都发送完后,再发送读取的信号。
例子: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 个字节。

浙公网安备 33010602011771号