【哈爾濱工業大學】《單片機原理》(建議收藏) P36 - 36. 12.2-AT89S51單片機的串行擴展技術(2)

长安书院_
146粉絲
2026年11月15日
AI 生成·可能包含錯誤
這裏面大家要注意iPhone7系統允許多個主器件
換句話說這個系統裏面允許多個單片機
但是大家要注意多個單片機的話
這個就要有iPhone7的總線中臺協議
這個總線中臺呢我們這課裏沒有
也不需要講
爲什麼呢因爲大家現在做的系統
iPhone7系統都是單組系統
不是多組
但是呢大家一定要注意
它是允許多個主器件
這個大家要注意
主器件一般都由控制器單片機來擔當
下面介紹iPhone7總線的數據傳送
首先它就是通過一條數據線來傳送數據
靠什麼呢
靠時鐘來同步
那麼這個數據位什麼時候是有效的呢
大家注意所謂的數據位就是這個數據線上的電瓶
但是這個電瓶是什麼時候有效
這個大家一定要注意
那麼當時鍾線爲高電瓶的時候
數據線上的數據必須保持穩定
必須保持穩定
iPhone7的協議最基本的規定
只有在時鐘線爲低電瓶的時候
數據線的電瓶纔會允許變化
大家看一下這個圖
大家看啊
時鐘線爲高電瓶的話
你數據線的電瓶一定要穩定
這時候有效
就這陰影這部分
這個也是
那什麼時候數據線上電瓶允許變化呢
就是當時鍾線爲低電瓶的時候
這個就允許數據線上的數據變化
這個大家一定要記住
那麼iPhone7總線協議
就是在進行數據傳送的時候
是遵循iPhone7總線協議的規定
這個協議規定什麼呢
數據傳送由起始信號開始
由終止信號結束
大家注意
起始信號的縮寫呢
終止信號是P
那麼大家一定要注意
當主機發出起始信號以後
這個總線就處於佔用狀態
主機發出終止信號的話呢
總線就處於空閒狀態
大家一定要注意
空閒狀態時候
這兩根線都爲高電瓶
假設有一個氣線爲低電瓶
這根線就爲低電瓶
那麼當你傳送結束的話呢
一定都釋放這個總線
所謂釋放呢
讓這兩個線都爲高電瓶
那麼大家看一看
什麼時候是起始信號
注意看這個地方
非常重要
當你始終線爲高電瓶的時候
剛纔說了
如果數據上傳送的數據
是數據的話
一定保持電瓶穩定
但是大家看一下啊
數據線有一個由高到低的負調變
表明我現在這是起始信號發出來
我下面就要傳數據了
那什麼時候數據發完並且接收
然後主機告訴傳送結束呢
這裏有個終止信號
看到啊
當始終信號爲高電瓶的話
數據信號由低向高的調變
這個信號就是終止信號
大家一定要清楚
好
那麼當終止信號產生的話
這總線上的所有操作都結束了
總線就處於空閒態
也就都是高電瓶狀態
好
下面再看一下
在總線上進行數據傳輸的應答
大家注意啊
iPhone7總線進行數據傳送的話呢
這字節數沒有限制啊
我們把它這個字節數
這一個字節八位數
八位
我們叫做一幀
數據幀沒有限制啊
但是呢
一個字節必須保證是八位長度
先發最高位
再發
最後發出最低那位
然後要跟着一個什麼呢
應答位
所以這一幀信息呢
是九位
那麼這個應答位
大家注意看在這兒
看着
把這個時期看明白
這是主機啊
主機的數據線
這個是主機的時鐘線
大家注意看啊
這個期間是起始信號
然後呢
主機呢
就開始發送數據啊
那麼大家看啊
重機在這一段的話
這個有個應答線和非應答
那麼大家注意
一幀信息完成後
就傳送完成後
主機發重機
那麼大家一定要注意
重機要給個應答
要給個應答
大家注意應答信號呢
是這樣
往下來
應答信號是A
那麼如果不由高變低
是一直高電平的話呢
它是非應答信號
所以大家一定要注意
當主從兩個器件進行數據傳送的話
串行傳送的話
那麼時序是這樣
要有個起始位
最後呢
要有個應答位
好
大家一定要分清這個圖啊
這是主機的失蹤
這是主機的數據線
失蹤線
這個是重機的數據線
那麼應答信號
非應答信號
它的表達呢
應答信號是A
非應答信號呢
A非
好
所以大家注意
iPhone7總線傳每一個字節數據
後面都要跟個應答信號
在第九個失蹤位上出現
大家注意啊
那麼
失蹤信號一直是由主機來控制
那麼你要給個應答信號的話呢
大家一定要注意
發房一定要在這個失蹤位
使這SDA線一定要釋放
是高電平狀態
那麼收房呢
在這一位上才能發出一個低電平應答信號
大家一定要注意
主機控制着這個SDA線
你要這個SDA線
你主機把它拉低了
那重機它就沒法發應答信號
這個應答信號是由重機發出來
拉住這個
所以在這之前
SDA線呢
一定是高電平狀態
好
那麼大家注意
注意啊
剛纔呢
如果是主機接收來自重機的數據的時候
你主機收到的最後一個字節
必須給重機發一個非應答信號
大家注意
要不剛纔有同學說
這兩個信號是區別在哪呢
大家都併到這根線上
主機發數據給重機
重機收到這個數據以後
要發一個應答信號
但是
如果重機發數據給主機
主機收完這一幀信息
要給出一個非應答信號
A非
所以
要注意A非和A的區別
好
那麼
收到這些應答信號以後呢
就可以結束數據傳輸
大家注意
當重機發給主機一個非應答信號的話呢
大家注意
重機這時候控制內存線是不是高帶不停
也就釋放數據線了
然後主機呢
才能發送一個終止信號
對吧
我們看到前面那波形
好
下面我們看一下iPhone7總線的數據針格式
那麼iPhone7總線
在進行通訊的話呢
它傳輸的信號
首先有數據信號
大家要注意
它還有個地址信號
所以大家一定要注意
在通訊的協議裏面
規定好了
你發送起始信號以後
必須先發一個重機的地址
群址
席位
然後呢
大家一定要注意
你還有一個數據傳送的方向位
是讀還是寫
換句話說
你對重機是讀它的數據
還是寫它的數據
那由第八位來定
1表示主機讀
就主機接收數據
0表示主機發送數據
所以呢
地址
這部分內容呢
它有七位重機地址
然後還有一個方向位
還有一個方向位
好
大家注意
每次數據傳送的時候呢
都是由主機來產生中子信號
然後結束這個數據傳送
如果主機希望繼續再用這個總線
進行新的數據傳送的話呢
它可以不產生這個中子信號
剛纔已經說了
中子信號呢
是什麼情況下產生的
那麼這時候呢
它可以
它不希望中子和重器件之間產生重器
那麼它可以再次發起
對另一個重機進行尋址
但是要尋址的話
先發一個起始信號
那麼在總線進行一次數據傳輸過程當中呢
可以有幾種組合方式
什麼意思呢
主機連着對重機寫讀
還有呢
主機對這個重機讀完了
再對另一個重機讀或者是寫
那麼下面看一下這幾種重機方式
這個主機向重機發送N字節數據
大家注意看啊
這個數據傳送格式
這個FUN是帶黑影的
這部分是主機向重機發送的
FUN是不帶黑影的部分
是重機向主機發送的
先看這個啊
第一種組合主機向重機發N字節
通過iPhone7總線
那它的格式是這樣
先發一個起始位
對吧
開始位也叫起始位
然後發出七位重機地址
然後再發出個零
零是讀還是寫啊
想一想
表示主機發送數據
所以大家注意
主機向重機發送數據
這個零表示前面地址是發出去的
讓重機接收
尋指和哪個重機進行傳送去
然後大家注意
重機收到這個信號以後
給一個應答
實際上是SDA
它拉SDA那根線爲低電平
這叫應答信號
然後主機再發第一個字節
然後重機收到以後
再給個應答信號
一直髮到第N個字節
N在這兒
然後呢
大家注意這裏就有兩種選擇了
主機想結束這個通訊
那就重機給個A
如果不結束這個通訊
還要和其他系列人要給個A非
然後大家注意
如果就單單是主機向重機發N字節數據
而且發送完了
最後就給個終止信號就行
這是一種格式
一種格式
大家看這個格式的話一定要清楚
陰影部分是主機發的
沒有陰影部分是重機發的
好
這是第一種
第二種格式
主機接收來自重機的N個字節
大家注意
這個通訊的過程也是由主機發起的
主機先發一個S起始信號
再發七位地址
然後大家注意
這一位呢
是讀還是寫呢
讀
因爲是接收來自重機的N個字節
一表示讀
然後重機呢
給個應答信號
然後重機發字節1
然後大家注意
再給個應答信號
然後一直到字節N
大家注意
這是主機發出來的
主機發出來
然後就停止
那麼主機發這個信號的目的是什麼呢
向重機表明
我的讀操作要結束
大家注意
要不非常疑惑
前面爲什麼還有個A非
所以這個格式呢
比較好地表達了
表現了
主機讀重機發來的N字節的數據
就通過那一根數據線
好
還有主機的讀寫操作
大家注意
如果在一次數據傳輸過程當中
主機先發送一個字節的數據
然後再接收一個字節數據
那麼這時候
大家一定要注意
這時候起始信號和重機地址
都必須重新產生一次
但是讀寫的方向爲正好相反
先發後收
大家看看這格式
這主機發起的起始信號
發出一個重機地址
然後
大家注意
主機發送一個字節的數據
當然
發重機地址以後
重機收到以後
重機給個應答
然後主機再發一個字節數據
然後大家注意
也可能
重機回答是A
也可以是A非
大家注意
這個是重機又發出的一個新的起始信號
完了是另一個重機的重機地址
然後是接收
表示接收讀的意思
然後重機給個應答信號
然後重機把那數據發給主機
然後最後主機呢
發出一個A非
然後發出一個D
那麼這個格式
大家一定要注意
它是主機先發送一個字節的數據
然後再接收一個字節的數據
這時候起始信號
你看S和SR
它是兩個不同的重機地址
都被重新產生一次
那地址也不一樣
因爲不同的重機
好
注意
不管上述哪種方式
起始信號
終止信號和重機地址
實際上都有主機來發送的
主機來控制
那麼數據字節的傳送方向位呢
有詢子字節
大家注意
第一個字節就是詢子字節
發地址的那個字節
它的方向位是0還是1
然後來做規定的
另外
傳送完每個字節以後
一定要有相應的應答位A或A非
表示這一個數據傳送完畢
好
下面就談一下
那第一個字節詢子字節
大家看詢子字節在哪呢
就是在這個格式裏面
大家看第一個字節
重機地址
這是起位
後邊跟一個讀寫方向位
就是指這個字節
這個字節叫什麼呢
詢子字節
大家注意看
氣架地址
這有四位
它一共七位
四位呢
0123
大家注意
這是氣架地址
氣架地址四位
然後這三位是什麼呢
引腳地址
這什麼意思呢
每個I方C總線的外圍氣架
有三個引腳
這些位是0還是1
由這三個引腳接地
還是接政府來定的
那麼這位呢
寫0還是1
是由你發給主氣架
發給重機架
還是接收重機架
主氣架
接收重機架來的數據
所以這個就叫詢子字節
也就是我們剛纔講的
這個格式裏面的第一個
重機地址
加0或者是加1
這個字節叫詢子字節
那麼大家看一看
剛纔說的
那三位
A1 A0
大家看這幾個氣架
這就是一個
I方C總線系統
通過兩條線
這是串行擴展系統
擴什麼呢
這一方P-ROM
這是RAM
這是IO接口芯片
這LED數碼管驅動器
大家看這三個角
這個三個角
比如說24C02
它是A2 A1 A0
那就001 001
所以如果和它
單片級和它進行數據交換的話
你一定這三位
寫成001
001在哪呢
在這呢
在這 001
這四位是氣架本身固有的地址
好
這個就是詢子字節
也就是說
單片級和某個氣架進行數據傳送
要麼讀
要麼寫
是靠什麼呢
這個地址
這個地址對每個氣架來說是唯一的
其中這三位是由這個氣架的引腳
接地還接正弧來定的
這三位呢
是氣架本身固有的
好
也就是說單片級訪問
通過I放C總線訪問某一個氣架
要先發這個氣架的地址
詢子這個字節
一共是八位
好
那麼大家看看這個系統
這就是典型的I放C系統
這是個單片級
單片級51單片級
我們介紹AT89S51
沒有這兩個
沒有I放C接口
我用兩個IO口線來模擬這兩根線
然後呢
這些都是一個一個氣架
這個系統結構非常簡單
所以這裏我要跟大家說
將來同學如果進行單片級應用系統設計的話呢
可以考慮使用串行擴展
這系統結構非常簡單
但相應的編程呢
就要稍微麻煩一點
麻煩一點
好
那麼尋子字節當中的一些特殊地址
這個我不細講了
這裏面主要什麼呢
比如拳凌的狀態是什麼情況
拳腰的狀態什麼情況
這個不特殊講
這個作爲參考資料給大家
將來如果你用I放C總線來擴展
設計一個系統的話
那麼這些知識是應當知道的
更主要的是前面那些協議一定要清楚
你編程的話呢
全基於那些協議
當然有同學說
你這89S基本型的51單片機
沒有I放C接口
那麼我現在用的其他單片機
都帶有I放C接口
那就好了
那這些時序它都在運行的時候
都自動發出來
但是我們這種用軟件來模擬
這個I放C時序
有一個什麼好說
就是你對這個接口原理了解的非常透徹
它用軟件來模擬
這些我們可以不再考慮了
就特殊地址
單片機的I放C串型擴展設計
換句話說
就來設計一個單片機的I放C總線系統
就是擴展系統
現在的很多公司呢
做單片機的
它都帶有I放C接口
帶有SPI接口
這個大家一定要注意
那麼外圍器件
現在也都帶有I放C接口
比如說
大家最常見的一個外圍擴展器件
比如說
AT24C0X
有020408016
它實際上是什麼呢
一方P-ROM
後面這個X取不同值呢
它就有不同容量的一方P-ROM
用這個芯片加單片機
就可以做成
用這個芯片
大家知道
就可以和單片機接在一起
做一個IC卡
那芯片呢
做的非常小
做在卡片上
誰來對它進行讀呢
它插到多卡器裏面
單片機對它進行讀
那些信息都是什麼
我們最常見的
比如說銀行卡
銀行卡
裏面就是你那存款的信息
由於它這裏面是一方P-ROM
所以你信息寫進去
它通過什麼讀卡器
是說出來
用單片機往裏寫
或者是讀
那麼這是一種經典的
常見的外圍擴展器件
就是一方P-ROM
還有飛利浦公司的
這個時鐘日曆芯片
裏面有256個RAM單元
8位RAM單元
還有呢
純粹的RAM單元芯片
還有Maxim公司的
Maxim12728和Maxim517518519
12728是什麼呢
AD
這個大家可以上網查一下
你要用iPhone7接口擴展AD
這非常方便
還有什麼呢
DA
Maxim公司也是一個
實力非常強的芯片生產公司
所以現在外圍擴展器件
什麼樣的都有
我指的是什麼呢
帶有iPhone7接口
所以大家將來設計系統的話
這個系統可以採用
SPI結構
可以採用
SPI或者iPhone7結構
那麼接口連線都非常簡單
那麼主器件
肯定是由單片機來擔當了
一般說了
重器件必須帶有iPhone7接口
那麼大家注意
基本型的51單片機
不帶iPhone7接口
那怎麼辦呢
用並行的IO口線
來模擬iPhone7的接口時序
接口時序
好
那麼下面我們就來通過一個案例來介紹
iPhone7總線擴展系統
以8051單片機
就是這個51基本型單片機爲核心的
那麼下面大家看一個接口電路
在這
看一下這接口電路
實際上剛纔我們已經看過了
在介紹A1 A2
A0 A1 A2
這三個音叫用法的時候
大家注意看這系統
擴什麼了
51單片機擴了一片
Atomir 24C02
一方P-ROM芯片
我已經說了
如果單片機和它結合在一起
實際上就是i7卡
可以做一個i7卡
那麼還擴什麼呢
大家注意RAM芯片
256個字節
還擴什麼了
IO接口芯片
PCF8574
還有什麼呢
大家注意擴了一個LED驅動器
實際上一些多餘電路沒有畫出來
它可以通過iPhone7總線控制數碼管顯示
好
那麼有兩個上拉電阻
因爲這些器件
大家注意
所有兩根線
它都是開漏的
或者集電機開路
好
這就是一個典型的iPhone7系統結構
大家注意這個結構該有多好
接口多麼簡單
大家連的話都往那兩個線上掛
就可以了
好
那麼下面我們就談一下
iPhone7總線數據傳輸的模擬
你不說51單面機沒有什麼iPhone7接口
那你怎麼辦
我可以用IO口線來模擬
軟件來模擬
用一根IO口線控制
SDACL
那兩根線的電平高低就可以了
好
51單面機我們可以用軟件來模擬
iPhone7總線信號
另外呢
大家注意我們現在設計系統
有一個前提是單組器件
就一個單面機
控制其他各個重器件的讀寫
那麼下面我們看一下
典型的一些信號模擬
你不用51單面機來模擬iPhone7
那兩條線上的信號嗎
怎麼來模擬
大家看一看這思路
說穿了
就是用單面機控制IO口線某一根線
作爲數據線
作爲失蹤線
然後它的高低電平就可以了
但是要注意好
一定符合iPhone7的通訊協議
所以大家注意
我們下面就介紹
基本型51單面機
怎麼來進行典型信號模擬
那麼標準的iPhone7數據傳送
有嚴格的時序要求
比如說起始信號
終止信號
應答信號
數據靈
還有非應答信號數據
它的怎麼用IO口來模擬
它的模擬時序是什麼樣子
下面大家看一看
我們前面介紹終止信號的時候
注意用軟件模擬的話
要保證大於等於4.7微秒的信號建立時間
當終止信號結束的話
一定要釋放總線
讓那兩個線保持在高電平
下面大家注意
我們下面就介紹
單片機怎麼通過IO口線來模擬
起始信號終止信號等等
這些常用的信號
大家先看典型信號的模擬子程序
這些信號
比如起始位終止位
你編好這個程序以後
用的話你就調子程序就行了
所以很多人編iPhone7接口驅動程序的時候
把這些子程序看明白以後
直接就調用
那麼大家注意一些前提
我們下面這些iPhone7信號模擬
主器件單片機
不用多解釋
晶振6兆
這裏面隱含一個什麼信息
它的機器週期是兩微秒
大家知道
這條指令
NOP指令
是一個機器週期
執行這一條指令
軟件也是多長時間
要白白的耗費兩微秒
這個大家知道就好辦了
好
首先我們看一下常用的一些典型信號模擬
起始信號S
它的波形是什麼樣的
按iPhone7總線規定
大家看一看
在這兒
這是起始信號
起始信號有什麼特點呢
這是時鐘信號
在時鐘信號持續期間
大家注意
數據總線上的信號
這塊發生一個跳變
這是它時鐘信號穩定期間
有一個跳變
大家注意
按照協議
這就是起始信號
好
你就用單片機的兩個IO腳
把它止一清零
來模擬這個信號
但是大家一定要注意
一定要注意
這個時間一定要滿足iPhone7總線的時序要求
好
下面大家注意
這是起始信號
起始信號
我們前面講過
當時鍾信號爲高電瓶期間
這個數據信號發生一個跳變
由高到低
就認爲總線上的數據傳送開始了
這叫起始信號
那麼時序呢
要滿足這個要求
那麼大家看一看
注意
SDA腳
實際上這個就是P1.7英角
這個是P1.6
那麼大家看
SETB P1.7
這塊是高電瓶了
SETB P1.7
這個是什麼意思呢
實際上是高電瓶
然後呢
實際上還有另一個作用
讓它做輸入
再看SETB P1.6
SETB P1.6
也爲高電瓶
然後大家注意
NOP NOP這兩條指令
過了多長時間呢
4微秒
然後就把這個引腳再清零
實際上就這一段
同學說這個時序不要求大於4.7微秒嗎
實際上這裏用了多少
用了4微秒
有的不滿足
不滿足怎麼辦
有的人就把這塊又加了個道
也可以啊
因爲它時序規定大於這個就行
有人還說
那我一個單片機沒有iPhone系接口
外邊連的那些氣墊有iPhone系接口
那他可以用這個來試一下
和那些我不合
所以大家注意啊
這個地方是靈活的
然後清零
清零就把這個腳清零了
對吧
清零以後
大家注意
又經過4微秒
這一段時間
又過了4微秒
然後呢
把這個引腳也清零
也清零了
這起始信號就這麼模擬出來
然後呢
把這個起始信號
標號
顯行
作爲一個子程序來調用
後邊跟個ret
所以呢
iPhone系總線編程的話呢
先來一個起始信號
那麼這兩個引腳P1.6
1.7呢
就模擬這個信號
很簡單
對吧
好
再看終止信號模擬
終止信號模擬呢
是下一段程序
終止信號怎麼模擬呢
剛纔已經講了
在時鐘信號高電平期間
有一個低電平到高電平的跳變
就是這個
把這個先看明白了啊
這是時鐘信號
在期間由低電平向高電平跳變
那這個就是終止信號
你就產生這個波形就行
好
假設啊
我們這個地方大於4.7
我們就先都認爲是4
我們看一下這個軟件來怎麼編
終止信號啊
ClearP1.7
什麼意思呢
SDA等於零
從這塊開始了啊
等於零
然後緊接着大家一猜
P1.6就該指1了
對吧
P1.6把它指1
讓時鐘信號爲1
然後knock knock
經過了兩個機器週期
四維秒的驗時
四維秒驗時呢
就產生這一部分
到這一段
到這個點上了
這時候呢
數據線應當變高電平
時鐘線應當不變就行
不變就可以了
所以大家看
經過四維秒以後
把SDA指1
然後再經過四維秒以後呢
再把P1.6 1.7都清零
再經過四維秒
把它都清零
終止信號就出來了
然後你把終止信號呢
作爲一個子程序
後邊加上一個ret
大家注意看
一個ret
然後這塊加個標號
終止信號
因爲一次數據傳送
主要有個起始信號
最後要有個終止信號
終止信號
這個都由主機來控制
叫master來控制
好了
下面再往下看
我要發送一個數據0
或者是英達位
大家注意英達位是0
數據0也是這樣
那是怎麼辦呢
大家注意看
clear P1.7
那麼這個呢
就爲0了
setb P1.6
注意這個地方
這個時序
這個跨得有點誇張了
緊接應當爲1
然後大家注意
經過node number
四維秒的驗試
然後呢
clear P1.6
就它變低
然後setb P1.7
變高
然後返回
這個就是你發送一個數據0
或者發送一個英達位
它倆的程序是一樣
你也把這一位呢
就是發送這一位呢
也作爲一個子程序調用
最後加個ret
當然同學說了
我要現在就選一個帶iphone7接口
這種單片機
那麼這些信號
就你不用模擬了
你就按照裏面的iphone7部件的操作要求
它這些時序自動纔是
所以呢
大家一定要注意
你可以看一看
現在新型的單片機
都帶有iphone7接口
都帶有SPI接口
所以呢
它們用起來是非常方便的
非應答信號
我這不解釋了
大家明白前三個信號的原理以後
這也就好辦了
好
還有一些iphone7總線模擬的通用子程序
大家注意
除了起始信號
終止信號
發送英達位數據0
和發送非應答位數據1
就前面的四個信號以外
還應當有應答位檢查
發送一個字節
接收一個字節
發送n字節
接收n字節的這些典型的子程序
用來進行iphone7的通訊
好
應答位檢查我們不介紹了
最主要是發送一個字節和接收一個字節的子程序
大家看一看啊
我現在主機接收一個字節
這個子程序怎麼編
就是iphone7串運通訊協議
按這協議來實現的
接收一個字節
數據子程序怎麼來編
下面這個子程序呢
模擬從iphone7數據線
讀取一個字節的數據
並且把它存到R2裏
讀一個數據
主機從重機讀一個數據
好
大家看
母08送到R6裏面
大家注意
這一個字節是八位
讀一個字
完了
setb
大家注意
一定注意這條指令
setb
這個是把
注意啊
是把P1.7指爲輸入方式
因爲要從P1.7裏面
就SDA線裏讀數據
這個大家注意
可能有同學就會提出疑問
那前面那個
setbP1.7
最開始高
那你不是把那P1.7
設成輸入啊
注意
那個是有個前提
所以這兩條指令
它是有區分的
另外大家看下一條指令
setbP1.6
大家注意
1.6引腳接這個失蹤線
讓它指高電平
指高電平就意味着什麼
這時候SDA這數據上
線上的數據是有效的
什麼時候SDA線上的數據是有效的
它實際上是以電平的形式來表示的
是必須在失蹤信號爲高電平的時候
這時候SDA數據線
這時候這個電平是有效的
是表明數據的
是1還是0
然後大家注意看
磨P1.7讀到C
G位標誌位
就是一位級的位累加器
P1.7
大家注意就是剛纔的SDA腳
那麼就讀入SDA線
因爲剛纔實際上SCL等於1
失蹤線等於1
這時候你SDA數據線是0還是1
纔是有效的
這時候讀進來了
讀進來了
然後磨R2送到A裏面
一會我們再研究
然後大家注意
注意
把這個A累加器
就是把這C標誌位剛纔讀
這個是旋轉
環移
左環移
是吧
左環移
來
然後帶G位標誌位
剛纔讀進來的SDA腳的這個數據
已經在C標誌位裏面
然後A累加器和C標誌位
它進行左環移
那麼讀進來的數據進到A累加器裏面
最低那位
對不對
最低那位
好
然後就把A累加器的內容存到R2裏面
所以R2是幹什麼
大家注意
R2
實際上是把A裏的內容存到裏面
A裏面剛纔經過第一次移位以後
讀進來的第一位數據就存到R2裏
然後下一步
Clear P1.6
就是讓失蹤信號爲0
繼續接收數據
大家注意
下一條指令
減R6
就你剛纔讀進一位
原來是8
再減一位是7
非0的話
注意
再繼續接收
如果爲0的話
8位接收完了
這個是接收一個字節的子程序
下面大家再看
還有一個
發送一個字節子程序
剛纔先講接收
後講發送
你先把要發送的數據送到A裏面
這個前提要做好
然後我們下面看子程序
大家看
某R6
這就是8位的數據長度
送到R6
R6作爲長度計數器
然後大家注意
A裏面就是要發送的
大家注意
這個是左移
你要發送數據
最低位
左移
對吧
那麼往低位
最高那位
送到C標誌位
要往外送的
然後大家注意
把這一位最高位
送到P1.7
它是一個IO口線
然後往外出去了
發送出去了
發送到SDA腳
然後再把它指1
指1
P1.6指1
石中線指1
這時候告訴SDA線上的腳上的數據是有效
說實話
數據線上的數據是有效的
爲什麼是這樣呢
因爲I放C總線規定
只有石中線爲高電平的時候
SDA就P1.7
那個引腳上的數據纔是有效的
然後經過四微秒
大家注意
然後再把SDA數據
那就是這根線變化
變化
就是給它讓它變化了
然後把這個計數器減一下
發出去的1位減一下
然後不爲0的話
跳到這個地方
爲0就返回
所以大家要注意
你每次往外送的是什麼
是你事先放到A類夾器裏的數據
然後大家注意看
在這裏面把A類夾器的數據
做懷疑
然後懷疑完了
把它送到P1.7
那個引腳上出去
這個是發送一個字節
這個呢
是接收一個字節
好
下面我們再看一下
發送N字節的數據指程序
大家注意
大家把這格式看明白了
我們程序可以自己看了
這格式大家注意
這是主機發的
先發一個起始位
起始位什麼樣的
失蹤線爲高電平
然後數據線發生了一個
1到0的負跳變
起始位
然後發七位的重機地址
四位來自於本身的
一方披露
三位來自這個芯片的外部引腳
然後大家注意
發個零
零什麼意思
是發送的意思
斜
主機往外發
然後大家注意
發
那誰給個應答
把位都發完了
重機給個應答
然後再發字節1
重機再給個應答
一直髮到字節N
完了
重機要給個A或A飛
最後主機要發
要發出一個終止位
通訊就這樣
那麼這個程序編寫的話
大家可以看
自己課後可以看
