1、I2C通信特征
1.1、物理接口:SCL + SDA
(1)SCL(serial clock):時(shí)鐘線,傳輸CLK信號(hào),一般是I2C主設(shè)備向從設(shè)備提供時(shí)鐘的通道。
(2)SDA(serial data): 數(shù)據(jù)線,通信數(shù)據(jù)都通過SDA線傳輸
1.2、通信特征:串行、同步、非差分、低速率
串行:只有一根數(shù)據(jù)線,每次傳輸一個(gè)bit位;
同步:主設(shè)備和從設(shè)備的工作時(shí)鐘頻率是一樣的,主設(shè)備通過SCL時(shí)鐘線給從設(shè)備提供時(shí)鐘頻率;
非差分:因?yàn)镮2C通信速率不高,而且通信雙方距離很近,一般是板級(jí)通信,所以使用電平信號(hào)通信;
低速率:I2C一般是用在同一個(gè)板子上的2個(gè)IC之間的通信,而且用來傳輸?shù)臄?shù)據(jù)量不大,所以本身通信速率很低。一般幾百KHz,不同的I2C芯片的通信速率可能不同,具體在編程的時(shí)候要看自己所使用的設(shè)備允許的I2C通信最高速率,不能超過這個(gè)速率;
1.3、通信模式:主設(shè)備+從設(shè)備
(1)I2C通信時(shí),通信設(shè)備之間的地位是平等的,分為主設(shè)備和從設(shè)備,其中主設(shè)備一個(gè)、從設(shè)備多個(gè)。主設(shè)備要主導(dǎo)整個(gè)通信過程,從設(shè)備根據(jù)I2C協(xié)議被動(dòng)的響應(yīng)主設(shè)備;
(2)在I2C通信中,沒有規(guī)定誰做主設(shè)備、誰做從設(shè)備,是通信雙方自己協(xié)商的。一個(gè)設(shè)備在同一時(shí)間只能做主設(shè)備或者從設(shè)備,但是有的設(shè)備可以通過軟件配置來決定在此次通信時(shí)做主設(shè)備還是從設(shè)備。
1.4、可以多個(gè)設(shè)備掛在一條總線上
(1)I2C總線上可以掛載一個(gè)主設(shè)備和多個(gè)從設(shè)備,實(shí)現(xiàn)一對(duì)一(一個(gè)主設(shè)備 + 一個(gè)從設(shè)備)或者一對(duì)多(一個(gè)主設(shè)備 + 多個(gè)從設(shè)備)的通信;
(2)主設(shè)備負(fù)責(zé)調(diào)度總線,決定某個(gè)時(shí)間和其中一個(gè)從設(shè)備通信。在同一時(shí)間,只有主設(shè)備和其中一個(gè)從設(shè)備通信,其余的從設(shè)備處于等待狀態(tài),等待主設(shè)備與其通信;
(3)每個(gè)從設(shè)備在I2C總線上都有唯一的地址,主設(shè)備就是通過地址來區(qū)分不同的從設(shè)備,從而決定和哪一個(gè)從設(shè)備通信。
1.5、I2C總線的狀態(tài)
空閑態(tài):當(dāng)SCL與SDA同時(shí)為高電平時(shí),為空閑態(tài);
忙態(tài):主設(shè)備和從設(shè)備正在通信;
起始狀態(tài):當(dāng)主設(shè)備在I2C總線上發(fā)出起始信號(hào),開始一次通信;
停止?fàn)顟B(tài):當(dāng)主設(shè)備在I2C總線上發(fā)出停止信號(hào),停止本次通信;
1.6、I2C總線協(xié)議
(1)主設(shè)備發(fā)送一個(gè)起始信號(hào);
(2)主設(shè)備接著發(fā)送8bit數(shù)據(jù),其中7位是從設(shè)備的地址,一位表示此次主設(shè)備是要讀數(shù)據(jù)海思寫數(shù)據(jù);
(3)和主設(shè)備發(fā)送的地址匹配的從設(shè)備發(fā)出一個(gè)ack響應(yīng)信號(hào);
(4)主/從設(shè)備將數(shù)據(jù)發(fā)送到SDA總線上,每次傳輸都是8bit數(shù)據(jù);
(5)主/從設(shè)備從SDA線上接收數(shù)據(jù),并發(fā)送一個(gè)ACK響應(yīng)信號(hào);
(6)還可以接著n個(gè)發(fā)送和接收的過程;
(7)主設(shè)備發(fā)送停止信號(hào),停止本次通信;
1.7、I2C從設(shè)備地址
(1)I2C通信的每次有效數(shù)據(jù)都是8bit,從設(shè)備地址是7bit,但是I2C主設(shè)備發(fā)送從設(shè)備地址時(shí)還是發(fā)送的8bit;
(2)在主設(shè)備發(fā)送從設(shè)備地址時(shí),8bit數(shù)據(jù)中高7位是從設(shè)備地址,最低一位(LSB)是表示讀寫位;
(3)舉例:KXTE9芯片的I2C地址固定為0b0001111(0x0f),最低位是1表示主設(shè)備讀從設(shè)備,最低位是0則表示主設(shè)備寫從設(shè)備。主設(shè)備讀從設(shè)備時(shí)SAD是0b00011111,主設(shè)備寫從設(shè)備SAD應(yīng)該是0b00011110。
1.8、從設(shè)備地址知識(shí)補(bǔ)充
(1)一般從設(shè)備的地址都是固定的,在數(shù)據(jù)手冊(cè)里可以查到,這也就是意味著在同一條I2C總線上,不能有兩個(gè)及以上的同款從設(shè)備,不然就無法通過從地址來區(qū)分這兩個(gè)設(shè)備。大多數(shù)的從設(shè)備地址都是固定的,因?yàn)闆]有必要同時(shí)接兩個(gè),比如重力傳感器,你接一個(gè)就可以測(cè)出重力加速度,何必接兩個(gè)。但是也有些設(shè)備需要同時(shí)接多個(gè),比如一塊EEPROM芯片(I2C接口)的容量不夠就可能接兩個(gè)。對(duì)于這種情況,生成EEPROM的廠家是做了預(yù)留的,EEPROM芯片的從地址一部分是固定的,一部分是通過給EEPROM芯片的引腳接高低電平來決定的。
(2)假設(shè)EEPROM芯片的7位地址,其中高5位是固定的0b111111,低兩位是根據(jù)兩個(gè)引腳的高低電平來確定,接高電平代表1,接低電平代表0。一塊芯片把兩個(gè)引腳接高電平,則從設(shè)備地址是0b11111111;另一塊芯片把兩個(gè)引腳把低電平,則從設(shè)備地址是0b111100。
1.9、主要用途
I2C通常是用在板級(jí)通信的,距離很近,Soc和各種外設(shè)的通信就是I2C通信方式,比如觸摸屏、各種sensor等,外設(shè)的數(shù)據(jù)手冊(cè)里會(huì)說明通信方式;
2、I2C控制器的結(jié)構(gòu)框圖
(1)最左側(cè)是I2C總線的時(shí)鐘來源,來源是時(shí)鐘系統(tǒng)的PCLK_PSYS,PCLK_PSYS經(jīng)過分頻后得到I2C總線的時(shí)鐘頻率,然后主設(shè)備會(huì)通過SCL線將時(shí)鐘信號(hào)傳給從設(shè)備;
(2)I2C總線的控制單元,里面包含兩個(gè)重要的寄存器:I2CCON和I2CSTAT寄存器??刂茊卧獣?huì)對(duì)PCLK_PSYS時(shí)鐘信號(hào)進(jìn)行兩級(jí)分頻,產(chǎn)生通信需要的時(shí)序信號(hào),配置I2C設(shè)備的主從模式等,具體細(xì)節(jié)看兩個(gè)寄存器的說明;
(3)Address Register和Comparator是當(dāng)設(shè)備作為從設(shè)備時(shí)用到的,Address Register寄存器里保存的是自己作為從設(shè)備的地址,Comparator是比較器,比較此次從I2C設(shè)備收到的地址是否和自己的地址相等,如果相等則代表主設(shè)備要和自己通信,如果不相等,就不用對(duì)此次通信做任何處理。
(3)Shift Register和I2CDS:I2CDS寄存器是保存接收/發(fā)送的數(shù)據(jù),Shift Register是移位寄存器,負(fù)責(zé)將I2CDS寄存器里的數(shù)據(jù)一位一位的發(fā)送SDA總線上,或者將總線上的數(shù)據(jù)一位一位的存到I2CDS總線上,這要看當(dāng)時(shí)是發(fā)送模式還是接收模式。
3、I2C控制器的模式
(1)主設(shè)備發(fā)送模式;
(2)主設(shè)備接收模式;
(3)從設(shè)備發(fā)送模式;
(4)從設(shè)備接收模式;
備注:設(shè)備可以是上面四個(gè)模式中的任意一種,但是同一時(shí)間只能是其中的一種,要么是作為主設(shè)備要么是作為從設(shè)備。
4、I2C的時(shí)序分析
4.1、時(shí)序介紹
時(shí)序就是時(shí)間順序,實(shí)際上在通信中時(shí)序就是通信線上按照時(shí)間順序發(fā)生的電平變化,以及這些變化對(duì)通信的意義就叫時(shí)序,不對(duì)的通信的協(xié)議對(duì)時(shí)序的要求不同。
4.2、通信起始條件和結(jié)束條件
起始信號(hào):在SCL為高電平的時(shí)候,SDA產(chǎn)生一個(gè)下降沿;
停止信號(hào):在SCL為高電平的時(shí)候,SDA產(chǎn)生一個(gè)上升沿;
4.3、數(shù)據(jù)有效性
(1)SDA 線上的數(shù)據(jù)必須在時(shí)鐘的高電平周期保持穩(wěn)定,數(shù)據(jù)線的高或低電平狀態(tài)只有在 SCL 線的時(shí)鐘信號(hào)是低電平時(shí)才能改變。SCL為高電平時(shí)表示有效數(shù)據(jù),SDA為高電平表示“1”,低電平表示“0”;SCL為低電平時(shí)表示無效數(shù)據(jù),此時(shí)SDA會(huì)進(jìn)行電平切換,為下次數(shù)據(jù)表示做準(zhǔn)備。
(2)數(shù)據(jù)有效性:在I2C總線通信時(shí),在總線上傳輸?shù)臄?shù)據(jù)并不都是有效數(shù)據(jù)。比如開始信號(hào)和停止信號(hào),并不代表什么實(shí)際的含義,只是通信協(xié)議里規(guī)定的。正因?yàn)槲覀兊挠行?shù)據(jù)應(yīng)該在SCL為高電平時(shí)SDA保持穩(wěn)定,所以才能區(qū)分出開始信號(hào)和停止信號(hào)。
4.4、響應(yīng)ACK
主/從設(shè)備在發(fā)送完一次數(shù)據(jù)后,需要一個(gè)ACK響應(yīng)信號(hào)。每個(gè)通信周期傳輸8個(gè)數(shù)據(jù),在第九個(gè)通信周期,發(fā)送端將SDA總線拉高,然后釋放總線的控制權(quán)。如果接收端在第九個(gè)周期將SDA拉低,就是發(fā)出了ACK信號(hào),如果在第幾個(gè)周期SDA一直是高電平則代表沒有發(fā)出ACK信號(hào)。
4.5、空閑態(tài)
空閑態(tài):在I2C總線上沒有主、從設(shè)備進(jìn)行通信,此時(shí)SCL和SDA一直保持高電平;
5、I2C總線的讀/寫數(shù)據(jù)操作
5.1、寫模式
(1)主設(shè)備發(fā)送開始信號(hào);
(2)主設(shè)備接著發(fā)送8bit數(shù)據(jù),其中7bit是從設(shè)備的地址,1bit表示此次主設(shè)備是要讀數(shù)據(jù)還是寫數(shù)據(jù);
(3)從設(shè)備發(fā)送ACK響應(yīng)信號(hào);
(4)主設(shè)備將要寫的數(shù)據(jù)每次發(fā)送8bit到SDA線上,從設(shè)備接收到發(fā)送ACK響應(yīng)信號(hào);
(5)當(dāng)主設(shè)備發(fā)送完數(shù)據(jù)后,發(fā)送一個(gè)停止信號(hào);
5.2、讀模式
(1)主設(shè)備發(fā)送開始信號(hào);
(2)主設(shè)備接著發(fā)送8bit數(shù)據(jù),其中7bit是從設(shè)備的地址,1bit表示此次主設(shè)備是要讀數(shù)據(jù)還是寫數(shù)據(jù);
(3)從設(shè)備發(fā)送ACK響應(yīng)信號(hào);
(4)從設(shè)備將數(shù)據(jù)每次發(fā)送8bit到SDA線上,主設(shè)備接收到發(fā)送ACK響應(yīng)信號(hào);
(5)當(dāng)主設(shè)備接收完數(shù)據(jù)后,發(fā)送一個(gè)停止信號(hào);
6、I2C的通信流程
6.1、I2C通信的主設(shè)備發(fā)送流程
(1)通過操作I2CCON寄存器,將設(shè)備配置成主發(fā)送模式;
(2)將從設(shè)備的地址寫到I2CDS寄存器中;
(3)往I2CSTAT寄存器寫0xF0,讓I2C控制器產(chǎn)生一個(gè)開始信號(hào);
(4)移位寄存器將I2CDS里的數(shù)據(jù)發(fā)送到SDA總線上;
(5)在收到ACK信號(hào)后,中斷被掛起,需要中斷處理程序來處理;
(6)中斷處理程序判斷是否是要結(jié)束本次通信;
(7)如果不是結(jié)束本次通信,則將新的數(shù)據(jù)寫到I2CDS寄存器中,然后清中斷掛起標(biāo)志,將數(shù)據(jù)發(fā)送到SDA總線上,等待ACK信號(hào),進(jìn)入下一次判斷;
(8)如果是要結(jié)束本次通信,則往I2CSTAT寄存器中寫0xD0,產(chǎn)生一個(gè)停止信號(hào),清中斷掛起標(biāo)志,等停止信號(hào)發(fā)送完畢則結(jié)束本次通信;
6.2、I2C通信的主設(shè)備接收流程
(1)通過操作I2CCON寄存器,將設(shè)備配置成主接收模式;
(2)將從設(shè)備的地址寫到I2CDS寄存器中;
(3)往I2CSTAT寄存器寫0xB0,讓I2C控制器產(chǎn)生一個(gè)開始信號(hào);
(4)移位寄存器將I2CDS里的數(shù)據(jù)發(fā)送到SDA總線上;
(5)在收到ACK信號(hào)后,中斷被掛起,需要中斷處理程序來處理;
(6)中斷處理程序判斷是否是要結(jié)束本次通信;
(7)如果不是結(jié)束本次通信,則從I2CDS寄存器中讀取數(shù)據(jù),清中斷掛起標(biāo)志,移位器將SDA上的數(shù)據(jù)再存到I2CDS寄存器中,進(jìn)入下一次循環(huán)判斷;
(8)如果是要結(jié)束本次通信,則往I2CSTAT寄存器中寫0x90,產(chǎn)生一個(gè)停止信號(hào),清中斷掛起標(biāo)志,等停止信號(hào)發(fā)送完畢則結(jié)束本次通信;
6.3、I2C通信的從設(shè)備接收流程
(1)通過操作I2CCON寄存器,將設(shè)備配置成從接收模式;
(2)在SDA總線上檢測(cè)到開始信號(hào),I2CDS寄存器接收到數(shù)據(jù);
(3)將I2CDS寄存器中接收到的數(shù)據(jù)和I2CADD寄存器中保存的地址進(jìn)行比較;
(4)判斷是否匹配;
(5)如果不匹配,則表示主設(shè)備不是和自己通信,不用再進(jìn)行下面的步驟;
(6)I2C地址匹配則中斷產(chǎn)生,告訴設(shè)備主設(shè)備要和自己通信,并發(fā)送一個(gè)ACK信號(hào);
(7)從SDA總線上讀取數(shù)據(jù)、處理數(shù)據(jù),并發(fā)送一個(gè)ACK信號(hào),然后清中斷;
(8)判斷是否要停止本次通信,也就是有沒有檢測(cè)到主設(shè)備發(fā)送停止信號(hào);
(9)如果不停止通信,則再次從SDA總線上將數(shù)據(jù)讀取到I2CDS寄存器中,然后產(chǎn)生中斷,重復(fù)之前的步驟;
(10)如果是停止本次通信,則不再做響應(yīng)即可;
6.4、I2C通信的從設(shè)備發(fā)送流程
(1)通過操作I2CCON寄存器,將設(shè)備配置成從發(fā)送模式;
(2)在SDA總線上檢測(cè)到開始信號(hào),I2CDS寄存器接收到數(shù)據(jù);
(3)將I2CDS寄存器中接收到的數(shù)據(jù)和I2CADD寄存器中保存的地址進(jìn)行比較;
(4)判斷是否匹配;
(5)如果不匹配,則表示主設(shè)備不是和自己通信,不用再進(jìn)行下面的步驟;
(6)I2C地址匹配則中斷產(chǎn)生,告訴設(shè)備主設(shè)備要和自己通信,并發(fā)送一個(gè)ACK信號(hào);
(7)寫數(shù)據(jù)到I2CDS寄存器,然后清中斷;
(8)判斷是否要停止本次通信,也就是有沒有檢測(cè)到主設(shè)備發(fā)送停止信號(hào);
(9)如果不停止通信,則將I2CDS寄存器中的數(shù)據(jù)發(fā)送到SDA總線上,然后產(chǎn)生中斷,重復(fù)之前的步驟;
(10)如果是停止本次通信,則不再做響應(yīng)即可;
7、I2CCON寄存器
>(1)bit0-3:配置I2C時(shí)鐘信號(hào)的二級(jí)分頻系數(shù);
(2)bit4:中斷掛起標(biāo)志;
(3)bit5:I2C總線的發(fā)送/接收使能;
(4)bit6:配置I2C時(shí)鐘信號(hào)的一級(jí)分頻系數(shù);
(5)bit7:配置I2C總線是否要在每次通信周期的末尾發(fā)送ACK響應(yīng)信號(hào);
8、I2CSTAT寄存器
(1)bit0:判斷上一次的通信周期是否收到ACK響應(yīng)信號(hào);
(2)bit1:I2C總線的地址清零標(biāo)志;
(3)bit2:I2C總線從設(shè)備的地址標(biāo)志位;
(4)bit3:I2C的總線總裁標(biāo)志位;
(5)bit4:發(fā)送/接收使能位;
(6)bit5:如果是讀,0代表總線空閑,1代表總線忙;如果是寫,寫0則I2C控制器發(fā)出一個(gè)停止信號(hào),寫1則I2C控制器發(fā)出一個(gè)開始信號(hào);
(7)bit6-7:配置設(shè)備的模式;文章來源:http://www.zghlxwxcb.cn/news/detail-638232.html
9、分析KXTF9-2050芯片的I2C通信協(xié)議
參考博客:《通過KXTF9-2050芯片分析I2C協(xié)議》。文章來源地址http://www.zghlxwxcb.cn/news/detail-638232.html
到了這里,關(guān)于I2C通信協(xié)議詳解和通信流程分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!