| 步驟 | 單片機(jī)1 | 單片機(jī)2 | A線 | B線 |
| 1 | 總線空閑 | 總線空閑 | 1 | 1 |
| 2 | 獲取總線控制權(quán) | 其它操作 | 0 | 1 |
| 3 | 向FRAM內(nèi)單片機(jī)2的數(shù)據(jù)接收區(qū)寫入一包通信數(shù)據(jù) | 其它操作 | 0 | 1 |
| 4 | 向B線發(fā)送走個(gè)負(fù)脈沖,通知單片機(jī)2,啟動(dòng)超時(shí)定時(shí)器 | 其它操作 | 0 | 負(fù)脈沖 |
| 5 | 其它操作 | 響應(yīng)來自B線的脈沖,讀取FRAM內(nèi)數(shù)據(jù)接收區(qū)的內(nèi)容(無須獲取總線操作) | 0 | 1 |
| 6 | 其它操作 | 對(duì)數(shù)據(jù)進(jìn)行處理后,向FRAM內(nèi)單片機(jī)1的數(shù)據(jù)接收區(qū)寫入回傳數(shù)據(jù)或通信失敗標(biāo)志 | 0 | 1 |
| 7 | 其它操作 | 向B線發(fā)送1個(gè)負(fù)脈沖,通知單片機(jī)1 | 0 | 負(fù)脈沖 |
| 8 | 清超時(shí)定時(shí)器,讀取數(shù)據(jù)區(qū)內(nèi)容。如果失敗可以做重發(fā)或其它處理;如果成功則拉高A線,釋放I2C總線,1次通信工程結(jié)束 | 其它操作 | 1 | 1 |
| 9 | 如果超時(shí)定時(shí)器溢出,說明單片機(jī)2沒有響應(yīng)單片機(jī)1的通知,可以做重發(fā)或故障處理 |
4 總結(jié)
通過實(shí)踐可知,以上方法是可行的。與其它方法相比具有發(fā)下優(yōu)點(diǎn):
①簡單。占用單片機(jī)口線少(SCL、SDA、握手線A、握手線B)。
②通用。軟件模擬I2C主機(jī)方式,可以在任何種類的單片機(jī)之間通信。
③高效。由于采用數(shù)據(jù)緩沖,可以在不同時(shí)鐘頻率、不同速度的單片機(jī)之間通信;讀寫數(shù)據(jù)時(shí),可以I2C總線的最高速度進(jìn)行,可以實(shí)現(xiàn)1次傳送大量數(shù)據(jù);在一個(gè)單片機(jī)向FRAM傳送數(shù)據(jù)時(shí),另一個(gè)單片機(jī)無須一一作出響應(yīng)或等待,可以進(jìn)行其它程序操作,提高軟件工作效率。
④靈活。通信硬件接口對(duì)于各個(gè)單片機(jī)是對(duì)等的,通過軟件配置,每個(gè)單片機(jī)既可以根據(jù)需要主動(dòng)發(fā)送通信,也可以只響應(yīng)其它單片機(jī)的呼叫。
⑤容易擴(kuò)展。通過增加地址識(shí)別線,修改通信協(xié)議,即可做到多機(jī)通信。
以下是需要注意的地址:
①為了提高通信效率,握手線B最好使用中斷端口,負(fù)脈沖寬度一定要滿足速度較低單片機(jī)中斷信號(hào)要求。如果沒有中斷的話應(yīng)增加1條口線,用改變端口狀態(tài)的方法通知對(duì)方,等待對(duì)方查詢,而不是負(fù)脈沖。
②向?qū)Ψ桨l(fā)送負(fù)脈沖時(shí),應(yīng)屏蔽自己的中斷。
③由于參數(shù)與通信緩沖區(qū)同時(shí)設(shè)在同一片F(xiàn)RAM內(nèi),要避免對(duì)參數(shù)部分的誤操作。一個(gè)較好的解決辦法是把參數(shù)存放在地址的后半部分(A2=1),在進(jìn)行通信操作時(shí),把FRAM的WP引腳拉高(地址在后半部分的單元寫保護(hù)),這樣可以有效地防止測驗(yàn)時(shí)對(duì)參數(shù)區(qū)誤操作。
④由于I2C總線在一個(gè)時(shí)間段內(nèi)只有1個(gè)主機(jī)和1個(gè)從機(jī),所以當(dāng)1個(gè)單片機(jī)正在寫通信數(shù)據(jù)時(shí),另一個(gè)單片機(jī)是不能對(duì)FRAM進(jìn)行操作的。如果需要實(shí)時(shí)、頻繁地讀取FRAM中參數(shù)的話,請預(yù)先將參數(shù)讀入RAM單元使用或另外增加專門存放參數(shù)的芯片。





