最近在寫DS3231時鐘芯片的驅動,這個芯片使用IIC進行通訊,以前沒有用過IIC模塊,照着教材和示例程序寫程序後發現各種問題。沒辦法,還是官方數據手冊靠譜,遂把相應部分又翻譯了一遍。果然發現示例程序純粹就是個玩具,一點用都沒有。。。
第15章 集成電路總線(IICV3)
譯者注:譯者博客(http://blog.csdn.net/lin_strong),轉載請保留這條。此爲 MC9S12XEP100RMV1芯片手冊的第15章內容,僅供學習交流使用,請勿用於商業用途。
介紹
集成IC總線(IIC)是一個雙線雙向串行總線,它提供設備間簡單高效的數據交換。由於只需要兩條線,IIC總線大大簡化了設備間的連接,另外,它還不需要地址譯碼器。
這個總線很適合需要在大量設備間進行短距離斷續通訊的情景。它具有很高的擴展性,能夠靈活地在總線上添加設備進行系統功能擴展。
該接口被設計爲在最大總線負載和定時下以最高100 kbps運行。設備能夠運行在更高的波特率上,最高爲 總線時鐘/20。最大通訊距離和可以連接的設備數受限於總線電容,電容值最大400pF。
特性
IIC模塊有以下關鍵特性:
- 兼容I2C總線標準
- 支持多主機
- 可軟件配置的256種串行時鐘頻率
- 軟件可控的應答位
- 中斷驅動的多數據字節傳送
- 仲裁丟失時觸發中斷,同時自動從主機切換爲從機。
- 主叫地址識別中斷
- 可以生成/探測 啓動信號和停止信號
- 可以生成重複啓動信號
- 可以生成與探測應答位
- 可以探測總線忙碌狀態
- 通用呼叫地址探測
- 兼容10bit地址
運行模式
IIC模塊在 普通、特殊和模擬 模式下運作方式相同。它有兩個低功耗模式:等待模式和停止模式。
框圖
IIC模塊的框圖如圖1。
圖 1.IIC模塊框圖
外部信號引腳描述
IICV3模塊有兩個外部引腳。
IIC_SCL — 串行時鐘線 引腳
這是模塊的雙向串行時鐘線(SCL),兼容IIC總線規範。
IIC_SDA — 串行數據線 引腳
這是模塊的雙向串行數據線(SDA),兼容IIC總線規範。
地址映射與寄存器定義
這部分提供了IIC模塊的所有地址和寄存器的詳細描述。
寄存器描述
這部分以地址順序描述寄存器。每個描述都有一個標準的寄存器框圖以及對應的數字。寄存器位以及字段功能的細節描述跟在寄存器圖之後,按照位順序。
圖 2.IIC寄存器總結
IIC地址寄存器(IBAD)
圖 3.IIC總線地址寄存器(IBAD)
任何時刻都可讀寫。
如果當前爲從機,當主叫地址與寄存器中的值匹配時,IIC模塊會自動答覆。注意,這個地址並不是當自己爲主機時,在發送地址時會被髮送的那個。
表 2. IBAD字段描述
字段 | 描述 |
---|---|
7:1 ADR[7:1] |
從機地址 — Bit 1到7包含IIC總線模塊使用的從機地址。當總線上地址匹配時IIC默認爲從機模式。 |
0 保留 |
保留 — IBAD的Bit 0 預留作未來使用。讀取時總是0。 |
IIC分頻寄存器(IBFD)
圖 4.IIC總線分頻寄存器
任何時刻都可讀寫。
表 3. IBFD字段描述
字段 | 描述 |
---|---|
7:0 IBC[7:0] |
I 總線時鐘率 — 這個字段用於預分頻時鐘以配置比特率。位時鐘生成器實現爲3個子部分: 預分頻器 — IBC7:6、預分頻移位寄存器 — IBC5:3用於選擇預分頻器、IBC2-0 選擇移位寄存器的tap點。不同IBC配置所對應的tap和預分頻值如表4所示。 |
表 4. I-總線 tap和預分頻值
表 5. 預分頻器編碼
表 6.乘數因子
從SCL下降沿到第一個tap(Tap[1])的時鐘數由表5中的scl2tap決定,之後所有的tap點由 2IBC5-3分離,如表5中的tap2tap。SCL Tap被用於生成SCL週期,SDA Tap用於確定從SCL下降沿到SDA變化的延遲,及SDA保持時間(hold time)。
IBC7-6 決定乘數因子 MUL。MUL的值如表6所示。
圖 5.SCL分頻器和SDA保持
用於生成分頻值的公式爲:
SDA保持延時時間等於CPU時鐘週期乘以表7中所示的SDA保持值。用於生成SDA保持值的公式爲:
用於生成啓動條件(start condition)和停止條件(start condition)的SCL保持值的公式爲:
- 注意:
- 在更高的內部總線時鐘頻率下,主機的SQL分頻週期可能會延長。當內部總線週期等於一個pad延時時就會發生。SCL輸入被用於多主機下的時鐘仲裁。因此每次SCL邊沿被內部驅動後,在達到pad電平前會額外計算一個總線週期,以支持下一次反轉。這在MUL=1並且IBC[7:0] = 0x00到0x0F時會起作用,見表7。
表 7.IIC分頻與保持值
IIC控制寄存器(IBCR)
任何時刻都可讀寫。
表 8. IBCR字段描述
字段 | 描述 |
---|---|
7 IBEN |
I-總線 使能 — 這個字段控制IIC總線模塊的軟重置。 0 模塊被重置並禁用。這是上電重置後的狀態。此時,接口保持重置狀態,但可以訪問寄存器。 1 IIC總線模塊被使能。這個位必須在使用其他IBCR位之前置位。 如果IIC總線模塊在直接傳輸的過程中被使能,會發生如下事情:從機模式會忽略當前總線上的傳輸並在探測到下一個啓動信號時開始運行。主機模式不會意識到總線正忙,因此如果這時發起啓動的話,當前的總線可能會發生衝突並出錯。這最終會導致當前的主線主機與IIC總線模塊之一丟失仲裁,然後總線就會恢復正常。 |
6 IBIE |
I-總線 中斷使能 0 禁用來自IIC總線模塊的中斷。注意,掛起的標誌位還是需要手動清零的。 1 使能來自IIC總線模塊的中斷。IIC總線的發生中斷的同時,狀態寄存器中的IBIF也會一起置位。 |
5 MS/SL |
主機/從機模式選擇位 — 重置後,這個位爲0。當這個位從0變爲1時,會在總線上產生一個啓動信號,然後就選擇了主機模式。當這個位從1變爲0時,會生成一個停止信號,然後運行模式就從從機變爲主機。停止信號只有在IBIF置位時纔會生成。當主機丟失仲裁時,MS/SL會在不生成停止信號的情況下清零。 0 從機模式 1 主機模式 |
4 Tx/Rx |
發送/接收模式選擇位 — 這個位選擇主機與從機傳輸的方向。當作爲從機被呼叫時,這個位應該由軟件根據狀態寄存器中的SRW位進行設置。在主機模式下,這個位應該根據傳輸需求進行設置。因此,在尋址週期,這個位應該總是1。 0 接收 1 發送 |
3 TXAK |
應答位發送使能 — 這個位指定了主機/從機接收器在數據應答週期時驅動到SDA上的值。只要模塊啓用了,不管TXAK是什麼值,IIC模塊總會應答匹配的呼叫地址。注意,寫到這個bit的值只在IIC總線爲接收器時纔有用(即Tx/Rx=0時)。 0 在接收到一個字節數據後的第9個時鐘位,會發送一個應答信號。 1 不會發送應答信號(即,應答位 = 1) |
2 RSTA |
重複啓動 — 如果模式是當前的總線主機,向這個位寫入1會在總線上生成一個重複啓動信號。這個位讀出來總是0。如果在錯誤的時刻試圖重複啓動,比如總線是由其他主機佔用,會導致丟失仲裁。 1 生成重複啓動信號 |
1 RESERVED |
保留 — IBCR的Bit 1預留用作以後使用。這個位讀出來總是0。 |
0 IBSWAI |
I-總線 接口在暫停模式下停止 0 IIC總線模塊時鐘正常運行。 1 在等待模式下停止IIC總線模塊的時鐘生成。 |
當執行CPU WAI指令時會進入等待模式。如果這時IBSWAI位爲1,IIC模塊的所有內部時鐘會停止,當前的進行中的傳輸將停止。如果CPU由非來自IIC模塊的信號源喚醒,時鐘將會重啓,如果正在傳輸的話,IIC將恢復之前的狀態繼續進行傳輸。當內部時鐘停止時,IIC模塊不可能喚醒CPU。
如果當執行WAI指令時IBSWAI位爲0,IIC內部時鐘和接口會保持活躍,繼續完成當前的操作。甚至可以配置IIC模塊使其通過當前操作產生的中斷來喚醒CPU。詳見IBSR中的IBIF位與IBCR中的IBIR位。
IIC狀態寄存器(IBSR)
圖 7.IIC總線狀態寄存器(IBSR)
除了bit 1(IBIF)和bit 4(IBAL)可用軟件清零外,狀態寄存器的其他位都是隻讀的。
字段 | 描述 |
---|---|
7 TCF |
數據傳輸位 — 當一個數據字節正在傳輸時,這個位爲0。它會由一個數據字節傳輸的第9個時鐘的下降沿置位。注意,這個位只在一次數據傳輸的過程中或者剛剛結束的瞬間有效。 0 傳輸中 1 傳輸完成 |
6 IAAS |
被作爲從機呼叫 — 當自己的地址(I-總線地址寄存器)與主叫地址匹配,或者當GCEN爲1時收到了通用主叫地址,這個位會被置位。如果IBIE爲1,置位時會觸發中斷。然後CPU需要檢測SRW位並相應地設置Tx/Rx。寫I-總線控制寄存器會清零這個位。 0 未被尋址 1 被呼叫爲從機 |
5 IBB |
總線忙 0 這個位指示總線的狀態。當探測到啓動信號,IBB被置位。如果探測到停止信號,IBB被清零,同時總線進入空閒狀態。 1 總線正忙 |
4 IBAL |
仲裁丟失 — 仲裁丟失位(IBAL)會在仲裁失敗時由硬件置位。仲裁會在以下情況丟失: 1. 當主機在尋址或者數據傳輸週期中想驅動SDA爲1卻採樣到0。 2. 當主機在數據接收週期的應答位時想驅動SDA爲1卻採樣到0。 3.當總線正忙時試圖發出啓動信號。 4.在從機模式下試圖重複啓動。 5.當主機檢測到非主動發出的停止信號。 這個位必須由軟件清零,通過寫1來清零。寫入0沒有任何作用。 |
3 RESERVED |
保留 — IBSR的Bit 3預留用作以後使用。這個位讀出來總是0。 |
2 SRW |
從機 讀/寫 — 當IAAS爲1時,這個位指示由主機發送來的主叫地址中的R/W命令位的值 只有當處於從機模式時收到了匹配的主叫地址並且沒有發起其他傳輸時這個位纔有效。 通過檢查這個位,CPU可以根據主機的命令選擇從機的傳輸/接收模式。 0 從機接收,主機向從機發送數據 1 從機傳輸,主機從主機讀取數據 |
1 IBIF |
I-總線 中斷 — IBIF位會在發生以下情況時置位: 1. 仲裁丟失(IBAL位置位) 2.數據傳輸完成(TCF位置位) 3. 被作爲從機尋址(IAAS位置位) 如果IBIE位被置位,會引發一次處理器中斷請求。這個位必須由軟件清零,寫入1清零。寫入0沒有用。 |
0 RXAK |
接收應答 — 一次總線週期的應答位的SDA值。如果接收應答位(RXAK)爲0,表明在總線上傳輸完8位數據後收到了應答信號。如果RXAK爲1,說明在第9個時鐘沒有應答信號。 0 接收到應答 1 沒有接收到應答 |
IIC數據I/O寄存器(IBDR)
圖 8. IIC總線數據I/O寄存器(IBDR)
在主機傳輸模式下,向IBDR寫入數據會發起一次數據傳輸。最高位會先傳輸。在主機接收模式下,讀這個寄存器會啓動下一次數據接收。從機模式下,在探測到主機的呼叫後,就可以使用同樣的功能。注意,IBCR的Tx/Rx位必須正確地反映主/從模式下想要的傳輸方向。比如,如果IIC被配置爲主機傳輸,但其實想要的是主機接收,那讀取IBDR並不會啓動接收。
當IIC被配置爲主機接收或者從機接收時,讀取IBDR讀取IBDR將返回上一個接收到的字節。IBDR並不會反映在IIC總線上傳輸的每一個字節,軟件也無法通過回讀IBDR來驗證剛寫入的字節。
在主機傳輸模式下,斷言MS/SL後,首個寫入IBDR的字節用於傳輸地址,其應該包含主叫地址(在D7:D1上)以及R/W位(在D0上,1爲讀)。
IIC控制寄存器2(IBCR2)
圖 9. IIC控制寄存器2(IBCR2)
這個寄存器包含在通用呼叫以及10bit地址中使用的變量。
任何時刻都可讀寫。
字段 | 描述 |
---|---|
7 GCEN |
通用呼叫使能 0 禁用通用呼叫。模塊不會接受任何通用呼叫數據和尋址。 1 使能通用呼叫。它表明模塊可以接收地址和任何數據。 |
6 ADTYPE |
地址類型 — 這個位選擇地址長度。這變量必須在IIC進入從機模式前被正確地配置。 0 7位地址 1 0位地址 |
5,4,3 RESERVED |
保留 — IBCR2的Bit 5,4,3預留用作以後使用。這個位讀出來總是0。 |
2:0 ADR[10:8] |
從機地址[10:8] — 如果地址類型被斷言(ADTYPE=1),這3個位代表了10位地址的高3位。 |
功能描述
這個部分提供了IICV3完整的功能描述。
I-總線 協議
IIC總線系統使用一條串行數據線(SDA)和一套串行時鐘線來傳輸數據。所有連接到上面的設備必須有開漏輸出。兩條線上都接有外部上拉電阻,採用”與”邏輯。這些電阻的值依賴於系統。
通常,一個標準的通信包含四個部分:啓動信號、從機地址傳輸、數據傳輸 和 停止信號,如圖10所示。後面的部分會簡短地描述它們。
圖 10.IIC總線傳輸信號
啓動信號
當總線空閒,即沒有主機正佔用總線(SCL和SDA線都處於邏輯高位)時,主機可以通過發送一個啓動信號來發起通信。如圖11所示,啓動信號定義爲,當SCL爲高時SDA上從高變到低。這個信號指示一次新的數據傳輸的開始(每次數據傳輸都可以包含數個數據字節)並讓所有從機脫離空閒狀態。
圖 11.起始和停止條件
從機地址傳輸
主機在啓動信號後的首個數據傳輸爲從機地址傳輸。這是個7位的主叫地址以及一個1位R/W位。R/W位告知從機想要的數據傳輸方向。
1 = 讀傳輸,從機傳輸數據給主機
0 = 寫傳輸,主機傳輸數據給從機
如果主叫地址是10位的,另一個字節跟在首個字節後傳輸。只有與主機傳輸的主叫地址匹配的從機會進行答覆,通過發回一個應答位。這通過在第9個時鐘拉低SDA來實現(見圖10)。
系統中不能有地址相同的從機。如果IIC模塊是主機,它絕對不能傳輸與自己的從機地址相同的地址。IIC模塊不能同時作爲主機和從機。然而,如果在地址週期間丟失了仲裁,IIC模塊將切換到從機模式並正確地運行,即使它正被另一個主機呼叫。
數據傳輸
只要成功地尋址到了從機,就可以以R/W位指定的方向進行連續的字節傳輸。
所有在地址傳輸之後傳輸都被認爲是數據傳輸,即使它們攜帶了從機設備的子地址信息。
每次數據字節的傳輸都是8位長度的。數據線只可以在SCL爲低位時變化,在SCL爲高位時數據線必須保持穩定,如圖10。每個數據位都對應SCL上一個時鐘脈衝,先傳輸MSB。每個數據字節後面都跟着一個應答位,應答位由接收設備通過在第9個時鐘拉低SDA來應答。所以一次完整的數據字節傳輸需要9個時鐘脈衝。
如果從機接收器不應答主機,從機必須釋放SDA線使其保持在高位。然後主機可以生成一個停止信號以拋棄數據傳輸或者一個啓動信號(重新啓動)以開始新的一次呼號。
如果主機接收器在一個字節傳輸後不應答從機發送器的話,就是對從機說“這是最後一個字節”,所以從機應該釋放SDA線以便主機能夠產生停止信號或者啓動信號。注意,爲了正確地釋放總線,在主機不應答之後,從機必須立即切換到接收器,然後必須虛讀一次IBDR。
停止信號
主機可以通過生成停止信號以釋放總線來終止通信。但是,主機也可以直接生成啓動信號並跟着一個主叫命令而不用先生成停止信號。這叫做重複啓動。停止信號定義爲當SCL在邏輯1時,SDA上從低到高的轉換(見圖11)。
即使從機已經進行了應答,主機仍然可以生成停止信號,這樣從機必須釋放總線。
重複啓動信號
如圖10中所示,重複啓動信號就是不先生成停止信號來終止通信就直接生成啓動信號。這被主機用來在不釋放總線的情況下與另一個從機通信或者與同個從機以不同的模式(發/收模式)通信。
仲裁過程
集成IC總線是一個真正的多主機總線,它允許連接多個主機。如果兩個或者多個主機同時試圖控制總線,時鐘同步過程會確定總線時鐘,低位(注:即邏輯低電平)時間等於主機間最長的時鐘低位時間,而高位時間等於最短的那個。進行競爭的主機的優先級由數據仲裁過程確定,當一個主機發送邏輯1時另一個主機卻在發送邏輯0,它會丟失仲裁。丟失仲裁的主機會立即切換到從機接收模式並停止驅動SDA輸出。這種情況下,主機到從機的模式切換不會生成停止信號。同時硬件會置位狀態位以通知丟失了仲裁。
時鐘同步
因爲在SCL線上是”與”邏輯,SCL線上高到低的變化會影響到所有連接到總線上的設備。一旦設備時鐘變爲低位,設備開始計數低位時間,它會維持SCL線的低位直到到了時鐘高位狀態。但是,這個設備時鐘從低到高的轉變可能不會改變SCL線的狀態,因爲可能另一個設備的時鐘還在低位。因此,同步時鐘SCL由擁有最長低位時間的設備保持在低位。有較短低位時間的設備在這段時間進入高等待狀態(見圖12)。當所有相關設備都計數完成低位時間,同步時鐘SCL線被釋放並被拉高。然後所有設備就一起開始計數高位時間。首個計數完成的設備會再次拉低SCL線。
圖 12.IIC總線時鐘同步
握手
時鐘同步機制可以被用作數據傳輸中的握手。從機設備可以在一個字節傳輸(9個bit)後維持SCL爲低。這種情況下,它能停止總線時鐘並強迫主機時鐘爲等待狀態,直到從機釋放SCL線。
時鐘延展
時鐘延展機制可以被從機用於降低傳輸的比特率。在主機驅動SCL爲低位後,從機可以驅動SCL爲低足夠長的時間,然後釋放它。如果從機的SCL低位週期比主機SCL低位週期長,就會導致SCL總線信號低位週期的延展。
10bit 地址
如果首個地址字節的頭5個bit爲0b11110,則表明這是個10bit地址。下面的規則應用於首個地址字節。
表 11.首個字節中的位的定義。
從機地址 | R/W位 | 描述 |
---|---|---|
0000000 | 0 | 通用呼叫地址 |
0000010 | x | 爲不同總線格式預留 |
0000011 | x | 爲未來預留 |
11111XX | x | 爲未來預留 |
11110XX | x | 10bit 從機尋址 |
地址類型由ADTYPE定義。當ADTYPE爲0,使用7bit地址。反之,則使用10bit地址。通常來說,有兩類10bit地址。見圖14和15。
圖14. 一個主發送器以10bit地址尋址一個從接收器
圖15. 一個主接收器以10bit地址尋址一個從發送器
在圖15中,前兩個字節與圖14的相似。在重複啓動(Sr)之後,首個從機地址再次被髮送,但是R/W位爲1,意識是從機要作爲發送器。
通用呼叫地址
爲了使用通用呼叫地址進行廣播,設備必須先生成通用呼叫地址(0x00),然後在接收到確認位後,必須傳輸數據。
在通信中,作爲從機設備,如果GCEN爲1,則會應答廣播並接收數據直到禁用了GCEN或者主機釋放了總線或者啓動了新的傳輸。在廣播中,從機總是作爲接收器。在通用呼叫中,IAAS同樣用於指示地址匹配。
爲了區分地址匹配是匹配的正常地址還是通用地址,在接收到地址字節之後應該讀取IBDR。如果數據爲0x00,說明匹配的是通用呼叫地址。通用呼叫地址的意義總是在第一個數據字節中指定,必須由軟件進行處理,IIC硬件並不會解密和處理首個數據字節。
當一次數據字節傳輸完成,可以從IBDR中讀取收到的數據。用戶可以通過使能或禁用GCEN來控制這個過程。
運行模式下的運行
這是運行的基本模式。
等待模式下的運行
IIC在等待模式下的運行方式是可配置的。取決於內部寄存器位的配置,IIC模塊可以在CPU在等待模式時正常運行或者可以停止IIC時鐘生成使IIC模塊進入一個能量保存狀態。然後,進行中的任何發送或接收都會在進入等待模式那一刻停止。
停止模式下的運行
爲了節能,IIC模塊在停止模式下是不活躍的。STOP指令不會影響IIC寄存器的狀態。
重置
每一個位在重置後的狀態都列在了“地址映射與寄存器定義”中,裏頭詳述了寄存器和他們的位字段。
中斷
IICV3只使用一箇中斷向量。
表 12.中斷總結
中斷 | 偏移 | 向量 | 優先級 | 中斷源 | 描述 |
---|---|---|---|---|---|
IIC中斷 | - | - | - | IBSR寄存器中的IBAL、TCP、IAAS位 | 當IBAL、TCP、IAAS任一個置位時會觸發中斷,分別是由於仲裁丟失、傳輸完成和地址匹配導致。 |
IIC內部有三種類型的中斷。中斷服務例程可以通過讀取狀態寄存器來確定中斷類型。
IIC中斷可以由以下條件生成:
1. 仲裁丟失(IBAL置位)
2. 字節傳輸完成(TCF置位)
3. 地址匹配(IAAS置位)
IIC中斷通過置位IIC控制寄存器中的IBIE位來啓用。必須在中斷服務例程中向IBF位寫0來清零它(譯者注:沒看懂,但原文就這麼寫的)。
應用信息
IIC編程示例
初始化序列
重置會使得IIC的控制寄存器變爲默認狀態。在接口可以用於傳輸串行數據前,需要先按照如下執行一個初始化過程:
- 修改分頻寄存器(IBFD)並選擇需要的分頻係數以從系統時鐘獲得SCL頻率。
- 修改IBCR2的ADTYPE以確定地址長度,7bit或者10bit。
- 修改IIC地址寄存器以定義自己的從機地址。如果使用的是10bit地址,還要修改IBCR2寄存器以定義地址的高位。
- 置位IIC控制寄存器(IBCR)的IBEN位以使能IIC接口系統。
- 修改IIC控制寄存器(IBCR)以選擇主機/從機模式、傳送/接收模式以及是否使能中斷。
- 如果支持通用呼叫,應該斷言IBCR2中的GCEN位。
生成啓動信號
在初始化過程完成後,可以通過選擇“主機發送”模式來發送串行數據。如果設備連在一個多主機總線系統上,必須要檢查IIC總線忙位(IBB)的狀態以查看是否串行總線空閒。
如果總線空閒(IBB = 0),就可以發送啓動信號和首個字節(從機地址)。寫入數據寄存器的數據包含從機主叫地址,最低位則用於告知從機自己想要的數據傳輸方向。
總線空閒時間(即在停止條件到下一個啓動條件之間的時間)是生成啓動信號的硬件決定的。取決於系統時鐘的相對頻率和SCL週期,在寫入主叫地址到IBDR後可能需要等到IIC忙碌,才能繼續後續的指令。後面的例子就是說的這個。
下面是生成啓動信號並傳輸首個字節(從機地址)的示例程序:
CHFLAG BRSET IBSR,#$20,* ;等待IBB標誌位清零
TXSTART BSET IBCR,#$30 ;設置主機傳輸模式;即生成啓動信號
IBFREE BRCLR IBSR,#$20,* ;等待IBB位置位
MOVB CALLING,IBDR ;傳輸主叫地址,D0=R/W
IBFREE BRCLR IBSR,#$20,* ;等待IBB位置位
數據傳輸後的軟件響應
傳輸或接收一個字節會使數據傳輸位(TCF)置位,它表明一個數據傳輸完成了。IIC總線中斷位(IBIF)也會置位;如果在初始化時通過置位IBIE使能了中斷功能,這時就會產生一箇中斷。軟件在中斷例程的一開始必須清零IBIF位。在接收模式下讀取數據I/O寄存器(IBDR)或在發送模式下寫入IBDR,會清零TCF位。
如果沒有使用中斷功能,軟件可以通過監視IBIF位來驅動IIC模塊。注意,輪詢的應該是IBIF位而不是TCF位,因爲在仲裁丟失時它們的運行方式是不一樣的。
注意,當中斷在地址週期末尾發生時,主機總是會在傳輸模式,即地址總是被髮送的。如果想要的是主機接收模式,在往IBDR中寫入從機地址時設置好R/W位,然後在這裏反轉Tx/Rx位。
在從機模式的地址週期時(IAAS=1),讀取狀態寄存器的SRW位來確定隨後的傳輸方向並相應地編程Tx/Rx位。對於從機模式的數據週期(IAAS=0),SRW位無效,應該讀取控制寄存器的Tx/Rx位以確定當前的傳輸方向。
下例是中斷例程中“主機發送器”的軟件響應示例:
ISR BCLR IBSR,#$02 ;清零IBIF標誌位
BRCLR IBCR,#$20,SLAVE ;如果是從機模式則跳轉
BRCLR IBCR,#$10,RECEIVE ;如果是接收模式則跳轉
BRSET IBSR,#$01,END ;如果沒有應答,則結束傳輸
TRANSMIT MOVB DATABUF,IBDR ;傳輸下一個數據字節
生成停止信號
一次數據傳輸由“主機”設備產生一個停止信號來結束。主機發送器可以簡單地在所有數據傳輸完成後產生一個停止信號。下面是一個怎麼使主機發送器生成停止信號的示例。
MASTX TST TXCNT ;獲得發送計數器的值
BEQ END ;如果沒有更多數據的話就跳到END
BRSET IBSR,#$01,END ;如果沒有應答的話就跳到END
MOVB DATABUF,IBDR ;發送數據的下一個字節
DEC TXCNT ;遞減TXCNT
BRA EMASTX ;退出
END BCLR IBCR,#$20 ;生成一個停止信號
EMASTX RTI ;從中斷返回
如果一個主機接收器想要結束數據傳輸,它必須不應答最後一個數據字節以告知從機發送器,這可以通過在讀取倒數第二個數據字節前設置傳輸應答位(TXAK)來實現。在讀取最後一個數據字節前,必須先生成停止信號。下例展示了主機接收器怎麼生成停止信號。
MASR DEC RXCNT ;遞減RXCNT
BEQ ENMASR ;如果是要讀取的最後一個字節,跳轉到ENMASR
MOVB RXCNT,D1 ;檢查是不是倒數第二個
DEC D1 ;
BNE NXMAR ;如果既不是最後一個也不是倒數第二個,跳轉到NXMAR
LAMAR BSET IBCR,#$08 ;這是倒數第二個,禁用傳輸應答
BRA NXMAR
ENMASR BCLR IBCR,#$20 ;這是最後一個字節,生成停止信號
NXMAR MOVB IBDR,RXBUF ;讀取數據並存儲
RTI
生成重複啓動信號
在數據傳輸的末尾,如果主機想要繼續與總線通信,它可以產生另一個啓動信號,然後發送另一個從機地址而不用先產生停止信號。程序示例如下:
RESTART BSET IBCR,#$04 ;另一個啓動(重啓)
MOVB CALLING,IBDR ;傳輸主叫地址;D0=R/W
從機模式
在從機中斷服務例程中,應該檢查模塊的被尋址爲從機位(IAAS)以確定是否自己受到呼叫。如果IAAS置位,軟件應該根據R/W命令位(SRW)設置傳輸/接收模式選擇位(IBCR的Tx/Rx位)。寫入IBCR會自動清零IAAS。注意,在中斷中,IAAS會讀爲1的時刻只有在發生了地址匹配的地址週期的結尾,在隨後數據傳輸導致的中斷中,IAAS爲0。現在,可以通過寫IBDR(從機發送模式),或虛讀一次IBDR(從機接收模式)以發起數據傳輸。從機將在兩次數據傳輸間驅動SCL爲低位,當在想要的模式下訪問了IBDR,SCL被釋放。
在從機發送器例程中,必須在發送下一個數據字節前檢查接收應答位(RXAK)。RXAK爲1表示來自主機接收器的”數據結束”信號,這之後,必須由軟件切換髮送模式爲接收模式。然後進行一次虛讀以釋放SCL線,這樣主機就可以產生停止信號。
仲裁丟失
如果多個主機同時想要競爭總線,只有一個主機獲勝,其他會丟失仲裁。丟失仲裁的設備立刻由硬件切換爲從機接收模式。在丟失仲裁期間,他們會停止到SDA線的數據輸出,但是SCL會繼續生成直到字節的結尾。在這次傳輸的第九個時鐘的下降沿會發生中斷,這時IBAL=1,MS/SL=0。如果一個主機試圖在總線正被另一個主機競爭時啓動傳輸,硬件會禁止傳輸;將MS/SL位從1切換爲0,這時不會生成停止信號;生成中斷給CPU並置位IBAL以表明競爭總線失敗。考慮到這種情況,從機服務例程應該先測試IBAL,如果IBAL位置位了,軟件應該清零它。
圖 16.典型的IIC中斷服務例程流程圖
- 小心:
- 當IIC被配置爲10位地址,中斷例程中數據數組的指針必須在它被尋址後重置。