可USB校时的时钟

有几块以前用剩下的时钟PCB,想把它做起来,放到桌面上看时间用。RTC芯片用的是DS1302,晶振使用32.768kHZ,因为晶振误差等原因,走时会有比较大的误差,所以修改一下程序,加上个USB转串,USB连接到工作电脑上,可以方便校对时间。

焊好的电路板 3D打印外壳

加入USB转串模块

编写个校时程序

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

SPI总线

SPI总线(Serial Peripheral Interface串行外围设备接口总线)是三线式的串行总线,是由摩托罗拉公司所研发,使用三线进行数据传输,分别是SCK时钟引脚,SI数据输入引脚和SO数据输出引脚,另外还有CS片选引脚可以对同一总线上的芯片进行选通使用,SPI总线已被广泛使用在EEPROM、单片机和各种设备中。常用串行EEPROM中的25XX系列芯片就是使用兼容SPI总线结构,采用先进COMS技术,体积小,是一种理想的低功耗非易失性存储器,广泛使用在各种家电、通讯、交通或工业设备中,通常是用于保存设备或个人的相关设置数据。ATMEL公司生产的25系列的EEPROM存储容量从1K位到256K位。其它一些芯片也会用到SPI总线,如常用的CPU监控芯片X5043、X5045就带有512字节的SPI界面EEPROM,常用于单片机系统的看门狗电路,同时也可以提供小数据量的存储,给电路设计带来很多的方便。此文将用X5045为例讲述SPI的编程应用和X5045的一些其它功能。X5045由Xicor公司出品,电压范围有2.7V到5.5V和4.5V到5.5V二个版本,擦写次数可达一百万次,最高时钟频率可达3.3MHz。图一是X5045的PID封装实物图。

图一

图二

图二是X5045的引脚定义图。CS/WDI是片选和看门狗复位输入,当CS为高时SO引脚变为高阻态,这时可以允许其它器件共用SPI总线,同时芯片也处于休眠状态,当CS为低时芯片被选中,并从休眠状态中唤醒,可以进行读写操作。SO是串行数据输出,在读芯片时数据从此脚输出。WP是写保护引脚,当WP为低时芯片写保护,不能对芯片写操作,但其它功能不受影响。Vss是电源地。SI是串行数据输入,接收来自控制器的数据和地址。SCK是串行时钟输入,RESET是复位输出,Vcc是电源。在25芯片中还有一个HOLD引脚,此引脚的功能是保持输入脚,ATMEL公司生产25芯片的HOLD引脚是低电平有效。不用此功能时,HOLD引脚要保持高电平。在芯片正在串行传输时,将HOLD拉为低电平,可以暂停进一步的传送,具体方法是SCK变低后,将HOLD也拉低,不然在下一个SCK变低前不能暂停传送,要恢复串行传送,必须在SCK为低电平时将HOLD拉高。芯片处于暂停时,SI,SO,SCK脚为高阻状态,任何时刻只要HOLD被拉低时,SO都会处于高阻状态。

限于文章的篇幅,下面内容只着重介绍X5045芯片的SPI总线对EEPROM单元的编程应用。在X5040芯片中有6个指令,它和25系列芯片的指令是兼容的,也就是说在25系列芯片中使用时基本上是不需要改变的,具体见表一。

 

指 令 指令格式 说 明
WREN 0000 0110 写入允许
WRDI 0000 0100 写入禁止
RSDR 0000 0101 读状态寄存器
WRSR 0000 0001 写状态寄存器,用于操作区块写保护标识和看门狗标识
READ 0000 A8011 读数据
WRITE 0000 A8010 写数据

注:A8用于数据地址的第9位。

表一 指令集

写入允许和禁止
X5045芯片内部有一个写入使能寄存器,在需要向芯片写入数据时,需要先用WREN指令使片内写入使能寄存器先置位,写入数据后可以用WRDI指令使寄存器复位到禁止状态。当上电、WRSR指令执行、WRITE指令执行、WP拉低也会使写入使能寄存器复位到禁止状态。图三是WREN/WRDI指令的操作时序图。首先要把CS拉低,输入数据,向SCK输入时钟信号,数据在时钟的上升沿有效,时钟上升后至少数据至少保持30ns。数据是串行的,所以在每个时钟周期的上升沿发送一个位。在操作这两个指令时,SO是处于高阻状态的。

图三 写入使能时序

 

读写状态寄存器

X5045片内有一个状态寄存器,用于指于芯片的状态和设置,可以读写,芯片出厂时状态寄存器值为30H。具体每位的功能请看表2。WIP写入保护位,是只读位,指示芯片是否正忙于写入操作。当WIP为“1”时,说明写入正在进行,为“0”时表示没有进行写入。在编程时,写入数据操作后,可以查询WIP位,当WIP为0后才进行下一次的写入操作,这样可以避免写入出错。WEL写入使能状态位,是只读位。WEL位的状态由WREN和WRDI指令确定,WREN成功执行后WEL为“1”指示允许写入数据,WRDI指令成功执行后WEL为“0”指示禁止写入数据。在编程时可以先查询WEL位的状态,如为0时则要执行WREN后才可以进行写入操作。BL0、BL1设置当前保护的区块地址,是可读写位,这两个位的设置和区块地址的关系如表3,区块的内容被保护后,就只能读出而不能写入了。25系列芯片中不同型号的芯片容量不一样,BL设置所保护的范围也不一样。WD1、WD0看门狗设置位是X5045/43特有的设置位,是可以读写位,在25系列芯片中这两个位是保留位,在X5045中有看门狗功能,这两个位就用于设置MCU喂狗的时间,表4是看门狗位的设置时间。状态寄存器的第6和第7位是保留位。读状态寄存器时,发送完RSDR指令后,SO由高阻态转为输出数据,从数据位的高位开始。写状态寄存器,发送完WSDR指令后,再发一个字节的状态数据就可以了,其中只读位可以是“1”也可以是“0”,它们不会被WSDR指令所更改。图5、图6是读写状态寄存器的时序图。

 

7 6 5 4 3 2 1 0
0 0 WD1 WD0 BL1 BL0 WEL WIP
0 0 看门狗位1 看门狗位0 区块保护1 区块保护0 写入使能状态位 写入保护位

表2 状态寄存器定义

BL1 BL0 保护地址范围
0 0 无保护
0 1 180H-1FFH
1 0 100H-1FFH
1 1 000H-1FFH

表3 BL设置位

 

WD1 WD0 喂狗时间
0 0 1.4秒
0 1 600毫秒
1 0 200毫秒
1 1 功能禁用(出厂设置)

表4 看门狗设置位

图四 读状态寄存器时序

图五 写状态寄存器时序

读数据

图六是读数据时的时序,先拉低CS选中芯片,先要把需读取的地址的第9位加到指令字节的第4个字节中,发送完指令字节就发送地址字节的前8位,这时SO就会由高阻态转为输出数据。每当一个字节的数据传送完毕后,芯片内部的地址指针自动加1,指向下一个数据地址,这时如仍有时钟脉冲时,数据会被继续输出,CS脚拉高后输出才会终止。当最高位地址的数据被读出后,地址指针指向00H。

图六 读数据时序

写数据

在向芯片写入数据之前,写使能寄存器必须处于置位状态,一般可以不必查询写使能寄存器的状态,而直接用WREN置位写使能寄存器。在发送完WREN指令后,必须把CS拉高,在CS拉高之前写使能寄存器并没有置位,这时向芯片传送数据是不会被写入的。写使能寄存器置位后,再将CS拉低,把需读取的地址的第9位加到指令字节的第4个字节中,发送完指令字节就发送地址字节的前8位,然后发送需写入的数据。WRITE指令可以连续写入16个字节,但这16个字节的地址必须在同一页中。每一页的地址由[xxxxx0000]开始,到[xxxxx1111]结束。操作方法就是在发送完每一个地址和数据后,继续发后面的数据,芯片内部的地址指针会自动累加,当达到页中最后一个字节时,时钟仍在继续,则内部地址指针回到页中第一个地址重新开始累加,并覆盖以前写入的数据。要注意的是,在操作过程中CS不能拉高,只有在数据字节的最后一个位传送完成后才可以拉高CS,不然写入操作将不完全。在写入数据或写状态寄存器指令写送后,芯片会进入一次非易失性写操作,这会花费一定的时间,最大约为10ms,在这个时间内可以用读状态寄存器,并检查WIP位,当WIP为1时则说明写入还在进行中,只有当WIP位为0时才可以进行下一次的读写数据操作,否则将会使写入不完全。

图七 写数据时序

下面我们用AT89C2051和X5045为主做一个密码控制器实验。使用X5045的看门狗功能可以使电路在受到干扰或特殊情况死机后,可以自动复位重启电路,使电路保持正常工作。使用X5045的数据读写功能,可以保存密码,也可以修改密码。本文附带的实例程序演示X5045的状态寄存器的读写、存储位的读写,里面的功能函数可以直接移植到别的程序中。电路上电后,红色LED亮,当按下按键时绿色LED闪亮一下,当按下“3,1,5,8,1,8”,密码正确,红色LED灭,绿色LED亮,继电器打开,10秒后回到上电时的状态。当按下第一次按键后20秒内没有按下正确的键值,则会进行下一次键值输入。程序可以方便修改成可以方便更改密码的程序,也可以加入记录工作次数的程序等等,升级成更实用的程序。图9是笔者用万用板搭建成的实验电路。在上一篇提供的EEPROM读写器电路及程序也支持25系列芯片和X5043/45芯片,可以直接使用它来读写。

