首页 > 代码库 > GPIO模拟I2C
GPIO模拟I2C
之前在学习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个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。