前言:
恩智浦在30多年前发明了I2C总线,通过简单但功能强大的串行结构取代了复杂的并行接口,彻底改变了芯片与芯片之间的通信。
它采用简单的双线格式,每次传送一位数据,执行芯片间的寻址、选择、控制和数据传输,速度可达100MHz(标准模式)、400KHz(快速模式)。
1MHz(快速模式+)、3.4MHz(高速模式)或5MHz(超快速模式)等应用。


在 I2C 总线的应用衍生中,应用于 DDR 内存模块的温度感知内置 SPD 功能 IC SE97B 的确是一种非常特别的应用。
因为其特性为复合IC,除了需要随时监测DDR内存模块的温度状况外,还内置了256字节的EEPROM供客户存放该DDR内存模块的厂商信息。
所以 SE97B 这颗 IC 在 I2C 接口共提供了三种地址:

温度传感器
b. EEPROM
c. EEProm 软件保护指令
最近有个客户发现 SE97B EEPROM 无法写入的问题,希望我们帮忙分析。后来在解决客户疑问后,觉得这个问题挺有趣的,所以在这里分享给大家分析一下。
客户说这颗有问题的 SE97B 大约是在生产线上反复读写 EEProm 大约 600 次左右就发现 EEProm 某些地址无法再次写入。
但是规格书中载明 EEPROM 可循环写入清除共 10 万次。

拿到该 IC 后,使用工具进行了一些 EEPROM 的写入和读取测试。
| 时间 | 模块 | 读/写 | 主/从 | 功能 | 比特率 | 地址 | 长度 | 数据 |
| 06:20.1 | I2C | I2C比特率设置为:400 | ||||||
| 06:20.1 | SPI | SPI比特率设置为:4000 | ||||||
| 06:24.2 | I2C | I2C上拉电阻已禁用 | ||||||
| 07:39.7 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 1 |
| 07:39.7 | I2C | RegR | M | --- | 400 | 0x50 | 1 | 0 |
| 07:47.6 | I2C | W | M | --- | 400 | 0x50 | 2 | 01 FF |
| 07:49.3 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 1 |
| 07:49.3 | I2C | RegR | M | --- | 400 | 0x50 | 1 | 0 |
| 08:06.9 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 55 |
| 08:06.9 | I2C | RegR | M | --- | 400 | 0x50 | 1 | 6E |
| 08:09.0 | I2C | W | M | --- | 400 | 0x50 | 2 | 55 FF |
| 08:11.4 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 55 |
| 08:11.4 | I2C | RegR | M | --- | 400 | 0x50 | 1 | 6E |
| 08:28.2 | I2C | RegW | M | --- | 400 | 0x50 | 1 | FF |
| 08:28.2 | I2C | RegR | M | --- | 400 | 0x50 | 1 | FF |
| 08:34.8 | I2C | W | M | --- | 400 | 0x50 | 2 | FF 00 |
| 08:36.4 | I2C | RegW | M | --- | 400 | 0x50 | 1 | FF |
| 08:36.4 | I2C | RegR | M | --- | 400 | 0x50 | 1 | 0 |
| 09:01.4 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 铁 |
| 09:01.4 | I2C | RegR | M | --- | 400 | 0x50 | 1 | FF |
| 09:04.6 | I2C | W | M | --- | 400 | 0x50 | 2 | FE 00 |
| 09:06.3 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 铁 |
| 09:06.3 | I2C | RegR | M | --- | 400 | 0x50 | 1 | 0 |
| 09:12.6 | I2C | W | M | --- | 400 | 0x50 | 2 | FE 55 |
| 09:13.8 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 铁 |
| 09:13.8 | I2C | RegR | M | --- | 400 | 0x50 | 1 | 55 |
| 09:47.2 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 80 |
| 09:47.2 | I2C | RegR | M | --- | 400 | 0x50 | 1 | FF |
| 09:50.6 | I2C | W | M | --- | 400 | 0x50 | 2 | 80 55 |
| 09:52.6 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 80 |
| 09:52.6 | I2C | RegR | M | --- | 400 | 0x50 | 1 | 55 |
| 10:10.4 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 7F |
| 10:10.4 | I2C | RegR | M | --- | 400 | 0x50 | 1 | FF |
| 10:15.4 | I2C | W | M | --- | 400 | 0x50 | 2 | 7F 55 |
| 10:17.0 | I2C | RegW | M | --- | 400 | 0x50 | 1 | 7F |
| 10:17.0 | I2C | RegR | M | --- | 400 | 0x50 | 1 | FF |
解析内容:
- 对 01h 先读取,值为 0,然后对 01h 写入 FF,读回为 0,证明 01h 无法写入。
- 对 55h 先读取,值为 6F,然后对 55h 写入 FF,读回为 6F,证明 55h 无法写入。
- 对 FFh 先读取,值为 FF,然后对 FFh 写入 00,读回为 0,此时发现 FFh 可正常写入。
- 后续又对 FEh 及 80h 也是先读后写,这两个位置也都可以写入。
- 最后先读取 7Fh,值为 FF,此时对 7Fh 写入 55,读回值仍为 FF,证明 7Fh 无法写入。
由以上得知此颗 SE97B 0h~7Fh 无法写入,而从 80h ~ FFh 仍可正常读写。
从规格书上说明得知前128字节可由软件保护住,符合客户这颗IC的验证状态。

由规格书得知保护方式有三种:PWP(永久写入保护)、RWP(可逆写保护)、CRWP(清除可逆写入保护)
但由于除了 PWP 以外,RWP 和 CRWP 都需要 A0 Pin 接 7~10V 电压配合,这较不符合客户硬件环境可能发生的状态。
所以就朝着 PWP 方向再进行澄清。

从规格书中确认在软件保护状态下,PWP下30h SE97B不会响应。

经验证,这颗 SE97B 果然没有响应 ACK。
最后与客户解释,由于 PWP 是不可逆的,
客户只能在软件上避免符合以下格式 30h -> XXh -> XXh 这样连续 3 种 Byte 的写法,以避免 IC 被写入 PWP 永久写入保护。

另外,SPD 在 DDR 内存模块中本来就是用于厂商信息记录用途,在完成数据写入后进行 PWP 也是正常程序,以避免以后数据被改写。
也许做 PWP 才是这颗 IC 在正常应用中应该执行的程序。
