1、I2C概述
I2C總線是一種用于內(nèi)部IC控制的具有多端控制能力的雙線雙向串行數(shù)據(jù)總線系統(tǒng)。能夠用于替代標(biāo)準(zhǔn)的并行總線,連接各種集成電路和功能模塊。I2C器件的應(yīng)用能夠減少電路間連線,減少電路板尺寸,降低硬件成本,并提高了系統(tǒng)可靠性。
雖然I2C總線始終與先進(jìn)技術(shù)保持同步,但仍具有向下兼容性,高速模式下速度可達(dá)3.4Mbps,例如EEPROM和FLASH存儲(chǔ)器。
I2C傳輸模塊存在于MSP430F15/16X中,能夠?yàn)镸SP430和I2C兼容的設(shè)備互連提供接口。
I2C中關(guān)于設(shè)備的基本概念如下:
發(fā)送設(shè)備:發(fā)送數(shù)據(jù)到總線上的設(shè)備。
接收設(shè)備:從總線上接收數(shù)據(jù)的設(shè)備。
主設(shè)備:?jiǎn)?dòng)數(shù)據(jù)傳送并產(chǎn)生時(shí)鐘信號(hào)的設(shè)備。
從設(shè)備:被主器件尋址的設(shè)備。
I2C是一個(gè)多主總線,即它可以由多個(gè)互連的器件控制。所以任何一個(gè)設(shè)備都能像主控器一樣工作,并控制總線。支持I2C的設(shè)備有微控制器,,A/D、D/A轉(zhuǎn)換器,儲(chǔ)存器,LCD控制器,LED驅(qū)動(dòng)器,I/O端口擴(kuò)展器以及實(shí)時(shí)時(shí)鐘。在互連的系統(tǒng)中,每個(gè)設(shè)備都有自己的唯一地址,可以作為發(fā)送設(shè)備(LCD驅(qū)動(dòng)器)、接收設(shè)備,或同時(shí)具有發(fā)送和接收功能(存儲(chǔ)器)。根據(jù)設(shè)備是否必須啟動(dòng)數(shù)據(jù)傳輸還是僅僅被尋址的情況,發(fā)送設(shè)備或接收設(shè)備可以工作于主模式或從模式。
MSP430和有關(guān)設(shè)備互連如圖1所示。
通常的I2C總線包括:
SCL:雙向串行時(shí)鐘線。
SDA:雙向傳輸?shù)拇袛?shù)據(jù)線。
圖1:I2C總線連接
由于SDA與SCL為雙向 I/O 線,都是開(kāi)漏極端(輸出1時(shí),為高阻狀態(tài)),因此I2C總線上的所有設(shè)備的SDA和SCL引腳都要外接上拉電阻。
MSP430-I2C模塊結(jié)構(gòu)如圖2所示。
圖2:I2C模塊結(jié)構(gòu)
當(dāng)SYNC和I2C都置位的情況下,串行通信模塊USART0工作于I2C模式。由圖2可見(jiàn),MSP430-I2C模塊包括時(shí)鐘產(chǎn)生、數(shù)據(jù)發(fā)送和數(shù)據(jù)接收部件,它們通過(guò)大量的控制寄存器來(lái)實(shí)現(xiàn)靈活的I2C操作。
MSP430系列I2C模塊的主要特征如下:
1)符合I2C規(guī)范。
字/字節(jié)格式傳輸;
7位或者10位設(shè)備尋址模式;
群呼;
開(kāi)始/重新開(kāi)始/停止;
多主傳送/從接收模式;
多主接收/從發(fā)送模式;
主發(fā)送,從發(fā)送,主接收,從接收;
標(biāo)準(zhǔn)模式速度為100Kbps,快速模式速度可以達(dá)到400Kbps。
2)讀寫(xiě)采用先進(jìn)先出緩沖結(jié)構(gòu)。
3)可編程時(shí)鐘發(fā)生器。
4)16位數(shù)據(jù)訪問(wèn)可達(dá)到總線的最大吞吐率。
5)自動(dòng)數(shù)據(jù)字節(jié)計(jì)算。
6)支持低功耗模式。
7)從接收根據(jù)檢測(cè)到開(kāi)始信號(hào)自動(dòng)將MSP430從LPMx模式喚醒。
8)兩個(gè)DMA觸發(fā)源。
9)中斷功能豐富。
10)只能用USART0實(shí)現(xiàn)I2C操作。
2、I2C模式
2.1 I2C的尋址模式
早期的I2C總線數(shù)據(jù)傳輸速率最高為I00Kbits/s,采用7位尋址。但是由于數(shù)據(jù)傳輸速率和應(yīng)用功能的迅速增加,I2C總線也增強(qiáng)為快速模式(400Kb1ts/s)和10位尋址以滿足更高速度和更大尋址空間的需求。
MSP430-I2C模塊支持7位和10位兩種尋址模式,7位尋址模式最多尋址128個(gè)設(shè)備,10位尋址格式最多尋址1024個(gè)設(shè)備。12C總線理論上可以允許的最大設(shè)備數(shù),是以總線上所有器件的電容總和不超過(guò)400pF為限(其中包括連線本身的電容和其連接端的引出電容),總線上所有器件要依靠SDA發(fā)送的地址信號(hào)尋址,不需要片選信號(hào)。
(1)7位尋址模式
圖3所示為7位地址方式下I2C數(shù)據(jù)傳輸格式。第一個(gè)字節(jié)由7位從地址和R/W區(qū)(讀/寫(xiě)位)組成,不論總線上傳送地址信息還是數(shù)據(jù)信息,每個(gè)字節(jié)傳輸完畢接收設(shè)備都會(huì)發(fā)送響應(yīng)位(ACK)。地址類信息傳輸之后是數(shù)據(jù)信息,直到接收到停止信號(hào)。
圖3:7位尋址模式數(shù)據(jù)格式
(2)10位尋址模式
圖4所示為10位地址方式下I2C數(shù)據(jù)傳輸格式。第一個(gè)字節(jié)由二進(jìn)制位11110和從地址的最高兩位以及讀寫(xiě)控制位R/W組成,第一個(gè)字節(jié)傳輸完畢依然還是響應(yīng)位,第二個(gè)字節(jié)就是10位從地址的低8位,后面是響應(yīng)位和數(shù)據(jù)。
圖4:10位尋址模式數(shù)據(jù)格式
(3)二次發(fā)送從地址模式(重復(fù)產(chǎn)生起始信號(hào))
主設(shè)備可以在不停止傳輸?shù)那闆r下改變SDA上傳輸?shù)臄?shù)據(jù)流方向,方法就是主設(shè)備再次發(fā)送開(kāi)始信號(hào),并重新發(fā)送從地址和讀寫(xiě)控制位R/W。圖5所示為重新產(chǎn)生起始信號(hào)數(shù)據(jù)傳輸格式。
圖5:二次發(fā)送從地址模式數(shù)據(jù)格式
2.2 I2C模塊傳輸特性
I2C模塊能在兩個(gè)設(shè)備之間傳輸信息,采用的方法是總線的電氣特征、總線仲裁和時(shí)鐘同步。
(1)電氣特性
口起始位:SCL=1時(shí),SDA上有下降沿。
口停止位:SCL=1時(shí),SDA上有上升沿。
起始位之后總線被認(rèn)為忙:有數(shù)據(jù)在傳輸。SCL為高電平的時(shí)候,SDA的數(shù)據(jù)必須保持穩(wěn)定,否則由于起始位和停止位的電氣邊沿特性,SDA上數(shù)據(jù)發(fā)生改變將被識(shí)別成起始位或者停止位。所以只有當(dāng)SCL為低電平的時(shí)候才允許SDA上的數(shù)據(jù)改變。停止位之后總線被認(rèn)為空閑,空閑狀態(tài)時(shí)SDA和SCL都是高電平。當(dāng)一個(gè)字節(jié)發(fā)送或接收完畢需要CPU干預(yù)的時(shí)候,SCL一直保持為低。
起始位、停止位和數(shù)據(jù)位在SDA和SCL總線上的關(guān)系如圖6所示。
圖6:I2C模塊數(shù)據(jù)傳輸
起始位和停止位都是主設(shè)備產(chǎn)生的,主設(shè)備為數(shù)據(jù)傳輸產(chǎn)生時(shí)鐘信號(hào):主設(shè)備在傳輸每個(gè)數(shù)據(jù)位時(shí)都會(huì)產(chǎn)生一個(gè)時(shí)鐘脈沖,如圖7所示。
圖7:I2C總線上的位傳輸
(2)總線仲裁
當(dāng)兩個(gè)或多個(gè)主發(fā)送設(shè)備在總線上同時(shí)開(kāi)始發(fā)送數(shù)據(jù)時(shí),總線仲裁過(guò)程能夠避免總線沖突,如圖8所示。
當(dāng)兩個(gè)設(shè)備同時(shí)發(fā)出起始位進(jìn)行數(shù)據(jù)傳輸時(shí),相互競(jìng)爭(zhēng)的設(shè)備使它們的時(shí)鐘保持同步,正常發(fā)送數(shù)據(jù)。沒(méi)有檢測(cè)到?jīng)_突之前,每個(gè)設(shè)備都認(rèn)為只有自己在使用總線。
圖8:兩個(gè)設(shè)備之間的仲裁過(guò)程
仲裁過(guò)程中使用的數(shù)據(jù)就是相互競(jìng)爭(zhēng)的設(shè)備發(fā)送到SDA線上的數(shù)據(jù)。第一個(gè)檢測(cè)到自己發(fā)送的數(shù)據(jù)和總線上數(shù)據(jù)不匹配的設(shè)備就失去仲裁能力。如果兩個(gè)或更多的設(shè)備發(fā)送的第一個(gè)字節(jié)的內(nèi)容相同,那么仲裁就發(fā)生在隨后傳輸中。也許直到相互競(jìng)爭(zhēng)的設(shè)備已經(jīng)傳輸了許多字節(jié)后,仲裁才會(huì)完成。產(chǎn)生競(jìng)爭(zhēng)的時(shí)候,如果某個(gè)設(shè)備當(dāng)前發(fā)送位的二進(jìn)制數(shù)值和前一個(gè)時(shí)鐘節(jié)拍發(fā)送的內(nèi)容相同,那么它在仲裁過(guò)程中就獲得較高的優(yōu)先級(jí)。圖4中,第一個(gè)主發(fā)送設(shè)備產(chǎn)生的邏輯高電平被第二個(gè)主發(fā)送設(shè)備產(chǎn)生的邏輯低電平否決,因?yàn)榍耙粋€(gè)節(jié)拍總線上是低電平。失去仲裁的第一個(gè)主發(fā)送設(shè)備轉(zhuǎn)變成從接收模式,并且設(shè)置仲裁失效中斷標(biāo)志ALIFG。
如果系統(tǒng)中有多個(gè)主設(shè)備,就必須用仲裁來(lái)避免總線沖突和數(shù)據(jù)丟失。
注童:仲裁不能發(fā)生在以下場(chǎng)合:
重復(fù)起始位和數(shù)據(jù)位之間。
停止位和數(shù)據(jù)位之間。
重復(fù)起始位和停止位之間。
(3)時(shí)鐘同步
仲裁過(guò)程中,要對(duì)來(lái)自不同主設(shè)備的時(shí)鐘進(jìn)行同步處理。在SCL上第一個(gè)產(chǎn)生低電平的主設(shè)備強(qiáng)制其他主設(shè)備也發(fā)送低電平,SCL保持為低,如果某些主設(shè)備已經(jīng)結(jié)束低電平狀態(tài),就開(kāi)始等待,直到所有的主設(shè)備都結(jié)束低電平時(shí)鐘,如圖9所示。
同步過(guò)程某個(gè)快速設(shè)備的速度可能被其他設(shè)備降低。
圖9:I2C上模塊時(shí)鐘同步
2.3 I2C上模塊的傳送模式
I2C模塊的傳送模式為主從式,對(duì)系統(tǒng)中的某一器件來(lái)說(shuō)有4種可能的工作方式:主發(fā)送方式,從發(fā)送方式,主接收方式,從接收方式。
(1)主模式
在主模式,位I2CRM、I2CSTT和I2CSTP控制數(shù)據(jù)的發(fā)送和接收,如圖10所示。
圖10:I2C模塊主模式操作
主模式用I2CNDAT支持自動(dòng)數(shù)據(jù)字節(jié)計(jì)數(shù)。在I2C=0情況下,I2CNDAT被寫(xiě)入的值是將要發(fā)送或者接收的數(shù)據(jù)字節(jié)數(shù)。當(dāng)相關(guān)的所有字節(jié)傳輸完畢之后,停止位能夠自動(dòng)產(chǎn)生。
注意:當(dāng)I2CBB=1并且I2CRM=0時(shí),不能改變I2CNDAT的值。
(2)從模式
在從模式,發(fā)送和接收操作都是由I2C模塊自動(dòng)控制的。
從接收模式:主設(shè)備每產(chǎn)生一個(gè)時(shí)鐘脈沖,SDA總線上就能接收到串行數(shù)據(jù)位。
從發(fā)送模式:從設(shè)備接收到主機(jī)發(fā)送的匹配地址和主設(shè)備的數(shù)據(jù)接收請(qǐng)求后,主設(shè)備每產(chǎn)生一個(gè)時(shí)鐘脈沖,從設(shè)備就向SDA總線上發(fā)送串行數(shù)據(jù)位。
雖然從設(shè)備不產(chǎn)生時(shí)鐘信號(hào),當(dāng)一個(gè)字節(jié)接收或者發(fā)送完畢需要CPU干預(yù)時(shí)可以將SCL信號(hào)拉低。
注意:為了能夠進(jìn)行正確從模式操作,控制位I2CTRX必須被清除。
(3)I2C模塊的中斷
I2C模塊的8個(gè)中斷源共用一個(gè)中斷向量,每個(gè)中斷源有單獨(dú)的中斷使能控制位,當(dāng)某個(gè)中斷被允許,而且GIF置位,對(duì)應(yīng)的中斷標(biāo)志會(huì)產(chǎn)生中斷請(qǐng)求。I2C的中斷事件如圖11所示。
圖11:I2C的中斷事件
(4)I2C模塊的DMA與中斷操作
I2C模塊提供了兩個(gè)DMA觸發(fā)源,準(zhǔn)備接收和發(fā)送新數(shù)據(jù)時(shí)都可以觸發(fā)DMA操作。TXDMAEN和RXDMAEN是I2C模塊的DMA傳輸使能控制位。當(dāng)RXDMAEN置位時(shí),RXRDYIE被忽略,RXRDYIFG標(biāo)志不能引發(fā)中斷。當(dāng)TXDMAEN置位時(shí),TXRDYIE被忽略,TXRDYIFG標(biāo)志不能引發(fā)中斷。
3、I2C模塊寄存器及相關(guān)操作
I2C模塊有豐富的寄存器資源供用戶使用,如圖12所示。
圖12:I2C模塊的寄存器
下面分別介紹:
3.1 U0CTL,I2C模式下USART0控制寄存器
I2C模式只能由USART0實(shí)現(xiàn),所以在MSP430F15/16X系列中,USART0控制寄存器的定義和其他系列定義之間有一些差別,各位定義如下:
RXDMAEN 接收DMA使能,當(dāng)RXDMAEN置位時(shí),允許I2C模塊數(shù)據(jù)傳送給DAM控制器,同時(shí)RXRDYIE位被自動(dòng)清除。
0 禁止DMA操作;
1 使能DMA操作。
TXDMAEN 傳送DMA使能,當(dāng)TXDMAEN置位時(shí),允許數(shù)據(jù)從DMA控制器傳送到I2C模塊,同時(shí)TXRDYIE位被自動(dòng)清除。
0 禁止DMA操作;
1 使能DMA操作。
I2C I2C模式控制位,當(dāng)SYNC=1時(shí),選擇I2C或者SPI模式。
0 SPI模式;
1 I2C模式。
XA 地址擴(kuò)展位。
0 7位尋址方式;
1 10位尋址方式。
LISTEN 選擇反饋模式,該位有效的條件:MST=1同時(shí) I2CTRX=1(主機(jī)發(fā)送)。
0 正常模式(無(wú)反饋);
1 反饋模式(SDA數(shù)據(jù)由內(nèi)部反饋給接收器)。
MST 主機(jī)、從機(jī)模式選擇,當(dāng)仲裁失效時(shí),該位自動(dòng)被清除。
0 從機(jī)模式;
1 主機(jī)模式。
I2CEN I2C模塊使能控制,該位初始狀態(tài)為置位,另外SWRST只對(duì)SPI或UART有效。當(dāng)I2C和SYNC位在PUC后首次置位時(shí),該位是I2CEN功能,并能被自動(dòng)清除。
0 I2C操作被禁止;
1 I2C操作使能。
注意:在I2C模式下,設(shè)置I2CEN=0會(huì)產(chǎn)生如下影響:
I2C通信停止。
SDA和SCL都是高阻狀態(tài)。
I2CTCTL的位3~0被清除,位4~7不變。
奇存器I2CDTCL、I2CDR被清除。
發(fā)送和接收數(shù)據(jù)寄存器被清除。
等存器U0CTL、I2CNDAT、I2CSCLL、I2CSCLH、I2COA、I2CSA、I2CIE、I2CIFG和I2CIV內(nèi)容不變。
U0CTL在I2C模式的一些常見(jiàn)初始化操作如下:
(1)配置USART為I2C操作
USART可進(jìn)行的傳輸模式有UART、SPI和I2C。所以在傳輸之前要正確選擇模式,由U0CTL定義:SYNC=0選擇UART模式,BIT5為SPB;SYNC=1選擇SPI或I2C模式,BIT5為I2C。另外由I2C位來(lái)選擇兩種模式之一:復(fù)位為SPI模式,置位為I2C模式。具體設(shè)置如圖13所示。
圖13:USART模式選擇控制
初始化之后,I2C模塊為接收和發(fā)送數(shù)據(jù)做準(zhǔn)備。如果清除I2CEN,I2C模塊不能進(jìn)行I2C操作。
(2)重新配置12c模塊進(jìn)行UART或者SPI操作
重新配置順序:
清除I2C、I2CEN和SYNC位(CLR.B &U0CTL)。
設(shè)置SWRST位(MOV.B #SWRST,&U0CTL)。
進(jìn)行UART或者SPI模式的初始化。
》》》在SWART=1情況下初始化所有USART寄存器(包括UxCTL):
通過(guò)特殊功能寄存器MEx使能USART模塊(URXEx,UTXEx之一或全部);
軟件清除SWRST位(BIC.B #SWRST,&UxCTL);
通過(guò)特殊功能寄存器IEx中斷使能(URXIEx,UTXIEx之一或全部)(可選)。
(3)復(fù)位條件下配置I2C模式
配置順序:
在SWRST=1情況下選擇I2C模式(BIS.B #SYNC+I2C,&U0CTL)。
清除I2CEN位(BIC.B #I2CEN,&U0CTL)。
在I2C=0情況下重新配置I2C模塊。
軟件設(shè)置I2CEN(BIS.B #I2CEN,&U0CTL)。
注意:配置或者重新配置I2C模塊,必須要在控制位I2C=0的條件下進(jìn)行初始化。
3.2 I2CCTL,I2C傳輸控制寄存器
各位定義如下:
其中陰影部分只有在I2CEN=0時(shí)才能被修改。
I2CWORD 選擇I2C數(shù)據(jù)寄存器是字節(jié)還是字模式。
0 字節(jié)模式;
1 字模式。
I2CCRM I2C重復(fù)模式控制位。
0 傳輸?shù)淖止?jié)數(shù)由寄存器I2CNDAT定義;
1 傳輸?shù)淖止?jié)數(shù)由軟件設(shè)置。
I2CSSELx I2C時(shí)鐘源選擇位,當(dāng)MST=1且仲裁失效時(shí),外部的SCL信號(hào)自動(dòng)被應(yīng)用。
00 無(wú)時(shí)鐘信號(hào)(I2C模塊處于非活動(dòng)狀態(tài));
01 ACLK;
10 SMCLK;
11 SMCLK。
I2CTRX 在MST=1(主機(jī)模式)時(shí),該位選擇I2C設(shè)備的操作類型是接收還是發(fā)送。當(dāng)MST=0(從機(jī)模式)時(shí),地址字節(jié)的R/W位用來(lái)定義數(shù)據(jù)傳輸方向,同時(shí)I2CTRX反映SDA引腳上的數(shù)據(jù)方向。
0 接收模式,SDA引腳接收數(shù)據(jù);
1 發(fā)送模式,SDA引腳發(fā)送數(shù)據(jù)。
I2CSTB 當(dāng)MST=1時(shí),I2CSTB置位可以初始化一個(gè)開(kāi)始字節(jié)。
0 無(wú)操作;
1 發(fā)送開(kāi)始信號(hào),開(kāi)始字節(jié)(03H),沒(méi)有結(jié)束信號(hào)。
I2CSTP 用來(lái)產(chǎn)生結(jié)束信號(hào),結(jié)束信號(hào)發(fā)出后,I2CSTP自動(dòng)被清除。
0 無(wú)信號(hào);
1 發(fā)送結(jié)束信號(hào)。
I2CSTT 用來(lái)產(chǎn)生開(kāi)始信號(hào),開(kāi)始信號(hào)產(chǎn)生后,I2CSTT仃自動(dòng)被清除。
0 無(wú)信號(hào);
1 發(fā)送開(kāi)始信號(hào)。
3.3 I2CDCTL,I2C數(shù)據(jù)控制寄存器
Unused 沒(méi)有定義,讀出值為0。
I2CBUSY I2C模塊是否空閑。
0 I2C模塊空閑;
1 I2C模塊忙。
I2CSCLLOW 當(dāng)MSP430作為主機(jī)且沒(méi)用作從機(jī)模式時(shí),某個(gè)從設(shè)備將SCL線拉為低電平。
0 SCL沒(méi)有被拉為低電平;
1 SCL被拉為低電平。
I2CSBD 該位選擇接收寄存器的數(shù)據(jù)是字還是字節(jié)。當(dāng)I2CWORD=1時(shí),該位有效。
0 接收內(nèi)容為一個(gè)字;
1 I2CDR的低字節(jié)數(shù)據(jù)有效(被接收)。
I2CTXUDF 標(biāo)志I2C發(fā)送是否發(fā)生下溢。
0 沒(méi)有發(fā)生下溢;
1 發(fā)生下溢。
I2CRXOVR 標(biāo)志I2C接收是否發(fā)生上溢。
0 沒(méi)有發(fā)生上溢;
1 發(fā)生上溢。
發(fā)送下溢:在主模式,當(dāng)發(fā)送移位寄存器和發(fā)送緩沖器都空并且I2CNDAT>0時(shí),會(huì)發(fā)生發(fā)送下溢。在從模式,當(dāng)發(fā)送移位寄存器和發(fā)送緩沖器都為空并且另外的I2C主設(shè)備請(qǐng)求接收數(shù)據(jù),會(huì)發(fā)生發(fā)送下溢,I2CTXUDF被置位。I2CTXUDF復(fù)位的方法:向I2CDR寫(xiě)入數(shù)據(jù)或者復(fù)位I2CEN。I2CTXUDF只能用在發(fā)送模式。
接收上溢:當(dāng)接收移位寄存器和接收緩沖器滿,接收上溢發(fā)生,I2CRXOVR被置位,SCL保持低電平,能夠阻止總線的活動(dòng),因此發(fā)生上溢不會(huì)丟失數(shù)據(jù)。I2CRXOVR復(fù)位的方法:讀取I2CDR的數(shù)據(jù)或者復(fù)位I2CEN。I2CRXOVR只能用在接收模式。
I2CBB 判斷I2C總線是否忙。開(kāi)始信號(hào)將該位置1,停止信號(hào)或I2CEN=0時(shí),該位復(fù)位。
0 總線不忙;
1 總線忙。
3.4 I2CDR,I2C數(shù)據(jù)寄存器
通過(guò)位I2CWORD的控制柜,I2C數(shù)據(jù)寄存器可以被選擇作為8位或者16位。圖14就是I2C數(shù)據(jù)寄存器的功能。
圖14:I2C數(shù)據(jù)寄存器的功能
3.5 I2CNDAT,I2C字節(jié)數(shù)寄存器
I2CNDAT 內(nèi)容默認(rèn)為字節(jié)數(shù),當(dāng)I2C模塊工作于字模式時(shí),該寄存器中的值必須為偶數(shù)。
當(dāng)I2CBB=1時(shí),該寄存器值為傳輸過(guò)程的字節(jié)數(shù)。
當(dāng)I2CBB=0時(shí),該寄存器值為將要傳輸?shù)淖止?jié)數(shù)。
注意:當(dāng)I2CBB=1并且I2CRM=0時(shí),不能修改I2CNDAT。
3.6 I2CPSC,I2C分頻寄存器
I2C模塊輸入時(shí)鐘分頻后作為I2C模塊的內(nèi)部時(shí)鐘。分頻因子為I2CPSC的值加1。
000H 1分頻
001H 2分頻
......
0FFH 256分頻
3.7 I2CSCLH,I2C時(shí)鐘高電平調(diào)整寄存器
該寄存器為8位,當(dāng)I2C模塊工作于主模式,I2CSCLH和I2CPSC的值能夠定義SCL上的高電平寬度。
高電平寬度=(I2CSCLH+2)×I2CPSC
000H SCL高電平寬度=5×I2CPSC
001H SCL高電平寬度=5×I2CPSC
002H SCL高電平寬度=5×I2CPSC
003H SCL高電平寬度=5×I2CPSC
004H SCL高電平寬度=6×I2CPSC
......
0FFH SCL高電平寬度=257×I2CPSC
I2CSCLH只有在I2CEN=0時(shí)候才能被修改。
3.8 I2CSCLL,I2C時(shí)鐘低電平調(diào)整寄存器
該寄存器為8位,當(dāng)I2C模塊工作于主模式,I2CSCLL和I2CPSC的值能夠定義SCL的低電平寬度。
低電平寬度=(I2CSCLL+2)×I2CPSC
000H SCL低電平寬度=5×I2CPSC
001H SCL低電平寬度=5×I2CPSC
002H SCL低電平寬度=5×I2CPSC
003H SCL低電平寬度=5×I2CPSC
004H SCL低電平寬度=6×I2CPSC
......
0FFH SCL低電平寬度=257×I2CPSC
I2CSCLL只有在I2CEN=0時(shí)候才能被修改。
I2C模塊所用的時(shí)鐘源由I2CSSELx控制位選擇,寄存器I2CPSC、I2CSCLH和I2CSCLL決定主模式下SCL時(shí)鐘頻率,如圖15所示。不論主模式還是從模式,I2C模塊的時(shí)鐘源頻率至少為10倍的SCL頻率。
圖15:I2C模塊SCL時(shí)鐘產(chǎn)生
3.9 I2COA,I2C本地地址寄存器
I2COA內(nèi)容為MSP430本地 I2C模塊地址,有7位和10位兩種地址格式, I2COA寄存器為右對(duì)齊,最高位分別為位6和位9。
3.10 I2CSA , I2C從設(shè)備地址寄存器
I2CSA內(nèi)容為MSP430所尋址的外部設(shè)備地址, I2CSA只在主機(jī)模式才有效,格式同 I2COA。
3.11 I2CIE,I2C中斷使能寄存器
STTIE 開(kāi)始檢測(cè)中斷使能控制。
0 中斷禁止;
1 中斷使能。
GCIE 群呼中斷使能控制。
0 中斷禁止;
1 中斷使能。
TXRDYIE 傳送準(zhǔn)備好中斷使能控制,當(dāng)TXDMANE=1時(shí),該位自動(dòng)被清除。
0 中斷禁止;
1 中斷使能。
RXRDYIE 接收準(zhǔn)備好中斷使能控制,當(dāng)RXDMANE=1時(shí),該位自動(dòng)被清除。
0 中斷禁止;
1 中斷使能。
ARDYIE 訪問(wèn)準(zhǔn)備好中斷使能控制。
0 中斷禁止;
1 中斷使能。
OAIE 本地地址中斷使能控制。
0 中斷禁止;
1 中斷使能。
NACKIE 沒(méi)有響應(yīng)中斷使能控制。
0 中斷禁止;
1 中斷使能。
ALIE 仲裁失效中斷控制。
0 中斷禁止;
1 中斷使能。
3.12 I2CIFG,I2C中斷標(biāo)志寄存器
STTIFG 開(kāi)始檢測(cè)中斷請(qǐng)求標(biāo)志。
0 沒(méi)有中斷請(qǐng)求;
1 有中斷請(qǐng)求。
GCIFG 群呼中斷請(qǐng)求標(biāo)志。
0 沒(méi)有中斷請(qǐng)求;
1 有中斷請(qǐng)求。
TXRDYIFG 傳送準(zhǔn)備好中斷標(biāo)志。
0 沒(méi)有中斷請(qǐng)求;
1 有中斷請(qǐng)求。
RXRDYIFG 接收準(zhǔn)備好中斷請(qǐng)求標(biāo)志。
0 沒(méi)有中斷請(qǐng)求;
1 有中斷請(qǐng)求。
ARDYIFG 訪問(wèn)準(zhǔn)備好中斷標(biāo)志,圖16為ARDYIFG置位條件。
圖16:ARDYIFG置位條件
OAIFG 本地地址中斷標(biāo)志。
0 沒(méi)有中斷請(qǐng)求;
1 有中斷請(qǐng)求。
NACKIFG 沒(méi)有響應(yīng)中斷標(biāo)志。
0 沒(méi)有中斷請(qǐng)求;
1 有中斷請(qǐng)求。
ALIFG 仲裁失效中斷標(biāo)志。
0 沒(méi)有中斷請(qǐng)求;
1 有中斷請(qǐng)求。
3.13 I2CIV中斷向量寄存器
MSP430的I2C模塊有8個(gè)中斷標(biāo)志,但只有一個(gè)中斷向量。8個(gè)中斷標(biāo)志共用一個(gè)中斷向量,中斷向量寄存器內(nèi)容決定當(dāng)前哪個(gè)中斷標(biāo)志可以引起中斷事件。
MSP430的I2C模塊可以工作在低功耗模式下,只要I2C模塊所需的內(nèi)部時(shí)鐘源出現(xiàn),I2C模塊就進(jìn)入活動(dòng)模式。
當(dāng)I2C模塊工作于從模式,即使沒(méi)有出現(xiàn)內(nèi)部時(shí)鐘源,只要STTIE和GIE中斷允許位置位,當(dāng)I2C模塊檢測(cè)到起始位時(shí),置位STTIFG中斷標(biāo)志,所以CPU被喚醒。此時(shí),SCL保持為低,暫停總線的進(jìn)一步活動(dòng)。中斷服務(wù)程序必須重新使能I2C的內(nèi)部時(shí)鐘源,這樣I2C才能釋放SCL使總線活動(dòng)恢復(fù)正常。
4、I2C應(yīng)用舉例
例:通過(guò)I2C總線互連的兩片MSP430F169之間的通信。
互連的兩片MSP430F169簡(jiǎn)稱主169和從169。
(1)主169讀從169。其中從169發(fā)送的數(shù)據(jù)從0開(kāi)始,依次遞增(所用的時(shí)鐘為默認(rèn)值)。
實(shí)現(xiàn)上述功能代碼如下:
/********************main函數(shù)********************/
#include "msp430x16x.h"
char RXData=0;
char TestData=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL |= 0X0A; //端口P3作為I2C引腳
P1DIR |= 0X01; //P1.0輸出
P1OUT &= ~0X01; //清楚P1.0
U0CTL |= I2C + SYNC; //推薦的初始化順序
U0CTL &= ~I2CEN;
I2CTCTL |= I2CSSEL1; //SMCLK
I2CNDAT = 0X01; //讀一個(gè)字節(jié)
I2CSA = 0X0048; //從地址048h
I2CIE = RXRDYIE; //使能RXRDYIFG中斷
U0CTL |= I2CEN; //使能I2C
_EINT(); //使能總中斷
while(1)
{
U0CTL |= MST; //主模式
I2CTCTL |= I2CSTT + I2CSTP; //初始化傳輸
_BIS_SR(CPUOff); //進(jìn)入LPM0
P1OUT |= 0X01; //置位P1.0
if (TestData++ != RXData) break; //測(cè)試接收的數(shù)據(jù)
P1OUT &= ~0X01; //數(shù)據(jù)正確清除P1.0
}
while(1); //接收數(shù)據(jù)不正確
}
/********************I2C模塊中斷處理子程序********************/
#pragma vector = USART0TX_VECTOR
__interrupt void I2C_ISR(void)
{
switch(I2CIV)
{
case 0: break; //沒(méi)有中斷
case 2: break; //仲裁失效
case 4: break; //沒(méi)有響應(yīng)
case 6: break; //本地地址
case 8: break; //寄存器訪問(wèn)準(zhǔn)備好
case 10: //接收準(zhǔn)備好
RXData = I2CDRB; //接收數(shù)據(jù)
_BIC_SR_IRQ(CPUOff); //退出 LPM0
break;
case 12: break; //發(fā)送準(zhǔn)備好
case 14: break; //群呼
case 16: break; //起始檢測(cè)
}
}
接收數(shù)據(jù)正確則P1.0由1變?yōu)?,否則P1.0一直保持置位??衫肞1.0外接示波器來(lái)觀察結(jié)果。
(2)從169讀主169(要求同上)
實(shí)現(xiàn)此功能的代碼如下:
/********************main函數(shù)********************/
#include "msp430x16x.h"
char TXData=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL |= 0X0A;
U0CTL |= I2C + SYNC;
U0CTL &= ~I2CEN;
I2CTCTL |= I2CSSEL1;
I2COA = 0X0048;
I2CIE = TXRDYIE; //使能TXRDYIE中斷
U0CTL |= I2CEN;
_BIS_SR(LMP0_bits + GIE);
}
/********************I2C模塊中斷處理子程序********************/
#pragma vector = USART0TX_VECTOR
__interrupt void I2C_ISR(void)
{
switch(I2CIV)
{
case 2: break;
case 4: break;
上一篇:MSP430系列通用串行通信模塊的異步模式(USART)
下一篇:MSP430單片機(jī)中斷的的優(yōu)先級(jí)順序定義
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- RISC-V人才該怎么培養(yǎng)?專家這樣說(shuō)
- 割草機(jī)器人,四大流派的巔峰之戰(zhàn)
- 車載顯示迎來(lái)三大革命丨“形態(tài)”革命
- 什么是“CDC+空懸”?
- 汽車電子信息安全:如何有效保護(hù)硬件Debug口?
- 新能源汽車核心技術(shù)之“大三電”、“小三電”
- 芯原如何推動(dòng)RISC-V嵌入式軟件人才發(fā)展?
- Arm 技術(shù)助力《國(guó)家地理》探險(xiǎn)家繪制地球海洋圖景
- Arm SME2 技術(shù)加速安卓 AI 升級(jí),驅(qū)動(dòng)移動(dòng)應(yīng)用下一代功能革新
- VGA接口定義、功能用途和種類
- 有獎(jiǎng)直播|TI DLP® 技術(shù)在AR HUD及車內(nèi)顯示應(yīng)用的展望
- 獨(dú)家拆解 | 語(yǔ)音控制在真無(wú)線立體聲TWS耳機(jī)上的創(chuàng)新應(yīng)用
- 幸運(yùn)十一月,器件購(gòu)買e問(wèn)e答!
- 快來(lái)應(yīng)援吧!投票選出你最愛(ài)的TI培訓(xùn)課程
- 了解數(shù)字功能的模擬控制器,千元好禮等你來(lái)拿!
- 4月25日上午10:00-11:30 ADI與您相約 TOF (Time Of Flight) 技術(shù)介紹及產(chǎn)品應(yīng)用 有獎(jiǎng)直播
- 有獎(jiǎng)直播:使用 NI CompactDAQ 和 LabVIEW構(gòu)建基于傳感器的測(cè)試系統(tǒng)
- 答題贏好禮 | TDK專題報(bào)道只等你來(lái)(第3期)
- e絡(luò)盟大講堂—告別冗長(zhǎng)的手動(dòng)測(cè)試
- TE白皮書(shū)下載|《散熱橋技術(shù)——電子設(shè)備散熱領(lǐng)域的創(chuàng)新》
- 四大全球?qū)Ш较到y(tǒng)之一的伽利略居然癱瘓了
- 新版USB Type-C新規(guī)范出爐,可直接支持HDMI輸出
- 技術(shù)文章—了解PFC對(duì)實(shí)現(xiàn)高能效至關(guān)重要
- 技術(shù)文章—邊緣智能傳感可實(shí)現(xiàn)更智能的自主機(jī)器人
- 技術(shù)文章—智能音箱語(yǔ)音子系統(tǒng)介紹
- “2019中國(guó)(南京)國(guó)際無(wú)人機(jī)系統(tǒng)產(chǎn)業(yè)大會(huì)”明日正式開(kāi)幕,我們不見(jiàn)不散!
- 氫燃料沒(méi)必要?碳離子電池充電速度加快100倍
- 錯(cuò)誤解決:STM32F103串口1與串口3相同代碼卻結(jié)果不同
- ARM GCC浮點(diǎn)相關(guān)總結(jié)
- 軟浮點(diǎn) 技術(shù)使用--GCC