X5045演示程序下载–》c3

图八 电路图

图九 制作实验

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

Microwire总线

Microwire总线是美国国家半导体公司研发的一种简单的串行通讯接口协议,该总线是采用三线进行数据传输。Microwire总线和SPI总线一样数据输入输出分别使用一根引线,同样可以提供同步数据传输方式,可以适用在多种微控制器、EEPROM或ADC等场合。常用EEPROM的93系列芯片就是采用该总线的芯片,采用COMS技术,体积小巧,和24、25系列芯片一样也是一种理想的低功耗非易失性存储器。常见的93系列EEPROM存储器容量从256位到16K位。93芯片广泛使用在各种家电、通讯、交通或工业设备中,通常是用于保存设备或个人的相关设置数据。如最常见到网卡上的93芯片就是用于保存网卡的MAC物理地址、供应商名称以及相关配置。生产93系列芯片的公司也有很多。如ATMEL公司生产的93C46芯片是该公司生产的93系列芯片的一种,它有1K位的存储空间,93系列有二种数据输入输出模式,分别为8位和16位数据模式,1K位的存储位就可以分为128×8和64×16,它的电压范围是2.7V到5.5V和1.8V到5.5V,可以适应低电压的应用,在5V的电压下最高时钟频率可以达到2M,芯片可以进行一百万次的擦写,数据可以保存一百年。图一是93C46的PID封装和用于网卡的93LC46芯片。

图一

图二

图二是ATMEL公司的93C46的PID封装引脚图。CS引脚为片选引脚,高电平为有效,用于同一总线上不同芯片的选择。在执行每一个指令之前先要把CS拉高,指令完成后把CS拉低使芯片进入复位休眠状态,CS为低时,芯片保持复位状态。在连续操作多个指令时,指令与指令间,CS必须要有不小于一个TCS时间的低电平保持,使芯片复位。ATMEL公司的93C46芯片工作电压2.7V-5.5V的型号TCS不能小于250ns,工作电压1.8V-5.5V的型号TCS不能小于1000ns。SK是串行时钟输入引脚。DI是串行数据输入引脚,接收微控制器传向芯片的数据、地址和命令数据。DO是串行数据输出引脚。ORG引脚是内部数据结构选择输入引脚,该脚为高电平时数据结构为×16,低电平时数据结构为×8,DC是空脚。

图三

图三是93C46芯片的MicroWire总线时序图。在编写驱动程序前,先要分析一下这个时序图。从图中可以看到,在CS被拉高至少tCSS时间(CS初始时间)后,才能开始在SK上传送时钟信号,时钟的正半周和负半周时间不能小于tSKH和tSKL。最后一个时钟的正半周发送完后CS仍要保持tCSH时间(CS保持时间)后才可以拉低CS,tCSH的最小值可为0。指令输入时数据在SK的负半周低电平时开始设置,图中的tDIS(DI设置时间),在SK的高电平时至少保持tDIH时间(DI保持时间)。在图中第四条时序线图中则可以看到在芯片读操作时DO输入1或0时的时序,可以看出在SK上升沿开始后tPD0或tPD1时,DO才输出数据,在编写驱动时就要注意读DO时可在SK拉高好延时tPD0(tPD1)后才读取DO的值,否则会造成误读。第五条时序线图则时指芯片编程时在CS上升沿开始tSV时间后DO输出状态值,tDF是指CS下降沿开始到tDF时间后才进入高阻态。因为不同的芯片型号、工作电压和工作频率这么参数值都会有所不同,93C46的具体参数可以参看光盘中的芯片资料。

93C46有7个操作指令,微处理器就是靠发送这几个指令来实现芯片的读写等功能。表一是93C46的指令表。在93C的其它型号中指令基本是一样,所不同的是地址位的长度,在使用时要查看相关芯片资料,得知地址位长度后再编写驱动程序。因为93C的数据结构有两种,所以地址位和数据位会有x8\x16两种模式,这在编程时也是要注意的。在ERASE、WRITE、ERAL、WRAL指令之前必须先发送EWEN指令,使芯片进入编程状态,在编程结束后发EWDS指令结束编程状态。

指令 起始位 命令代码 地址位 数据位 说明
x8 x16 x8 x16
READ 1 10 A6-A0 A5-A0     读取指定地址数据
EWEN 1 00 11xxxxx 11xxxx     擦写使能
ERASE 1 11 A6-A0 A5-A0     擦除指定地址数据
WRITE 1 01 A6-A0 A5-A0 D7-D0 D15-D0 把数据写到指定地址
ERAL 1 00 10xxxxx 10xxxx     擦除所有数据,只在Vcc为4.5V-5.5V有效
WRAL 1 00 01xxxxx 01xxxx D7-D0 D15-D0 写指定数据到所有地址,只在Vcc为4.5V-5.5V有效
EWDS 1 00 00xxxxx 00xxxx     擦写禁止

表一

READ(读数据)

所有的指令的第一位为START(起始位),芯片确认起始位的条件是:CS和DI为高电平时,SK的第一个脉冲高电平时DI仍为高电平。微控制器发送完起始位后就可以输入7种指令所需的命令代码、地址码和数据来完成指令操作。READ指令在发送完地址码AN-A0后(地址码位数位要根据型号和所选用的数据结构来确定),DO从高阻态变为低电平,在随后的一个SK脉冲后在DO输出DN-DO的数据(数据位数由所选用的数据结构来确定),微控制器在这时读取DO取得数据,读取完数据后拉低CS结束指令。

图四

EWEN(擦写使能)

芯片上电后就进入EWDS擦写禁止状态,这时要进行擦写指令,微控制器必须先要发送EWEN指令,使能芯片进入允许擦写的状态,否则操作任何擦写指令都是无效的。在完成擦写操作后发送EWDS指令,使芯片进入禁止擦写的状态,这样可以防止因干扰或其它原因造成的数据错误。要注意的是:在第一个EWEN指令后芯片一直保持在擦写允许状态,直到使用EWDS或开断电源,芯片才会重新进入擦写禁止状态。

图五

EWDS(编程禁止)

图六

WRITE(写入数据)

WRITE指令在发送完数据位后,CS至少拉低tCS时间再拉高,这时DO会从高阻态变为低电平来指示芯片正在进行编程,微控制器应在这时检测DO,当DO再次拉高时芯片编程完成芯片进行就绪状态,这时才可以进行下一个指令。芯片编程所需的时间为tWP,这个时间最大为10MS,所以微控制器在对芯片编程时最好用一个循环检测DO,当检测到高电平时,说明写入过程结束,应该退出循环体。如果循环体循环10MS后仍然没有检测到高电平时,说明有故障引起操作超时,这时要退出循环体,以免进入死循环。这样的代码在前面文章的例子中也是有使用的。WRAL指令和WRITE指令对写入过程的处理方式是一样的,不一样的是WRAL是把数据写入到所有地址中,时间会长点,而且要求电源在4.5-5.5V。

图七

WRAL(全部写入)

图八

ERASE(擦除数据)

ERASE指令可以说是另一种形式的写入指令,所不同的是它不用发送数据,它会把指定地址的所有数据位都置‘1’,也就是相当于用WRITE写入‘FF’。而ERAL指令就是相当于用WRAL写入‘FF’,同样ERAL也需要工作在4.5-5.5V电源下。

图九

ERAL(擦除所有数据)

图十

在这里笔者把上一篇文章的电路更改了一下,使它不但能完成本篇的实验外,还能配合笔者编写的上位机程序,成为一个简单实用的串行EEPROM读写器,它不单单可以支持93C系列的芯片,同时也可以支持24C、25系列等多种芯片。图中的芯片插座IC2的1到7脚连接取AT89C2051的P1.1至P1.7,因为P1.2-P1.7内部是有上位的,所以可以不用在外部加上拉电阻,而P1.0/P1.1是需要外部上拉的,所以在P1.1上加R7进行上拉。如不加这个电阻的话93C46的读写实验就无法成功了。J1使用DB9的孔式接头,连接电脑时可以使用一根串口延长线。图12是笔者用万用电路板制作的实验电路,这个电路最大的特点就制作简单、体积小巧、无需外接电源,使用到单片机使其性能稳定,而且可以进行程序的修改使其增加更多的芯片支持。图十二是笔者用万用板制作的实验电路。

图十一

图十二

对93C46的串口通讯实验方法和上一篇文章的方法是一样的,这里不再多做介绍了,只是93C46多了一个擦除命令的实验,命令代码是02 00 00 00,发送这个代码后擦除成功后就返回00,不成功返回01。要注意的是擦除命令只在VCC在4.5-5.5V有效。

作者编写的上位机程序软件界面如图十三,使用此程序就可以用这个电路读写24C、93C、25系列的串行EEPROM芯片。首先要把EEPROM.hex文件烧写到AT89C2051中,连接PC串口就可以使用EEPROM.exe软件进行读写了。

示例程序以及烧写器的HEX和上位程序下载 -》hex

图十三