之前在學習I2C驅動,想了想應該先深刻理解下I2C協議。個人覺得理解I2C協議最好的方法就是實踐,而最好的實踐方式就是用GPIO來類比I2C協議進行實驗,直觀深刻。
先看下I2C時序圖:
根據時序圖,用兩個gpio分別類比sda和scl即可。在這之前自然需要先對gpio進行輸入輸出的配置。這裡只從寫資料角度來描述這一過程。讀資料同理即知。
先配置gpio,包括sda、scl、供電gpio等額外功能gpio。
gpio_config(GPIO_SDA, GPIO_OUTPUT);gpio_config(GPIO_SCL, GPIO_OUTPUT);gpio_config(GPIO_VDD, GPIO_OUTPUT);udelay(3);
gpio_set(GPIO_OLED_VDD, 1);
//開始傳輸
gpio_set(GPIO_SDA,1);gpio_set(GPIO_SCL,1);udelay(1);gpio_set(GPIO_SDA,0);udelay(1);
逐個字元(8位)傳輸資料:
for (i=0; i<8; i++) {gpio_set(GPIO_SCL, 0);if (c & (1<<(7-i))) gpio_set(GPIO_SDA, 1); else gpio_set(GPIO_SDA, 0); udelay(1);gpio_set(GPIO_SCL, 1);udelay(1); }
結束傳輸:
gpio_set(GPIO_SCL, 0);gpio_set(GPIO_SDA, 1);udelay(1);gpio_set(GPIO_SCL, 1);
I2C傳輸會收到ACK,可根據ACK值判斷髮送資料的成功與失敗,實際中,沒寫入一個字元資料都要通過ack來判斷成功與否。讀取ack值,同樣用gpio來類比:
接受資料首先配置sda為輸入,scl先高後低,在讀取sda值即可。
gpio_config(GPIO_SDA, GPIO_INPUT);gpio_set(GPIO_SCL, 1);udelay(2);gpio_set(GPIO_SCL, 0);
大概流程就是這麼簡單,理解了i2c協議,再去理解i2c驅動,當然也最好是執行個體學習一下。
開始傳輸: