硬件II2C和软件I2C有什么区别
所谓硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的;软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
模拟I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。
如果要从具体硬件上来看,可以去看下芯片手册。
因为固件I2C的端口是固定的,所以会有所区别。
至于如何区分它们可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
根据代码量判断,模拟的代码量肯定比固件的要大。
1. 硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
2. 硬件IIC速度比模拟快,并且可以用DMA3. 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。
软件i2c是程序员使用程序控制SCL,SDA线输出高低电平,模拟i2c协议的时序。
一般较硬件i2c稳定,但是程序较为繁琐,但不难。
硬件i2c程序员只要调用i2c的控制函数即可,不用直接的去控制SCL,SDA高低电平的输出。
但是有些单片机的硬件i2c不太稳定,调试问题较多。
gpio软件模拟IIC与硬件IIC驱动有什么区别
最近做一个项目,涉及到芯片级的通信方面的知识(IIC和SPI方面的通信)。
但是方案选择的时候,发现自身对模拟IO口通信还是固件驱动通信一直没有一个很全面的认识,所以就在此记录一下。
所谓硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的;软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
模拟I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。
如果要从具体硬件上来看,可以去看下芯片手册。
因为固件I2C的端口是固定的,所以会有所区别。
至于如何区分它们可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
根据代码量判断,模拟的代码量肯定比固件的要大。
求MCS
归一化模拟I2C总线软件包(C51)/****************************************************************************** I2C.H 标准80C51模拟I2C总线程序头文件******************************************************************************/#ifndef I2C_H#define I2C_H//定义I2C操作模式#define I2C_RECV 0 /* 接收模式 */#define I2C_SEND 1 /* 发送模式 */#define I2C_SrRECV 2 /* 带Sr接收 *///I2C总线初始化void I2C_Init();/******************************************************************************函数:void I2C_On()功能:启动I2C总线收发数据返回:0-正常,1-异常(无应答)说明:参数Mode是操作模式,决定I2C总线收发格式。
常见的收发格式有3种,具体如下: 0-接收模式,格式:S | SLA+R | Data... | P 1-发送模式,格式:S | SLA+W | Addr | Data... | P 2-带Sr接收,格式:S | SLA+W | Addr | Sr | SLA+R | Data... | P******************************************************************************/bit I2C_On( unsigned char Mode, //操作模式 unsigned char SLA, //从机地址 unsigned char Addr, //子地址 unsigned char *Buf, //数据缓冲区 unsigned char Size //数据长度);#endif //I2C_H/****************************************************************************** I2C.C 标准80C51模拟I2C总线程序(主模式,通用)******************************************************************************/#i nclude #i nclude "I2C.H"//模拟I2C总线的管脚定义sbit I2C_SCL = P1^6; //定义I2C总线时钟信号sbit I2C_SDA = P1^7; //定义I2C总线数据信号/******************************************************************************函数:I2C_Delay()功能:模拟I2C总线延时说明:请根据具体情况调整延时值******************************************************************************/void I2C_Delay(){ unsigned char t; t = 10; while ( --t != 0 ); //延时2*t个机器周期}/******************************************************************************函数:I2C_Init()功能:I2C总线初始化,使总线处于空闲状态说明:在main()函数的开始处,应当执行一次本函数******************************************************************************/void I2C_Init(){ I2C_SCL = 1; I2C_Delay(); I2C_SDA = 1; I2C_Delay();}/******************************************************************************函数:I2C_Start()功能:产生I2C总线的起始条件说明:SCL处于高电平期间,当SDA出现下降沿时启动I2C总线 本函数也用来产生重复起始条件******************************************************************************/void I2C_Start(){ I2C_SDA = 1; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SDA = 0; I2C_Delay(); I2C_SCL = 0; I2C_Delay();}/******************************************************************************函数:I2C_Write()功能:向I2C总线写1个字节的数据参数:dat是要写到总线上的数据******************************************************************************/void I2C_Write(unsigned char dat){ unsigned char t = 8; do { I2C_SDA = (bit)(dat & 0x80); dat <<= 1; I2C_SCL = 1; I2C_Delay(); I2C_SCL = 0; I2C_Delay(); } while ( --t != 0 );}/******************************************************************************函数:I2C_Read()功能:从从机读取1个字节的数据返回:读取的1个字节数据******************************************************************************/unsigned char I2C_Read(){ unsigned char dat; unsigned char t = 8; I2C_SDA = 1; //在读取数据之前,要把SDA拉高,使之处于输入状态 do { I2C_SCL = 1; I2C_Delay(); dat <<= 1; if ( I2C_SDA ) dat++; I2C_SCL = 0; I2C_Delay(); } while ( --t != 0 ); return dat;}/******************************************************************************函数:I2C_GetAck()功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据返回:0-从机应答 1-从机非应答说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输******************************************************************************/bit I2C_GetAck(){ bit Ack; I2C_SDA = 1; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); Ack = I2C_SDA; I2C_SCL = 0; I2C_Delay(); return Ack;}/******************************************************************************函数:I2C_PutAck()功能:主机产生应答位(应答或非应答),用于通知从机:主机是否成功接收从机数据参数:Ack = 0:主机应答 Ack = 1:主机非应答说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节时,应当产生非应答******************************************************************************/void I2C_PutAck(bit Ack){ I2C_SDA = Ack; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SCL = 0; I2C_Delay();}/******************************************************************************函数:I2C_Stop()功能:产生I2C总线的停止条件说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线******************************************************************************/void I2C_Stop(){ I2C...
两个51单片机如何通过i2c通讯?
展开全部 一般情况下,要进行I2C通讯,你最起码其中有一个芯片要本身就带有I2C通讯接口,用这个带有I2C接口的芯片来作从器件,这样就相对好处理一点。
你要是两个都不带这个接口,来模拟的话,很有难度。
除非你对I2C协议很清楚,不过从楼主的提问来看,估计就不怎么熟悉这种协议。
所以建议还是用别的通讯方式吧,比如用SPI,相对会好处理一点,用其中一个芯片的INTx来模拟CS接口,作为从器件在中断中来处理,另外一个就模拟主器件来控制从器件,这样或许会好弄点。
如果楼主确实需要通讯,还是赶快换个思路吧,要是卡在一个地方动不了,会耽误你的进程的,祝你好运!...
如何实现双单片机模拟iic通信?
对于疑问1:for循环已经把数据从主器件发送到从器件,没错,后面加那几句是为了释放数据总线,这是芯片协议已经规定了的,为什么是scl=0;而sda=1呢,应该总线SCL与SDA都是线与关系,任意一个器件输出低电平,都使该总线的信号变低,你可能会这么想:为什么不是scl=1;delay();sda=1;delay();呢?那是因为当scl=1;sda=1;这是终止信号。
对吧,这样写的话IIC将会停止工作。
对于疑问2:加这几句也一样,是芯片现已规定:无论是写数据还是读数据,写完读完之后需释放总线,for循环语句的意思是:for(i=0;i<8;i++){scl=1; //拉高时钟总线,开始读数据delay();k=(k<<1)|sda; // 将读取到的sda数据存放到k中,这里你可能有点无法理解,我举个例子:刚开始k=0x00(系统默认),当读取到的sda数据为1时,k=0x01;对吧,反之当读取到的sda数据为0时,k=0x00;scl=0;// 读取完一个数据,拉低时钟总线delay();}就这样循环8次,这样一个字节的数据就从主器件读到了从器件了。
对吧。
如果那个释放总线你理解不了,你就记住,这是芯片协议规定,读完或写完都必须释放总线。
iic协议都是如此。
希望能帮助到你。
用软件可以模拟IIC,那为什么单片机还要自带IIC接口
早期的PIC单片机,没有I2C的硬件模块支持,要完成I2C的通信,必须通过两根普通I/O线,完全用软件来模拟。
既然是软件模拟,自然是可以模拟成主机运行,也可以模拟成从机。
由于大量外围I2C器件都是制造成从机的,所以,软件模拟主机的情况居多。
现今的PIC新型单片机,从物理硬件、中断、串行数据字节等,都有专门的I2C模块。
这些模块如果是工作在从机状态下,就叫做从模式,工作在主机状态下,就是主模式。
在一个I2C总线上,遵守一主多从的规定。
ds1302如何软件模拟I2C接口
开利300冷吨30HXC300螺杆式水冷机组1) 电机型式:闭式电机,冷媒冷却,输入功率为220kw。
优点:不存在电机轴封泄漏问题及电机和压缩机轴对中。
缺点:电机烧毁以后,需要更换制冷剂,维修费用较高。
2) 压缩机型式:半封闭螺杆压缩机,双回路设计,容量控制范围为14%~100%。
3) 压缩机能效比:0.73 kw / TR4)制冷剂:HCFC-134a,充注量约为195公斤。
5)机组外形尺寸:3995 (长) x 980 (宽) x 2116 (高)。
6)选择参数:冷冻水进/出温度12/7度,冷却水进/出温度30/35度。
综上所述,我们建议:在选择上述三种螺杆式冷水机组时应优先选用约克和特灵的产品。
对于400冷吨以上的机组,我们认为选用离心式水冷机组较为经济合理。
虽然单台离心式水冷机组的一次投资高于相同容量的螺杆式冷水机组,但是离心式冷水机组的运行效率高于螺杆式机组10%以上,大大地降低了选用机组的数量及运行费用。
下面将三个厂家的离心式冷水机组进行简单的对比,供你们参考
STM8模拟I2C和硬件I2C怎么通信
最近做一个项目,涉及到芯片级的通信方面的知识(IIC和SPI方面的通信)。
但是方案选择的时候,发现自身对模拟IO口通信还是固件驱动通信一直没有一个很全面的认识,所以就在此记录一下。
所谓硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的;软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
模拟I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。
如果要从具体硬件上来看,可以去看下芯片手册。
因为固件I2C的端口是固定的,所以会有所区别。
至于如何区分它们可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
根据代码量判断,模拟的代码量肯定比固件的要大。
血流成呵