GPIO類比I2C

來源:互聯網
上載者:User

之前在學習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驅動,當然也最好是執行個體學習一下。




開始傳輸:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.