輕鬆學ARM系列之I2C匯流排

2021-06-25 15:18:34 字數 3828 閱讀 8400

一、總體架構圖

二、i2c操作的一般步驟

2.1  檢視s5pv210開發板的i2c相關的硬體原理圖

開發板上iic實際連線電路,at24c02為eeprom,大小為2k位,256位元組

核心板對應的原理圖

2.2  設定gpio暫存器為i2c功能

配置gpd1con[0] 和 gpd1con[1] 為i2c 功能:

gpdcon.gpd1con = (gpdcon.gpd1con & (~0xff))| 0x22

2.3 檢視i2c控制器相應的章節,對相關的暫存器進行配置

選擇裝置的傳送方式,主發射,從接收模式(這個是由從裝置自動決定的)

向暫存器中寫入。每個iic獨有的裝置位址

資料移位暫存器

2.3.1 檢視at24c02相關的晶元手冊,檢視操作的順序

操作的裝置的位址為0xa0 , 對應的是寫操作, 0xa1 對應的是讀操作

2.3.2 對at24c02按照位元組的寫操作

對eeprom 按位元組寫的操作順序,先由主裝置傳送乙個start起始訊號,發乙個位元組的裝置位址(7 + 1 位 ,寫),第9位為ack應答位,發一位元組的位址(表示要往哪個位址空間寫資料,一共256個位元組位址),接著傳送一位元組的資料。發乙個ack訊號,傳送停止訊號stop。最多存放256位元組的資料

對s5pv210上相關的iic控制器,進行相應的配置。

2.3.3  對於主裝置傳送,從裝置接收。寫操作,往eeprom中寫資料

① 寫裝置位址

i2c0.i2ccon0 = 0xe0 ,512分頻,使能ack訊號,使能中斷

i2c0.i2cds0 = 0xa0;//寫從機裝置位址

i2c0.i2cstat0 = 0xf0;主裝置傳送,產生start訊號

while (!((i2c0.i2ccon0)& (1 <<4)));如果傳送完畢第5位,中斷標誌位 值為1,表示寫裝置位址成功。否側,相當於具有延時的功能。

②寫資料的位址,表示要對那乙個位元組的位址,要對他進行存放資料

i2c0.i2ccon0 = i2c0.i2ccon0 &( ~(0x1 << 4));表示清除pend狀態位,復位操 作寫;

i2c0.i2cds0 = addr; 從機的位址,0 ~ 255 之間,乙個256個位元組,因為該芯 片的大小就是2k位,256個位元組

while (!((i2c0.i2ccon0)& (1 <<4)));如果傳送完畢第5位,中斷標誌位 值為1,表示寫資料位址成功。否側,相當於具有延時的功能。

③ 在相應的位址上寫上相應的資料

i2c0.i2ccon0 = i2c0.i2ccon0 &( ~(0x1 << 4));表示清除pend狀態位,復位 操作寫;

i2c0.i2cds = data;

while (!((i2c0.i2ccon0)& (1 << 4)));如果傳送完畢第5位,中斷標誌位 值為1,表示寫資料位址成功。否側,相當於具有延時的功能。

④傳送乙個stop訊號

i2c0.i2cstat0 &= ~(1<<5); /*stop signal generation,free bus */

i2c0.i2ccon0 &= ~(1<<4); /*clean interrup pending bit */

⑤ 至此一次寫操作順利完成,按位元組寫資料的

2.3.4 對於讀資料,主機傳送模式,後接收模式,選取的是隨機讀的相應位址中的資料的方式

① 寫裝置位址,開啟start啟動訊號

i2c0.i2ccon0 = 0xe0 ,512分頻,使能ack訊號,使能中斷

i2c0.i2cds0 = 0xa0;//寫從機裝置位址

i2c0.i2cstat0 = 0xf0;主裝置傳送,產生start訊號

while (!((i2c0.i2ccon0)& (1 <<4)));如果傳送完畢第5位,中斷標誌位 值為1,表示寫裝置位址成功。否側,相當於具有延時的功能。

② 寫存放的資料的位址

i2c0.i2ccon0 = i2c0.i2ccon0 &( ~(0x1 <<4));表示清除pend狀態位,復位操 作寫;

i2c0.i2cds0 = addr & 0xff; 從機的位址,0 ~ 255 之間,乙個256個位元組,因 為該晶元的大小就是2k位,256個位元組

while (!((i2c0.i2ccon0)& (1 <<4)));如果傳送完畢第5位,中斷標誌位 值為1,表示寫資料位址成功。否側,相當於具有延時的功能。

③ 讀裝置位址,清pend暫存器,傳送乙個start訊號, 此時主機接收

i2c0.i2ccon0 = i2c0.i2ccon0 &( ~(0x1 <<4));表示清除pend狀態位,復位操作寫;

i2c0.i2cds0 = 0xa0 | 0x01; //寫裝置位址,讀操作

i2c0.i2cstat = 0xb0; //1011 0000

while(!(i2c0.i2ccon0&(1<<4))); /*the end of the waiting to be sent */

④讀取資料,讀資料時不產生ack訊號

i2c0.i2ccon0 &= ~((1 << 7)| (1 << 4)); 清中斷標誌位,關閉ack應答訊號

while (!(i2c0.i2ccon0 & (1 <<4))); 每次操作成功都會產生乙個中斷標誌位

data = i2c.i2cds0;

⑤ 傳送stop訊號

i2c0.i2cstat0 &= ~(1<<5); /*stop signal generation,free bus */

i2c0.i2ccon0 &= ~(1<<4); /*clean interrup pending bit */

⑥ 至此完成了一次 隨機的讀操作

序列匯流排之I2C

一 i2c簡介 1 i2c匯流排是 philip 公司開發的,雙向二線制同步序列匯流排,它只需要兩根線即可,單主機多從機。2 i2c兩根線分別為 序列時鐘線 scl和序列資料線 sda,scl由主機發出。3 每個連線到匯流排上的器件都有乙個位址,位址由器件內部硬體電路和外部位址引腳共同決定,避免了片...

I2C匯流排協議詳解系列2

i2c匯流排協議詳解系列1 i2c匯流排協議詳解系列2 i2c匯流排協議詳解系列3 匯流排訊號 sda 序列資料線 scl 序列時鐘 匯流排空閒狀態 sda 高電平 scl 高電平 起始位 scl為高電平期間 sda出現下降沿 終止位 scl為高電平期間 sda出現上公升沿 資料傳輸 sda的資料在...

i2c匯流排時序

一心想踏入linux device driver的世界,想著i2c匯流排相對於usb等其他匯流排較為簡單,就以i2c作為切入點,希望可以逐步理解ldd的設計思想,並能理解其裝置模型的概念。在此對近期於i2c匯流排及驅動原始碼的理解做備忘,以免徒勞。平台友善之臂s70 tiny6410 cpusams...