EEPROM 和 Arduino 之间的 I2C 工作,不适用于 STM32

I2C between EEPROM and Arduino working, not with STM32

这让我抓狂了几天,也许你们可以给我一些关于问题所在的见解。

我正在尝试使用 STM32(F0) 从 EEPROM (24LC16B) 读取一些数据,但它不允许我这样做。我试过一个 Arduino,它可以工作并且仍然可以工作,所以我知道接线是正确的。

这是我读取EEPROM数据的功能。 (删减到最基础,仅供测试):(Pastebin of my I2C_setup function)

uint16_t readEEPROMData(uint16_t deviceAddress, int memAddress){
    // Wait while I2C peripheral is not ready
    I2C_WaitForFlag(I2C_ISR_BUSY);

    // Start I2C write transfer for 2 bytes, do not end transfer (SoftEnd_Mode)
    I2C_TransferHandling(I2C1, 0xA2, 2, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
    I2C_WaitForFlag(I2C_ISR_TXIS);

    // For testing purpose, be sure to generate a stop command...
    I2C_TransferHandling(I2C1, 0xA2, 0, I2C_AutoEnd_Mode, I2C_Generate_Stop);

    return I2C_COMM_STATUS;
}

Here's an pastebin of the Arduino library I used.

之前用逻辑分析仪看通信是怎么回事,现在实在是看不懂了。这是工作的 Arduino 版本的打印屏幕:

下面是 STM32 通信的打印屏幕:

Logic analyzer exports (viewable with Saleae Logic)

如您所见,我使用了相同的地址(尽管我必须将 0xA2 与 STM32 一起使用),并且除了 NACK 之外没有发生任何奇怪的事情。那么可能有什么问题呢?

  1. 确认是否满足所有总线时序要求。
  2. 确认每个写周期后的延迟是否足够(5 毫秒)
  3. 确认总线电容是否低于 I2C 允许的限制(400 pF - 理论上)。
  4. 确认是否提供了正确的 VCC

如您所述,您正在使用电缆将 EEPROM 与 MCU 连接,您需要符合电容要求。

你可以用示波器检查一下它们的波形是否有失真。可以用LCR表测电容。

尝试将总线速度从 25kHz 降低到 50kHz 并检查波形。 尝试增加拉力阻力的强度。

错误的 VCC 容量(例如 4.2v 而不是 5v)的问题是,时序可能不同。 (未完全验证,但已解决问题)