最近在寫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。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQ3chVEa0V3bT9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVPj1mY2pESkpXOsJGc4JDTwYVbiVHNHpleO1GTulzRilWO5x0LcRHelR3LcJzLctmch1mclRXY39zN0cTOzMDMxITOwUDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
圖 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預設為從機模式。 |
保留 | 保留 — 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。 |
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沒有用。 |
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 | 通用呼叫位址 | |
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,#$,END ;如果沒有應答的話就跳到END
MOVB DATABUF,IBDR ;發送資料的下一個位元組
DEC TXCNT ;遞減TXCNT
BRA EMASTX ;退出
END BCLR IBCR,#$ ;生成一個停止信号
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位位址,中斷例程中資料數組的指針必須在它被尋址後重置。