打印

请问GPIO模拟I2C是什么意思

[复制链接]
5108|16
手机看帖
扫描二维码
随时随地手机跟帖
沙发
yoyowodeai|  楼主 | 2010-4-14 22:09 | 只看该作者
找本单片机的书看看看就明白了。I2C是一种简单的通信协议。

使用特权

评论回复
板凳
LPC300| | 2010-4-14 22:10 | 只看该作者
就是用两根GPIO来做I2C,通过自己写程序,拉出I2C的时序。这样就可以把GPIO做I2C使用了。主要的难点是写程序!

使用特权

评论回复
地板
linux1| | 2010-4-14 22:11 | 只看该作者
用一个GPIO pin(CLK pin)的高低电位切换来模拟出始终的high/low,用另外一根GPIO pin(DATA pin)的高低电位,传递数据。

使用特权

评论回复
5
yoyowodeai|  楼主 | 2010-4-14 22:11 | 只看该作者
看了I2C协议的书,有些了解,但不知道GPIO模拟I2C是个什么概念?
知道的TX帮帮忙~~~

使用特权

评论回复
6
思行合一| | 2010-4-14 22:13 | 只看该作者
IIC本来是一个硬件模块之间的通信协议,一般芯片都有专门的电路逻辑块来处理协议,并通过两根线路(时钟SCk、数据SDA)来跟其余同样有IIC模块的器件通信。
      由于其通信速率(400K)和通信方式(串行)跟其他串并口通信方式不同,所以一般都用于主机跟从机传递控制参数、参考数据、或者少量的其他数据。
      IIC协议主要在乎的时序的准确性,所以在没有专门的IIC模块的单片机中,你也可以用两个IO口来模拟输出IIC协议的波形,这个波形不管是IIC硬件模块生成的,还是软件模拟出来的,只要符合IIC协议标准的时序和电平,都是一样的,接受端也不会挑剔。就像你要喝水,主要是喝 H2O,它究竟是从山涧里面流出来的泉水,还是工厂里面处理的蒸馏水,你可能并不在意,只要符合饮用标准就行。
      还有一些系统中,CPU原有的IIC总线可能用于控制几个比较重要的几个芯片,为了避免争用、或者为了硬件上相互影响,对于不太重要的芯片,有时候会再用几个GPIO脚来做模拟IIC跟它通信。软件实现非常简单,就是根据IIC协议,先拉高SCK、SDA线,然后延时Nms后,将SDA拉低,然后再延时Nms,一个IIC Start工作就完成了。传输数据过程也差不多,但是根据不同的芯片,可能时序定义会有差异,所以要常常调整IIC时钟速率,调整各个延时时长,提高驱动电流等

使用特权

评论回复
7
北京户口| | 2010-4-14 22:15 | 只看该作者
在控制器没有专用的I2C模块、并且又需要使用I2C协议与外设进行通信时,可以使用GPIO来模拟I2C。
具体一点就是如前面的几位高手所言:I2C有两条线:SDA(数据线)、SCL(时钟线)。
如果有专用的I2C模块,我们所要做的无非是使能模块、配置好波特率等,然后在需要传输的时候将待发送数据丢给I2C数据寄存器而已,模块会自动的将待发送数据进行移位发送;

但如果没有专用的I2C模块,需要用两根GPIO来模拟SDA、SCL线,并且要编写完整的通信协议模拟程序,比如:发送、接受的起始信号等,尤其是移位发送操作,需要把待发送数据的各个位通过“SDA”发送出去,其间的时钟信号等完全要程序员靠编写程序来控制。

此种方法虽然可以实现I2C的正常传输,但在传输期间CPU将不能再做其它事情,完全被模拟的I2C程序部分占用。

上述内容仅供参考,不足之处恳请大家批评、指正

使用特权

评论回复
8
无语凝咽| | 2010-4-14 22:16 | 只看该作者
此种方法虽然可以实现I2C的正常传输,但在传输期间CPU将不能再做其它事情,完全被模拟的I2C程序部分占用。

不完全同意楼上的说法,GPIO口模拟I2C不外乎用定时器来实现。只要设定好中断节拍。在中断未来之前,理论上CPU仍然可以想干吗干吗去。

使用特权

评论回复
9
米其林r| | 2010-4-14 22:16 | 只看该作者
那么硬件IIC和软件模拟的IIC各有哪些有缺点呢?

使用特权

评论回复
10
LPC300| | 2010-4-14 22:17 | 只看该作者
用GPIO模拟I2C还要考虑到你所传输的速度问题,I2C是高速I/O口,一般的GPIO模拟是不能达到她的速度要求的,当然一般的情况是可以模拟的

使用特权

评论回复
11
六楼的窗户| | 2010-4-14 22:17 | 只看该作者
CPU原有的IIC总线可能用于控制几个比较重要的几个芯片,为了避免争用、或者为了硬件上相互影响,对于不太重要的芯片,有时候会再用几个GPIO脚来做模拟IIC跟它通信。软件实现非常简单,就是根据IIC协议,先拉高SCK、SDA线,然后延时Nms后,将SDA拉低,然后再延时Nms,一个IIC Start工作就完成了。传输数据过程也差不多,但是根据不同的芯片,可能时序定义会有差异,所以要常常调整IIC时钟速率,调整各个延时时长,提高驱动电流等

使用特权

评论回复
12
god_like| | 2010-4-14 22:53 | 只看该作者
好多高手哦,学习了

使用特权

评论回复
13
hxlwjn| | 2010-4-15 11:59 | 只看该作者
“GPIO口模拟I2C不外乎用定时器来实现”,应该没有用定时器来实现的,不然几个微秒就中断一次,慢一点的cpu都不用做其他事了,光顾着保存中断上下文了。

使用特权

评论回复
14
yytdragon| | 2010-4-15 15:23 | 只看该作者
不懂LZ得意思,LZ是不是不知道什么是时序?如果知道什么是时序,去看下IIC的时序,就知道用I/O模拟式怎么回事了

使用特权

评论回复
15
灵动系统| | 2010-4-15 15:48 | 只看该作者
先仔细的看看I2C的时序吧!

使用特权

评论回复
16
ayb_ice| | 2010-4-15 16:02 | 只看该作者
模拟方便移植,是个好东西

使用特权

评论回复
17
wxfxwk1986| | 2012-5-17 11:36 | 只看该作者
6楼和7楼讲的非常详细了,看到这个帖子我也突然明白了ARM9中的并口扩展网口是什么意思了,不过网口那个的时序软件实现应该很困难吧。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

1265

帖子

2

粉丝