I2C与EEPROM

一、基本概念

      RAM(Random Access Memory)的全名为随机存取记忆体,它相当于PC机上的移动存储,用来存储和保存数据的。它在任何时候都可以读写,RAM

通常是作为操作系统或其他正在运行程序的临时存储介质,它的一切都是最好的,唯一缺点断电一切东西都没有了。一般情况下,现在移动设备也多了,我

们叫它内存,更通常的叫运行内存。还有一个熟悉的词DDR2或DDR3,后面还会学习到的。

        ROM(Read Only Memory)的全名为唯读记忆体,它相当于PC机上的硬盘,用来存储和保存数据。ROM数据不能随意更新,但是在任何时候都可以读

取。即使是断电,ROM也能够保留数据。但是资料一但写入后只能用特殊方法或根本无法更改,但这么久了ROM已经有了很大的发展,不再是最初的摸样

了。rom最初不能编程,出厂什么内容就永远什么内容,不灵活。后来出现了prom,可以自己写入一次,要是写错了,只能换一片,自认倒霉。人类文明不

断进步,终于出现了可多次擦除写入的EPROM,每次擦除要把芯片拿到紫外线上照一下,想一下你往单片机上下了一个程序之后发现有个地方需要加一句

话,为此你要把单片机放紫外灯下照半小时,然后才能再下一次,这么折腾一天也改不了几次。历史的车轮不断前进,伟大的EEPROM出现了,拯救了一

大批程序员,终于可以随意的修改rom中的内容了,这一段话就说出了ROM的发展历程。

      狭义的EEPROM:这种rom的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后数据不丢

失,可以保存100年,可以擦写100w次。具有较高的可靠性,但是电路复杂/成本也高。它的改写是由高电压或者由控制端的逻辑电平来完成的。因此目前的

EEPROM都是几十千字节到几百千字节的,绝少有超过512K的。我们也就发现了EEPROM的确可以实现随意读写,EEPROM的全称是“电可擦除可编程只读

存储器”,即Electrically Erasable Programmable Read-Only Memory。可介绍的这两种都不存在大容量并且也十分昂贵,那我们平时见到的几十G的存储设备是

什么?flash就应运而生了。flash属于广义的EEPROM,因为它也是电擦除的rom。但是为了区别于一般的按字节为单位的擦写的EEPROM,我们都叫它

flash。flash做的改进就是擦除时不再以字节为单位,而是以为单位,一次简化了电路,数据密度更高,降低了成本。上M的rom一般都是flash。

     ROM的应用

  flash分为nor flashnand flash。nor flash数据线和地址线分开,可以实现ram一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块来擦。

nand flash同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。读取只能按页来读取。NOR Flash的读取,用户可以直接运行装载在NOR

FLASH里面的代码。NAND Flash没有采取内存RAM的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种

技术的Flash比较廉价。用户不能直接运行NAND Flash上的代码,因此好多使用NAND Flash的开发板除了使用NAND Flah以外,还作上了一块小的NOR

Flash来运行启动代码。nandflash引脚上复用,因此读取速度比nor flash慢一点,但是擦除和写入速度比nor flash快很多。nand flash内部电路更简单,因此数

据密度大,体积小,成本也低。因此大容量的flash都是nand型的。小容量的2~12M的flash多是nor型的。nor flash可以进行字节寻址,所以程序可以在nor

flash中运行。嵌入式系统多用一个小容量的nor flash存储引导代码,用一个大容量的nand flash存放文件系统和内核。

二、I2C总线

     这个在我转载的一篇文章里面有很详细的描述,就不在提及了。有一个问题是无论UART还是I2C都是串行按位传输数据,区别在哪?还有SPI传输,下面

分别总结一下三者的特点。

         UART:两线,一根发送一根接收,可以全双工通信,数据异步传输,对双方的时序要求比较严格,在多机通信上面用的最多。按照标准波特率完成双

向通讯,速度慢,之前提到采集一位数据就需要16个时钟周期,适合远距离传输,比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且

任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。UART需要固定的波特率,就是说两位数据的间隔要相等,

 

         I2C:能用于替代标准的并行总线,能连接的各种集成电路和功能模块。I2C是多主控总线,所以任何一个设备都能像主控器一样工作,并控制总线。

总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们可以作为发射器或接收器工作。多路微控制器能在同一个I2C总线上共存,当

然在任何时间点上只能有一个主控。一般用于同一板卡上芯片之间的通信,较少用于远距离通信。

 

         SPI:SPI接口和UART相比,多了一条同步时钟线,对通信双方的时序要求不严格不同设备之间可以很容易结合,而且通信速度非常快。一般用在产品

内部元件之间的高速数据通信上面,如大容量存储器flash等。高速同步串行口,3~4线接口,收发独立、可同步进行。

  I2C总线是由PHILIPS公司开发的两线式串行总线,多用于连接微处理器及其外围设备。I2C总线的主要特点是接口方式简单,两条线可以挂多个参与通

信的器件,即多机模式,而且任何一个器件都可以作为主机,当然同一时刻只能一个主机。

从原理上来讲,UART属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过TXD发送出来即可,接收数据是单片机自己的事情。而I2C属于同步

通信,SCL时钟线负责收发双方的时钟节拍,SDA数据线负责传输数据。I2C的发送方和接收方都以SCL这个时钟节拍为基准进行数据的发送和接收。

从应用上来讲,UART通信多用于板间通信,比如单片机和电脑,这个设备和另外一个设备之间的通信。而I2C多用于板内通信,比如单片机和我们本章要

学的EEPROM之间的通信。

    在硬件上,I2C总线是由时钟总线SCL和数据总线SDA两条线构成,连接到总线上的所有的器件的SCL都连到一起,所有的SDA都连到一起。I2C总

线是开漏引脚并联的结构,因此我们外部要添加上拉电阻。对于开漏电路外部加上拉电阻的话,那就组成了线“与”的关系。总线上线“与”的关系,那所有接

入的器件保持高电平,这条线才是高电平。而任意一个器件输出一个低电平,那这条线就会保持低电平,因此可以做到任何一个器件都可以拉低电平,也就

是任何一个器件都可以作为主机,如图14-1所示,我们添加了R63和R64两个上拉电阻。
           

                图14-1 I2C总线的上拉电阻



虽然说任何一个设备都可以作为主机,但绝大多数情况下我们都是用微处理器,也就是我们的单片机来做主机,而总线上挂的多个器件,每一个都像电话机

一样有自己唯一的地址,在信息传输的过程中,通过这唯一的地址可以正常识别到属于自己的信息,在我们的KST-51开发板上,就挂接了2个I2C设备,一

个是24C02,一个是PCF8591。

我们在学习UART串行通信的时候,知道了我们的通信流程分为起始位、数据位、停止位这三部分,同理在I2C中也有起始信号、数据传输和停止信号,如

图14-2所示。
          

                          图14-2 I2C时序流程图


    从图上可以看出来,I2C和UART时序流程有相似性,也有一定的区别。UART每个字节中,都有一个起始位,8个数据位和1位停止位。而I2C分为

起始信号,数据传输部分,最后是停止信号。其中数据传输部分,可以一次通信过程传输很多个字节,字节数是不受限制的,而每个字节的数据最后也跟了

一位,这一位叫做应答位,通常用ACK表示,有点类似于UART的停止位。

  

  下面我们一部分一部分的把I2C通信时序进行剖析。之前我们学过了UART,所以学习I2C的过程我尽量拿UART来作为对比,这样有助于更好的理解。

但是有一点大家要理解清楚,就是UART通信虽然我们用了TXD和RXD两根线,但是实际一次通信,1条线就可以完成,2条线是把发送和接收分开而已,而

I2C每次通信,不管是发送还是接收,必须2条线都参与工作才能完成,为了更方便的看出来每一位的传输流程,我们把图14-2改进成图14-3。

 

 

                    图14-3 I2C通信流程解析


  起始信号:UART通信是从一直持续的高电平出现一个低电平标志起始位;而I2C通信的起始信号的定义是SCL为高电平期间,SDA由高电平向低电平变

化产生一个下降沿,表示起始信号,如图14-3中的start部分所示。


  数据传输:首先,UART是低位在前,高位在后;而I2C通信是高位在前,低位在后。第二,UART通信数据位是固定长度,波特率分之一,一位一位固

定时间发送完毕就可以了。而I2C没有固定波特率,但是有时序的要求,要求当SCL在低电平的时候,SDA允许变化,也就是说,发送方必须先保持SCL是

低电平,才可以改变数据线SDA,输出要发送的当前数据的一位;而当SCL在高电平的时候,SDA绝对不可以变化,因为这个时候,接收方要来读取当前

SDA的电平信号是0还是1,因此要保证SDA的稳定不变化,如图14-3中的每一位数据的变化,都是在SCL的低电平位置。8为数据位后边跟着的是一位响应

位,响应位我们后边还要具体介绍。

停止信号:UART通信的停止位是一位固定的高电平信号;而I2C通信停止信号的定义是SCL为高电平期间,SDA由低电平向高电平变化产生一个上升沿,表

示结束信号,如图14-3中的stop部分所示。

14.2 I2C寻址模式

    上一节介绍的是I2C每一位信号的时序流程,而I2C通信在字节级的传输中,也有固定的时序要求。I2C通信的起始信号(Start)后,首先要发送一个从

机的地址,这个地址一共有7位,紧跟着的第8位是数据方向位(R/W),‘0’表示接下来要发送数据(写),‘1’表示接下来是请求数据(读)。

我们知道,打电话的时候,当拨通电话,接听方捡起电话肯定要回一个“喂”,这就是告诉拨电话的人,这边有人了。同理,这个第九位ACK实际上起到的就

是这样一个作用。当我们发送完了这7位地址和1位方向位,如果我们发送的这个地址确实存在,那么这个地址的器件应该回应一个ACK‘0’,如果不存在,

就没“人”回应ACK。

原文地址:https://www.cnblogs.com/yuanqiangfei/p/10324120.html