码迷,mamicode.com
首页 > 其他好文 > 详细

GPIO模拟I2C

时间:2014-05-07 05:31:46      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:c

之前在学习I2C驱动,想了想应该先深刻理解下I2C协议。个人觉得理解I2C协议最好的方法就是实践,而最好的实践方式就是用GPIO来模拟I2C协议进行试验,直观深刻。
先看下I2C时序图:
bubuko.com,布布扣

根据时序图,用两个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驱动,当然也最好是实例学习一下。



开始传输:

GPIO模拟I2C,布布扣,bubuko.com

GPIO模拟I2C

标签:c

原文地址:http://blog.csdn.net/njufeng/article/details/25004215

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!