繁体   English   中英

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

[英]I2C between EEPROM and Arduino working, not with STM32

这让我发疯了几天,所以也许你们可以给我一些有关出问题的见解。

我正在尝试从带有STM32(F0)的EEPROM( 24LC16B )中读取一些数据,但它不允许我这样做。 我试过了一个Arduino,该Arduino可以正常工作,所以我知道接线正确。

这是我读取EEPROM数据的功能。 (它只是为了测试而缩减 ):( 我的I2C_setup函数的astebin)

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;
}

这是我使用的Arduino库的pastebin

我曾经使用逻辑分析仪来查看通信的进行情况,但现在我真的不明白。 这是工作中的Arduino版本的打印屏幕: Arduino EEPROM通讯

这是STM32通信的打印屏幕: STM32 EEPROM通讯

逻辑分析仪导出(可通过Saleae Logic查看)

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

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

正如您提到的,使用电缆将EEPROM与MCU连接时,需要遵循电容。

您可以使用示波器检查其波形是否失真。 您可以使用LCR表检查电容。

尝试将总线速度从25kHz降低到50kHz,然后检查波形。 尝试增加抗拉强度。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM