常用串行EEPROM的编程应用(一)

EEPROM是“Electrically Erasable Programmable Read-only”(电可擦写可编程只读存储器)的缩写,EEPROM在正常情况下和EPROM一样,可以在掉电的情况下保存数据,所不同的是它可以在特定引脚上施加特定电压或使用特定的总线擦写命令就可以在在线的情况下方便完成数据的擦除和写入,这使EEPROM被用于广阔的的消费者范围,如:汽车、电信、 医疗、工业和个人计算机相关的市场,主要用于存储个人数据和配置/调整数据。EEPROM又分并行EEPROM和串行EEPROM,并行EEPROM器件虽然有很快的读写的速度,但要使用很多的电路引脚。串行EEPROM器件功能上和并行EEPROM基本相同,提供更少的引脚数、更小的封装、更低的电压和更低的功耗,是现在使用的非易失性存储器中灵活性最高的类型。串行EEPROM按总线分,常用的有I2C,SPI,Microwire总线。本文将介绍这三种总线连接单片机的编程方法。

I2C总线

I2C总线(Inter Integrated Circuit内部集成电路总线)是两线式串行总线,仅需要时钟和数据两根线就可以进行数据传输,仅需要占用微处理器的2个IO引脚,使用时十分方便。I2C总线还可以在同一总线上挂多个器件,每个器件可以有自己的器件地址,读写操作时需要先发送器件地址,该地址的器件得到确认后便执行相应的操作,而在同一总线上的其它器件不做响应,称之为器件寻址,这个原理就像我们打电话的原理相当。I2C总线产生80年代,由PHLIPS公司开发,早期多用于音频和视频设备,如今I2C总线的器件和设备已多不胜数。最常见的采用I2C总线的EEPROM也已被广泛使用于各种家电、工业及通信设备中,主要用于保存设备所需要的配置数据、采集数据及程序等。生产I2C总线EEPROM的厂商很多,如ATMEL、Microchip公司,它们都是以24来开头命名芯片型号,最常用就是24C系列。24C系列从24C01到24C512,C后面的数字代表该型号的芯片有多少K的存储位。如ATMEL的24C64,存储位是64K位,也就是说可以存储8K(8192)字节,它支持1.8V到5V电源,可以擦写1百万次,数据可以保持100年,使用5V电源时时钟可以达到400KHz,并且有多种封装可供选择。我们可以很容易的在身边的电器设备中发现它们的身影,如电视中用于保存频道信息,电脑内存条中保存内存大小等相关信息,汽车里用于保存里程信息等等。图一就是ATMEL24C64芯片的PID封装和用于内存条SPD(Serial Presence Detect)上的24芯片。

图一

图二

图二是ATMEL公司24C64的引脚定义图。A0-A2用于设置芯片的器件地址,在同一总线上有多个器件时,可以通过设置A0-A2引脚来确定器件地址。SDA是串行数据引脚,用于在芯片读写时输入或输出数据、地址等,这个引脚是双向引脚,它是漏极开路的,使用时需要加上一个上拉电阻。SLC脚是器件的串行同步时钟信号,如果器件是使用在单片机系统中,那么SLC脚应该由单片机控制,根据单片机的程序要求产生串行同步时钟信号,控制总线的存取。WP脚是写保护脚,当这个脚接入高电平时,芯片的芯片数据均处于禁止写入状态(所禁止的地址段要看各芯片的详细资料),当把WP脚接到地线时,芯片处于正常的读写状态。当一个电路要求正常使用时是不允许程序修改EEPROM中的数据,只有在维护设置才可以修改数据,这时可以在电路上设置WP跳线或用微处理器对WP进行控制,这样只有在特定的电路状态下才可以更改到数据。

要在单片机系统中应用I2C总线的EEPROM做存储设备时,先要了解I2C总线的基本驱动方法。在I2C总线空闲时,SDA和SCL应为高电平,也只有在这个条件下,微处理器才可以控制总线进行传输数据。在数据传输的刚开始时,总线要求有一个START(开始位)位做为数据开始的标识,它的要求是SCL为高时,SDA有一个从高到低的电平跳变动作,完成这个动作后才可以进行数据传输,时序图参看图三‘开始’。传输数据时,只有在SCL为高电平时,SDA上的电平为有效数据。编写单片机向总线送数据程序时则可以在SCL还在低电平时,把数据电平送到SDA,然后拉高SCL,这时SDA不应有电平跳变,延时后拉低SCL,再进行下一位的数据传送直到完成。在总线上读数据时也是只有在SCL为高时,SDA为有效数据。时序参看图三‘保持’。传送数据完成后,总线要有一个STOP(结束位)位,来通知总线本次传输已结束,它的要求是SCL为高时,SDA有一个从低到高的电平跳变动作,正好和START位相反。在编程时要注意的是:不要在SCL为高时改变SDA的电平状态,否则可能会被误认为是停止位,而使得操作失败。

图三

I2C总线在每接收完一个字节(8个二进制位)后,在第九个时钟信号时,会在SDA上回应一个低电平的ACK应答信号,以此表明当前受控的器件已接收完一个字节,可以开始下一个字节的传送了。时序图可以参看图四。单片机编程时可以在传送完一个字节后,把连接SDA的IO口线设置回读数据状态,如使用51系列的单片机时就要把IO口置高电平。然后在SCL操作一个脉冲,在SCL为高时读取SDA,如不为低电平就说明器件状态不空闲或出错。需要注意因为SDA是双向的IO,无论是微处理器接收还是器件接收,每个字节完成后,接收方都可以发送一个ACK回应给发送方。

图四

I2C总线在操作受控器件时,需要先发送受控器件的器件地址,24系列的EEPROM也不例外,在每次命令前需要先发送一个字节的器件地址和读写标识,也可称为器件录址。图五是24C64的器件寻址命令中每个位所代表的意思。A2、A1、A0位是器件地址,它是对应于芯片的A2、A1、A0引脚,也就是说如果芯片A0引脚被设置成高电平时,在发送器件地址命令时字节中的A0位要设置为1,A0引脚为低电平时A0位设置为0。这样不难看出在同一总线可以挂8个24C64。ATMEL公司的24C系列芯片24C32及以上的型号使用16位地址进行寻址。24C32之前的型号因为使用的是8位地址,所以在超过256字节的8位地址型号中会占用到A0、A1、A2位的来做页地址,每页有256字节,以此解决地址位不足的问题。所以不同的型号器件地址位定义就有所不同,各型号的器件地址字节定义如图五至图七。要注意的是24C01是没有器件地址的,还有24C16/16A的A0-A2已被页地址占用完,也就是说这三个型号的芯片只能在同一总线上挂一个,所以在设计电路选择器件时要注意这个问题。器件地址字节中的R/W位是用于标识当前操作是读器件还是写器件,写器件时R/W位设置0,读器件时R/W位设置1。

图五

图六

图七

24C系列芯片的读写指令格式只有几种,下面以24C64芯片的指令格式来说明。

写入单个字节

写入字节指令每次只能向芯片中的一个地址写入一个字节的数据。首先发送开始位来通知芯片开始进行指令传输,然后传送设置好的器件地址字节,R/W位应置0,接着是分开传送十六位地址的高低字节,再传送要写入的数据,最后发送停止位表示本次指令结束。图八是写入单个字节的时序图。

图八

页写入

24C64支持32字节的页写入模式,它的操作基本和字节写入模式一样,不同的是它需要发送第一个字节的地址,然后一次性发送32字节的写入数据后,再发送停止位。写入过程中其余的地址增量自己由芯片内部完成。图九页写入的时序图。无论那种写入方式,指令发送完成后,芯片内部开始写入,这时SDA会被芯片拉高,直到写入完成后SDA才会重新变的有效,在编写微处理器程序时可以在写入的时候不停发送伪指令并查询是否有ACK返回,如果有ACK返回则可以进行下一步操作。

图九

 

读当前地址

这种读取模式是读取当前芯片内部的地址指针指向的数据。每次读写操作后,芯片会把最后一次操作过的地址作为当前的地址。在这里要注意的是在微处理器接收完芯片传送的数据后不必发送给低电平的ACK给芯片,直接拉高SDA等待一个时钟后发送停止位。图十是读当前地址时序图。

图十

 

读任意地址

“读当前地址”可以说是读的基本指令,读任意地址时只是在这个基本指令之前加一个‘伪操作’,这个伪操作传送一个写指令,但这个写指令在地址传送完成后就要结束,这时芯片内部的地址指针指到这个地址上,再用读当前地址指令就可以读出该地址的数据。图十一是读任意地址的时序图。

图十一

连续读取

连续读取操作时只要在上面二种读取方式中芯片传送完读取数据后,微处理器回应给芯片一个低电平的ACK应答,那么芯片地址指针自动加一并传送数据,直到微处理器不回应并停止操作。图十二是连续读取的时序图。

图十二

ATMEL公司的24C系列的其它型号的读写操作方式基本和上面介绍的相同,只是在8位寻址的芯片中地址位只用一个字节,还有就是在24C01中没有器件地址,地址位只占用高7位,最低位为R/W位.。其它公司的24系列的EEPROM芯片的驱动方式也基本和以上所介绍的一样。

图十三是笔者设计的制作简单的24C读写器。可以用它来做24C芯片的驱动程序编写实验,也可以配合上位机程序做24C的读写器使用。上位机程序及相关内容向笔者发送电邮索要pnzwzw@163.com。电路是由一片AT89C2051芯片做为主控芯片,作用是用于连接电脑的RS232和驱动24C芯片,晶振使用11.0592M。RS232电平转换是使用二个PNP三极管组成。电源部分则直接在RS232上的4、7引脚取电,取电时需要在用软件控制这两脚为+9V至+12V之间,再通过D5稳压得到5.1V,无需外加电源。24C64的SCL和SDA连接到P1.2/P1.3脚,因这两个IO脚内部有上拉,所以无需外接上拉电阻。

图十三

本文附带一份用C语言编写的实验源程序和编译好的HEX文件,把HEX烧入到AT89C2051就可以开始实验了。实验程序是可以读写24C32/64/128/256/512的任意地址,程序使用模块化函数设计,读者朋友可以方便的加入到自己的程序中。实验时可以用串口调试软件。单片机程序设计了简单的通讯协议,使用57600比特率,通讯协议的数据包是这样定义的:每个包有4个字节,命令字、地址高位、地址低位、数据。读取时命令字为00H,数据字节不可以用,返回读出的数据。写入时命令字为01H,返回00H为成功,返回01H为失败。要在24C64的2F3H地址上写入数据05H,则要发送01 02 F3 05。

实验程序下载 —》 c1

连接好实验电路板,按图十四设置好串口,打开串口后可以看到板上的LED在闪烁。输入01 02 F3 05,发送后便可以把05写入到24C64的02F3H地址中,返回00为写入成功。

也可以用读命令看看是否05已写入,输入00 02 F3 00 发送后返回05,说明实验成功。

图十四

图十五

介绍几款适合爱好者的软件

如果您是个初学电子的学生,或是个入门级的电子爱好者,在开始学习使用电脑绘制电路图PCB时肯定对像PROTEL、POWERPCB这类软件感到上手比较难,或者您在为不想画正规的图纸而又想把您的电子作品分享给朋友们而发愁。还有的就是爱好者经常会使用到面包板、洞洞板来制作电子实验或作品,而在动手前很难得知元件及线路的布置状况,使得制作难度加大。下面介绍三款方便实用的绘图软件则可以帮助到我们解决这些问题,而且图纸十分直观,能反映出元件及布线的真实状况,使得在动手做实际电路之前就能先了解作品的最后形态,增加作品的成功性和分享度。

先来介绍Fritzing,这是一款完全免费的共享软件,支持简体中文,使用方便,功能强大,可以方便的画出实物连线画或原理图,而且有非常丰富的元件库,像arduino、xbee等成品模块都有,可自行定义面包板、洞洞板的尺寸规格,十分适合爱好者使用。可以直接上它的官方网站http://www.fritzing.org/进行下载。先来看一个arduino的实例图,是不是超直观真实呀。

图一 arduino实例图

 

那如何使用呢?下面以一个555时基电路的例子简单说明一下。首先在文件菜单里新建一个项目(图二),项目默认的电路板是使用面包板(图三),在这个例子里我们要使用的是洞洞板,所以需要先删除面包板(图四),在右侧的元件面板中的面包板视图中选洞洞板,并将其拖拉到左边的工作区域(图五),同时可以根据你实际的洞洞板大小进行尺寸设置,然后把工作区切换到原理图界面(图六),进行元件的添加。使用元件搜索功能,输入555,查找到555元件,拖放到工作界面,并在指示栏中修改参数,选项封装形式为DIP(图七)。添加别的元件后(图八),可以进行元件的布置,选中元件右击后有各种操作项,如旋转(图九),选择需要连接的元件引脚,进行连接,软件有自动连线功能十分方便(图十),按电路连接完,所有的元件后就可以得到一份绘制好的原理图了(图十一),最后可以把界面切换到面包板工作界面,这时元件及连线的实物图都有了,只需要布置和整理,就可以得到理想的效果图了(图十二)。

图二新建文件

图三新文件

图四删除

图五添加洞洞板

图六界面切换

图七添加元件

图八添加更多元件

图九旋转元件

图十连接元件

图十一原理图

图十二实物图

 

同样可以方便用于画洞洞板的软件还有Diy Layout Creator和LochMaster,Diy Layout Creato为免费软件,汉化版本可以到http://www.cdle.net/article-144-1.html下载,英文原版本可以到下载http://diy-layout-creator.en.malavida.com/,LochMaster试用版可以到http://www.abacom-online.de/uk/html/demoversionen.html下载,此连接也有别的相关软件下载,有兴趣的朋友也可以下载来试试。

图十三Diy Layout Creator

图十四LochMaster

 

Diy LayoutCreator 功能比Fritzing简单,适用于爱好者在制作小的电子制作时进行对电路元件的预先排放,避免了在制作时元件放置不当而增加了制作难度,也可以用于制作电路连接图或PCB图用于爱好者间的相互交流,但不适合于绘制电路原理图。目前的免费版本元件也比较少。下面我们来试用它画一个简单的LED连接电路。首先打开软件,按左边栏的快速任务栏中的新建项目,弹出项目选择框如图十五所示,有三种电路板形式可以选,设置大小和项目名称,然后就可以电路板上放置所需元件,在图十六中1处选项元件,在2的电路板需要的位置上放置元件,放置元件后可输入元件的参数,元件放置好后可以在图十七的1资源管理器上选择元件进行参数更改,也可以用2中的工具对元件进行移位、旋转等操作,全部无成后可以用3的渲染图片工具,可以得到如图十八的效果图,用于分享制作心得。

图十五新建项目

图十六 放置元件

图十七 修改

图十八 分享

 

LochMaster的功能及实用性我个人感觉都比以上介绍的好,不过是款收费软件,试用版本有限制,有需要的朋友可以上网找别的版本使用。在这里笔者只简单介绍下一些它的实用功能。图十九中的1是LochMaster软件是元件库,都是以实物形状为主,元件库分类比较丰富,每类元件也有多种实物封装,元件是尺寸比例和实物相当,使得绘制的制作图纸十分直观,出来的效果有如照片一般。图十九的2中的工具栏有多种绘制工具,可以绘制连线、焊点等。图中3所指的位置是视图切换工具,可以切换到实物图、顶面图、底面图等多种显示方式。图二十所示的是实物的顶面视图,元件和焊点都十分直观,在制作前先规划好元件位置和连线方式,这样就会使制作变得快捷,而且出错的机会也变少。图二十一是底面视图,有了这功能使这款软件更人性化了,这是众多同类软件所没有的。

图十九 黑白线图

图二十实物视图

图二十一 底面视图

RGB变色小灯

2020年春节前画了个STM8S001的小板。春节到来,病毒爆发,那也去不了,在家无聊用这个板做了一个灯玩。

外壳是3D打印,灯带是WS2812B的RGB灯带,用了10颗。功能简单,一个按钮换色,USB取电,能接到充电宝、充电器或电脑的USB端口。小米5200mA的充电器,能点差不多10小时吧。

所有零件
安装到3D打印的外壳里
接充电器
接电脑USB

视频