單片機 (MCU) 如何才能不死機之 IIC 操作

topsemic 發佈 2020-01-13T10:52:45+00:00

下面是實測的 24C02 讀寫時序:Byte Write Byte Read Page Write Page Read 代碼:https://github.com/TopSemic/STM32_Controller_24C02 擴展閱讀資料:I2C specification a

EEPROM可以掉電保存數據,是一種在產品中經常使用的器件,24Cxx 系列更是被廣泛採用。

文章附件的工程在 24LC02 上調試通過,實現了字節讀寫和頁讀寫。MCU 是 STM32F030。採用了 MCU 的硬 I2C 控制器。

24LC02硬體連接:

A2,A1,A0 接 GND, 地址為 A0。

WP 接 GND,允許寫入。

24LC02 Page size 是 8 Bytes, 一共 256 個字節大小。

如果要移植代碼到其它晶片,需要注意 Page size 和頁地址的不同。


網上有很多抱怨使用硬體 I2C 控制器不穩定,常常死機,所以轉而採用 GPIO 模擬 I2C 時序的同學。我們還是不推薦用模擬的方法,它會耗費比較多的MCU 系統時間。硬體 I2C 其實也是可以穩定運行的,需要注意以下幾點:

1. 看一下晶片勘誤表 Errata,有沒有已知 Bug。

2. I2C 操作中途被打斷,或受到脈衝干擾,SCL, SDA 可能被拉低鎖死。嘗試用 SCL 產生 9 個時鐘脈衝讓從器件或主控制器釋放總線。這種方法可以解決掉絕大部分問題。這裡需要注意,拉低總線的並不一定是從器件,有客戶在總線鎖死後,把 SCL SDA 線割斷後發現這兩根線任然是拉低的(主控制器模塊因為時序問題進入死鎖)。

3. 總線上加具有總線恢復功能的緩衝器,如 LTC4307。

4. 選用帶復位輸人的 I2C 從器件。

5. 控制 I2C 從設備的電源,死鎖後重新上電。

採用哪些方法,還是要綜合考慮可靠性要求和成本。

下面是實測的 24C02 讀寫時序:

Byte Write

Byte Read

Page Write

Page Read

代碼:

https://github.com/TopSemic/STM32_Controller_24C02

擴展閱讀資料:

I2C specification and user manual

http://www.nxp.com/documents/user_manual/UM10204.pdf

關鍵字: