- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《C51串I2C总线
I2C总线是Philips公司最先推出的一种双向数据传输总线,其仅使用两根连线便可以实现全双工同步数据传送。在I2C总线中,一条为串行数据线(SDA),另一条为一条串行时钟线(SCL)。I2C总线占用引脚少,接口协议简单。目前多数公司均推出了I2C总线接口的各种器件,如存储器、A/D、D/A、键盘、LCD等,大大方便了用户的选择。本章主要介绍了I2C总线的工作原理、寻址方式以及数据操作,并重点介绍了数据传输协议以及相应的C51子函数。最后通过具体的实例,介绍如何使用在没有I2C总线接口的单片机上读写具有I2C总线接口的E2PROM存储器。1? I2C总线概述I2C总线采用两线制,由数据线SDA和时钟线SCL构成。I2C总线对数据通信进行了严格的定义。1.1? I2C总线工作原理典型的I2C总线系统结构,如图所示。I2C总线上可以挂接多个器件,其中每个器件必须都支持I2C总线通信协议。1.2? I2C总线器件的寻址方式由于所有器件都通过SCL和SDA连接在I2C总线上,因此,主器件在进行数据传输前需要通过寻址,选择需要通信的从器件。I2C总线上所有外围器件都需要有唯一的7位地址,由器件地址和引脚地址两部分组成。器件地址是I2C器件固有的地址编码,器件出厂时就已经给定,不可更改。引脚地址是由I2C总线外围器件的地址引脚(A2,A1,A0)决定,根据其在电路中接电源正极、接地或悬空的不同,形成不同的地址代码。1.3? I2C总线数据操作在I2C总线上,数据是伴随着时钟脉冲,一位一位地传送的,数据位由低到高传送,每位数据占一个时钟脉冲。I2C总线上的在时钟线SCL高电平期间,数据线SDA的状态就表示要传送的数据,高电平为数据1,低电平为数据0。在数据传送时,SDA上数据的改变在时钟线为低电平时完成,而SCL为高电平时,SDA必须保持稳定,否则SDA上的变化会被当作起始或终止信号而致使数据传输停止。1.写数据格式2.读数据格式2? I2C总线接口EEPROM存储器目前,市场上I2C总线接口器件有多种,例如A/D转换器、D/A转换器、时钟芯片和存储器等。这里以典型的I2C总线接口的存储器为例进行介绍。I2C总线接口EEPROM存储器是一种采用I2C总线接口的串行总线存储器,这类存储器具有体积小、引脚少、功耗低、工作电压范围宽等特点。目前,Atmel、MicroChip、National等公司均提供各种型号的I2C总线接口的串行EEPROM存储器。在单片机系统中使用较多的EEPROM存储器是24系列串行EEPROM。其具有型号多、容量大、支持I2C总线协议、占用单片机I/O端口少,芯片扩展方便、读写简单等优点。3? C51模拟 I2C总线协议在实际应用中,往往遇到所使用的单片机没有I2C总线接口,例如典型的 51系列单片机。为了让此类单片机用于操作I2C总线器件的能力,往往需要在程序模拟I2C总线数据传输协议。这里以典型的51系列单片机为例,假设其外接6MHz的晶振,采用P1.0作为时钟线SCL,P1.1作为数据线SDA。在C51语言的程序中,首先需要声明SCL和SDA所使用的引脚。其声明如下所示:sbit SCL=P1^0;sbit SDA=P1^1;3.1? 延时子函数这里给出一个典型的延时子函数。当单片机的工作频率比较高的时候,为了保证I2C总线的传输速率满足100kHz或者400kHz的限制,可以进行适当的延时处理。用户可以根据需要使用。延时子函数的程序示例如下:void Delays(unsigned int number)??? ??? ??? //延时子程序{unsigned char temp;for(;number!=0;number--)??? //循环{for(temp=0;temp100;temp++)??? ??? //空循环{}}}3.2? 起始信号子函数起始信号子函数用于开始I2C总线通信。其中,起始信号是在时钟线SCL为高电平期间,数据线SDA上高电平向低电平变化的下降沿信号。起始信号出现以后,才可以进行后续的I2C总线寻址或数据传输等。起始信号的时序,如图所示。在程序中,可以直接为SDA和SCL赋值来实现起始信号的时序。起始信号子函数示例如下:void StartI2C()??? ??? ??? ??? ??? ??? ??? //起始信号子程序{?SDA=1;?Delays(1);??? ??? ??? ??? ??? ??? ??? //延时,用于满足传输速率要求?SCL=1;?Delays(1);?SDA=0;?Delays(1);?SCL=0;?Delays(1);}3.3? 终止信号子
文档评论(0)