i2c基础知识

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

IIC基础知识讲师:杨坚目录IIC位传输与应答IIC协议简介IIC读写IO口模拟IIC简介接口线少,控制方式简单,器件封装形式小,通信速率较高等背景优点随着大规模集成电路技术的发展,把CPU和一个单独工作系统所必需的ROM、RAM、I/O端口、A/D、D/A等外围电路集成在一个单片内而制成的单片机或微控制器愈来愈方便。IIC:一种串行同步总线。简介IIC即Inter-IntegratedCircuit,这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS),IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线接口。简介IIC工作原理:I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。IIC位传输与应答SCL为高电平时,若SDA由高电平向低电平跳变,则用来表示一个会话的开始;SCL为高电平时,若SDA由低电平向高电平跳变,则用来表示一个会话的结束;数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA线上是在传输数据bit数据改变:SCL为低电平时,SDA线才能改变传输的bit电平IIC位传输示意图:IIC位传输与应答接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。IIC应答:主机每发送完8bit数据后等待从机的应答(ACK)在第9个clock,若从机发出ACK,SDA会被拉低。若没有ACK,SDA会被置高,这会引起主机发生RESTART或STOP流程;这段信号是干嘛?有什么作用?IIC总线寻址IIC总线寻址:7位和10位(了解即可,很少使用)第一个字节的最低位是“0”,表示主机会写信息到被选中的从机;“1”表示主机会向从机读信息,当发送了一个地址后,系统中的每个器件都在起始条件后将头7位与它自己的地址比较,如果一样,器件会判定它被主机寻址,至于是从机接收器还是从机发送器,都由R/W位决定的。第一个字节的头7位组成了从机地址最低位(LSB)是第8位,它决定了传输的方向每次发送8位(一个字节)数据起始应答终止从机地址:由固定部分和可编程部分组成。从机的7位寻址位前四位是固定位,后三位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。写流程Master发起STARTMaster发送I2Caddr(7bit)和w操作0(1bit),等待ACKSlave发送ACKMaster发送regaddr(8bit),等待ACKSlave发送ACKMaster发送data(8bit),即要写入寄存器中的数据,等待ACKSlave发送ACK第6步和第7步可以重复多次,即顺序写多个寄存器Master发起STOPIIC写流程:读流程Master发送I2Caddr(7bit)和w操作1(1bit),等待ACKSlave发送ACKMaster发送regaddr(8bit),等待ACKSlave发送ACKMaster发起STARTMaster发送I2Caddr(7bit)和r操作1(1bit),等待ACKSlave发送ACKSlave发送data(8bit),即寄存器里的值Master发送ACK第8步和第9步可以重复多次,即顺序读多个寄存器IIC读流程:IO口模拟IICvoidI2C_Start(void){SetClock(1);SetData(1);I2C_Delay(DELAY_TIME);SetData(0);I2C_Delay(DELAY_TIME);SetClock(0);I2C_Delay(DELAY_TIME);}voidI2C_Stop(void){SetData(0);SetClock(1);I2C_Delay(DELAY_TIME);SetData(1);}IO口模拟IIC开始和结束:SCL为低电平时,改变SDA,这样做可以确保不会引起start或者stop!这里最好是对换一下如:右边i2c_stop。IO口模拟IICvoidWriteI2CByte(unsignedcharucData){inti;for(i=0;i8;i++){if(ucData&0x80)SetData(1);elseSetData(0);SetClock(1);I2C_Delay(DELAY_TIME);SetClock(0);I2C_Delay(DELAY_TIME);ucData=1;}}unsignedcharReadI2CByte(void){unsignedcharucRead=0,i;BOOLbTemp;for(i=0;i8;i++){SetClock(1);I2C_Delay(HALF_DELAY_TIME);bTemp=GetData();I2C_Delay(HALF_DELAY_TIME);SetClock(0);I2C_Delay(DELAY_TIME);if(bTemp==1){ucRead=ucRead1;ucRead=ucRead|0x01;}elseucRead=ucRead1;}returnucRead;}IO口模拟IIC读byte和写byte:这里可以添加上GetData(),设置SDA为输入模式,如果有设置模式的函数,可以使用该函数替代。IO口模拟IICintI2CWrite(U8address,U8*buffer,intlength){U8ack_temp=1,i=0;I2C_Start();WriteI2CByte(address);ack_temp=CheckWriteAck(address);if(ack_temp==FALSE){I2C_Stop();return-1;}for(i=0;ilength;i++){WriteI2CByte(buffer[i]);ack_temp=CheckWriteAck(address);if(ack_temp==FALSE){I2C_Stop();return-1;}I2C_Delay(HALF_DELAY_TIME);}I2C_Stop();return0;}intI2CRead(U8address,U8*buffer,U8length){U8ack_temp=1,i=0;if(buffer==NULL)return-1;I2C_Start();WriteI2CByte(address);ack_temp=CheckWriteAck(address);if(ack_temp==0){I2C_Stop();return-1;}for(i=0;ilength;i++){buffer[i]=ReadI2CByte();SendAck(0);//ACK}I2C_Stop();return0;}IO口模拟IIC读和写:有些单片机在实际操作过程中,读操作的最后一个byte发送非应答(NAK),这里最好是判断到了最后一个byte发送NAK。IO口模拟IICBOOLCheckWriteAck(U8address){BOOLin;SetClock(1);I2C_Delay(HALF_DELAY_TIME);in=GetData();I2C_Delay(HALF_DELAY_TIME);SetClock(0);I2C_Delay(DELAY_TIME);if(in==1)returnFALSE;returnTRUE;}voidI2C_Delay(unsignedinttime){unsignedintloop;for(loop=0;looptime;loop++);}IO口模拟IIC接受应答和发送应答以及delay:voidSendAck(BOOLlevel){SetData(level);SetClock(1);I2C_Delay(DELAY_TIME);SetClock(0);I2C_Delay(DELAY_TIME);}这里可以添加上GetData();设置SDA为输入模式,如果有设置模式的函数,可以使用该函数替代。这里可以添加上SetData();设置SDA为输出模式,如果有设置模式的函数,可以使用该函数替代。这里的时序都是微秒级,一般系统的delay函数都是毫秒级,所以为了精度,直接使用for循环。IO口模拟IIC有些特殊情况需要发送非应答iic通信的单片机工作频率都不一致,这个时候根据时序,做相应代码修改除了开始和结束操作,一定要在SCL为低电平操作SDAdelay时间控制不准确单片机的iic一般工作频率比较低SDA有工作模式:输入和输出,一定要注意。读操作的时候,有些单片机需要一段时间的延时调试过程中遇到的问题以及总结:END

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功