学习:GPIO口模拟I2C

什么是 GPIO口模拟I2C?

     就是用一个GPIO pin(CLK pin)的高低电位切换来模拟出始终的high/low,用另外一根GPIO pin(DATA pin)的高低电位,传递数据。

      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时钟速率,调整各个延时时长,提高驱动电流等。

        另外gpio口模拟IIC是占系统CPU资源的,而硬件IIC不占cpu资源!所以在有OS的应用中,如果用gpio模拟IIC的话,一定要进入临界区!

 

怎么实现?

 

ARM编程:ARM普通GPIO口线模拟I2C 

请教个问题:
因为需要很多EEPROM进行点对点控制,所以我现在要用ARM的GPIO模拟I2C,管脚方向我设
置的是向外的。我用网上的RW24C08的万能程序修改了一下,先进行两根线的模拟,SDA6,
SCL6,但是读出来的数不对。我做了一个简单的实验,模拟SDA6,SCL6输出方波,在示波
器上看到正确方波,也就是说,我的输出控制是没问题的。
哪位大哥能指点一下,是否在接收时管脚方向要设为向内?(不过IOPIN不管什么方向都可
以读出当前状态值的阿)

附修改的RW24C08()程序:
#define  SomeNOP() delay(300);
/**********************************  RW24C08  
****************************************
*/

/*-----------------------------------------------------------------------------
---
 调用方式:void I2CInit(void) 
 函数说明:私有函数,I2C专用
-------------------------------------------------------------------------------
--
*/

void  I2CInit( void )
{
 IO0CLR 
= SCL6;     //初始状态关闭总线
 SomeNOP(); //延时 
 I2CStop(); //确保初始化,此时数据线是高电平
}


 
/*----------------------------------------------------------------------------
----
 调用方式:void I2CStart(void) 
 函数说明:私有函数,I2C专用
-------------------------------------------------------------------------------
--
*/

void  I2CStart( void )
{
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值