2 AT45DB161B串行存储器
ATMEL公司的Data-Flash产品的代表型号为AT45DBxxxx。此系列存储器容量较大(从1~256MB);封装尺寸小,最小封装型式(CBGA)的尺寸为6 mm×8 mm:可采用SPI接口进行读写;硬件连线少;内部页面尺寸较小,8 MB容量的页面尺寸为264字节,16 MB和32 MB容量的页面尺寸为512字节,64 MB容量的页面尺寸为1056字节,128 MB容量和256 MB容量的页面尺寸为2112字节。另外,AT45DBxxxx系列存储器内部有两个与主存页面大小相同的SRAM缓存,可提高系统的灵活性,简化数据的读写过程。AT45DBxxxx系列存储器的工作电压只需2.7~3.6 V;整个芯片的功耗也较小;典型读取电流为4 mA,待机电流仅为2 μA:读写的速度最大为20 Mbps。
AT45DB161B的容量为16 MB。分成4096页,每页有528个字节[3]。另外还有两个528字节的数据缓冲器SRAM。在对主存储器进行操作时,这两个SRAM也可以接收数据。因此,和串行EEP-ROM相比。该器件可大大缩短读写时间。而采用SPI总线接口和并行的flash相比.其速度并不慢,而且抗干扰能力也比较强。
2.1 AT45DB161B引脚接口定义
表1所列是AT45DB161B的部分接口引脚定义。其中CS为片选信号,RESET为复位端,SCK、SI、SO为SPI总线,RDY/BUSY为忙信号,WP为前256页的写保护。
SPI接口是一种通用串行接口总线,利用SCK、SI和SO三根线可进行数据的读/写控制。数据以字节(8 bit)为单位。其中,SCK为时钟信号,SI和SO为数据输人和输出线。
AT45DB161B仅支持SPI模式0和3。在这两种模式下。SCK信号的上升沿触发数据输入,下降沿触发数据输出,二者的区别是SCK的起始电平不同。AT45DB161B复位时,默认为SPI模式3。
2.2 指令
除了存储单元外,AT45DB161B内部还包括命令用户接口CUI(Command User Interface)和状态机。CUI接收用户的软件指令,以将其翻译成状态机内部操作码并进行命令的有效性检验。状态机则可控制存储器所有的内部操作。器件内部包含一个8位的状态寄存器,可用来指示设备的操作状态。向存储器输入读状态寄存器命令可将状态寄存器的数据读出。下面简单介绍模式SPI0和模式SPI3的读写存储单元和状态寄存器指令。 (1)读状态寄存器
发送命令字0XD7。可以直接得到状态字(一个字节),其格式如下:
其中RDY/BUSY为1时表示不忙,可以接收下一条指令;为0则表示忙。
设计时可通过读状态寄存器或SO端口来判断前一条指令是否读写完毕。当存储器不忙时,SO端口从O变到1。此外,RDY/BUSY端口也可以用来判断前一条指令是否读写完毕。
COMP用来指示主存储单元数据和缓冲器中数据的比较结果:COMP为0表示相等。COMP为1表示不同。
Bit5一Bit2可表示存储器的容量大小。
(2)读存储器指令
读存储器的数据有两种方式,具体如图1所示。其中一种是直接读存储器任意地址的数据,这可用指令D2H加3个字节的Dataflash地址再加上四个字节的空数据来实现,以SPI模式3为例,其工作时序如图2所示。
另一种是通过缓冲器1(2)来读存储器上某一页的数据。该方式可分两个步骤:一是将数据读到数据缓冲器1(2),即指令53H(55H)+3个字节的Dataflash中的页地址(在任意SCK的模式下);二是读数据缓冲器1(2),这可用指令D4H(D6H)+3个字节地址(主要表示从数据缓冲器的哪个地址开
始读)+1个字节空数据来实现。以SPI模式3为例的读数据缓冲器时序如图3所示。
(3)向存储器写数据
写存储器也有两种模式,具体如图4所示。其中一种是通过缓冲器1(2)直接写到存储器中;另一种是先写到缓冲器,再将缓冲器的数据写到存储器中。具体的命令过程如图5所示。
上述几个命令的格式都是一个字节的命令+3个字节的地址。
3 W77E58和AT45DB161B的接口电路
W77E58是华邦电子公司(WinBond)推出的高速增强型:MCS-51系列单片机。使用W77E58的系统速度要比传统51系列单片机快2.5倍。工作频率为40 MHz的W77E58相当于100 MHz的8051,加上其内置32 KB可重复编程的Flash EPROM和1KB用MOV指令访问的内部SRAM(节省了16条数据/地址I/O口线),以及2个增强型全双工串行口和较低的价格,W77E58无疑是一款高性能、多功能、的高集成度8位微控制器,非常适合高速、双串口、外围简捷、低成本系统。其抗干扰性能和加密性能相对也是比较好的[4]。
采用W77E58和AT45DB161B进行接口的汽车行驶记录仪的电路连接如图6所示。
4 软件实现
由于W77E58没有SPI总线,因而需要用软件来实现,下面给出SPI总线模拟程序和对AT45DB161B的读写程序。
该软件采用Keil C编程,其源程序代码如下:
4.1 SPI总线的模拟
(1)从SPI上读一个字节
4.2 对AT45DB161B的读写
(2)写Datanash中的数据
下面的程序采用先写到缓冲器,再将缓冲器的数据写到存储器中的方式存储数据: