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
之外没有发生任何奇怪的事情。那么可能有什么问题呢?
- 确认是否满足所有总线时序要求。
- 确认每个写周期后的延迟是否足够(5 毫秒)
- 确认总线电容是否低于 I2C 允许的限制(400 pF - 理论上)。
- 确认是否提供了正确的 VCC
如您所述,您正在使用电缆将 EEPROM 与 MCU 连接,您需要符合电容要求。
你可以用示波器检查一下它们的波形是否有失真。可以用LCR表测电容。
尝试将总线速度从 25kHz 降低到 50kHz 并检查波形。
尝试增加拉力阻力的强度。
错误的 VCC 容量(例如 4.2v 而不是 5v)的问题是,时序可能不同。 (未完全验证,但已解决问题)
这让我抓狂了几天,也许你们可以给我一些关于问题所在的见解。
我正在尝试使用 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
之外没有发生任何奇怪的事情。那么可能有什么问题呢?
- 确认是否满足所有总线时序要求。
- 确认每个写周期后的延迟是否足够(5 毫秒)
- 确认总线电容是否低于 I2C 允许的限制(400 pF - 理论上)。
- 确认是否提供了正确的 VCC
如您所述,您正在使用电缆将 EEPROM 与 MCU 连接,您需要符合电容要求。
你可以用示波器检查一下它们的波形是否有失真。可以用LCR表测电容。
尝试将总线速度从 25kHz 降低到 50kHz 并检查波形。 尝试增加拉力阻力的强度。
错误的 VCC 容量(例如 4.2v 而不是 5v)的问题是,时序可能不同。 (未完全验证,但已解决问题)