I2C EEPROM bit-banging:写得很好,但前提是第一位未设置

电器工程 i2c eeprom
2022-01-23 10:22:02

我目前正在开发一个 I2C EEPROM 项目,使用 bit-banging 来驱动 SDA 和 SCL 线。

我的读取功能工作正常,但每当我写任何带有前导“1”的字节时,我总是读回FF;即使该字节之前已经用其他东西编程过。前导“0”是完美的。这不是我的阅读习惯;正如我在它返回FF的范围内看到的那样。

我正在寻找关于为什么会这样的建议。有什么明显的我可能会错过的可能导致问题的地方吗?[我无法发布代码 - 公司机密... :(]

我看到的每个波形都完全符合规范。我正在解耦 EEPROM。我的引体向上是 2.2k,所以在规格范围内。在这个原型中,我的时钟频率约为 500 Hz。芯片正在向我的每个字节发送 ACK,以便识别它们。但它只是不起作用......

我正在使用 Microchip 24LC256

一个字节的简化写入算法:

wait
SDA low
SCL low
wait
for each bit
    if bit is set:   SDA high
    if bit is unset: SDA low
    wait
    SCL high
    wait
    wait
    SCL low
    wait
wait
SDA high 
SCL high
wait
wait
check ACK status
SDA low
SCL low
wait
return ACK status

一个字节的简化读取算法:

wait
SCL low
SDA high
for each bit (8 bits)
    SCL high
    wait
    wait
    SCL low
    wait
    check and store received bit
    wait
do a NACK or ACK depending on if it is the last byte
4个回答

时钟再次变低后,您正在读取数据。您必须在调高时钟和调低时钟之间这样做。在时钟为低电平后,允许从机更改数据线,而不是在时钟为高电平时。

在此处输入图像描述

所以阅读应该是这样的:

wait
SCL low
SDA high
for each bit (8 bits)
    SCL high                      <--------
    wait
    check and store received bit  <--------
    wait
    SCL low                       <--------
    wait
    wait
do a NACK or ACK depending on if it is the last byte

最终的问题是,由于时序错误,我在某些情况下无意中发送了一个 STOP 条件。我放弃了使用示波器并拿出逻辑分析仪,并且能够在 15 分钟内解决问题,因为它突出显示了不应该存在的 STOP。我会根据最有帮助的答案来选择赏金的对象。感谢您提供所有解决方案。

好的,您的范围证明进入 PIC 的第一个字节是坏的,所以它不是 PIC 读取功能。

您是否在接收端验证了写入时序是否正常?

这在以下两种模式下都会失败吗?

- Byte mode sequential
- Page mode Sequential

规范显示“最重要的位 (MSB) 'b7' 首先发送” 这也与 b7=1 时一致,即整个字节作为 FF 读回。因此,要么在 b7=1 时不写入而仅将其擦除(故障条件),要么无论先前的内容如何,​​都将其读回为 FF 错误。由于每次写入都是写入前的字节宽擦除,它仍然是写入错误还是读取错误,或者第一个字节的时序不同。

建议: 在写/读期间验证PTC信号,以确保正常运行。 在此处输入图像描述

可以选择使用外部时钟来使用 PTC 对 E/W 周期的长度进行计时。 你试过用这个吗?

tE/W 循环时间

  • 内部振荡器 7ms 典型值
  • 外部时钟 4 ~ 10 ms min~max

它是否通过了这个标准?

听起来可能是几件事:

  1. 公交车上还有什么?是否会与另一个处于重置或未初始化状态的设备发生总线争用?
  2. 您是否正确更改了 I/O 引脚的方向?如果它在输出情况下工作正常,您可能无意中忘记将引脚的方向更改为输入,并且总是读取0xFF当您从中读取时,该引脚可以作为驱动总线的输出。
  3. 引脚本身和/或 I/O 线上是否有内部上拉电阻?微控制器通常给出一个电阻范围而不是一个固定值。您可能希望禁用微控制器上的上拉电阻,而只使用总线上的分立电阻,因为您可以从分立元件获得更精确的上拉电阻。
  4. 时钟极性 - 你确定你测量的是时钟/数据之间的正确边缘/相位吗?您可能会在示波器上显示对您来说很棒的东西,但如果相位不符合规定,您的所有 EEPROM 将看到的是0xFFs(并且很可能返回相同的值,因为它可能是无效的命令/条件)。